ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI3YWEwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9jYXJib24KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iSlJFX1NSQyIga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY2FyYm9uIj4KLQkgICAgPGF0dHJpYnV0ZXM+Ci0JCQk8YXR0cmlidXRlIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmNhcmJvbiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEwMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2d0aworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJndGsiPgotCSAgICA8YXR0cmlidXRlcz4KLQkJCTxhdHRyaWJ1dGUgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZ3RrL29zL2xpbnV4L3g4NiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfbW90aWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNWZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHNvdXJjZXBhdGg9IkpSRV9TUkMiIGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vdGlmIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfd2luMzIgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4MTU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3aW4zMiI+Ci0JICAgIDxhdHRyaWJ1dGVzPgotCQkJPGF0dHJpYnV0ZSB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC53aW4zMi9vcy93aW4zMi94ODYiIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX0FUVFJfTElCUkFSWV9QQVRIX0VOVFJZIi8+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5zd3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMTEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi0uY2xhc3NwYXRoCi13cwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uuc3d0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS5jdnNuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhMzM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOyBzaW5nbGV0b249dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiAkd3MkL29wZW5nbC5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUHJvdmlkZS1QYWNrYWdlOiAKLSAgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYxMmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImFnbF9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiYWdsX3N0YXRzLmgiCi0KLSNkZWZpbmUgQUdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfY2FyYm9uX0FHTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19hZ2xDaG9vc2VQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWFnbENob29zZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsQ3JlYXRlQ29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENyZWF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xDcmVhdGVDb250ZXh0KGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsRGVzY3JpYmVQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsRGVzY3JpYmVQaXhlbEZvcm1hdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXN0cm95Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95UGl4ZWxGb3JtYXQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95UGl4ZWxGb3JtYXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXRfRlVOQyk7Ci0JYWdsRGVzdHJveVBpeGVsRm9ybWF0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbEVuYWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xFbmFibGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xFbmFibGVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pYWdsRW5hYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbEVuYWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJjID0gKGppbnQpYWdsR2V0Q3VycmVudENvbnRleHQoKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldERyYXdhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsR2V0RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xHZXREcmF3YWJsZShhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXREcmF3YWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRDdXJyZW50Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRDdXJyZW50Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXREcmF3YWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWFnbFNldERyYXdhYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbFNldEludGVnZXJfX0lJSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRJbnRlZ2VyKGFyZzAsIGFyZzEsIGFyZzIpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRJbnRlZ2VyX19JSV8zSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSV8zSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGpib29sZWFuKWFnbFNldEludGVnZXIoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzIgJiYgbHBhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTd2FwQnVmZmVycwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci0JYWdsU3dhcEJ1ZmZlcnMoYXJnMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xVcGRhdGVDb250ZXh0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFVwZGF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsVXBkYXRlQ29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xVcGRhdGVDb250ZXh0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFVwZGF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4N2Q0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjAxNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJhZ2xfc3RhdHMuaCIKLQotI2lmZGVmIE5BVElWRV9TVEFUUwotCi1pbnQgQUdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAxNDsKLWludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMTRdOwotY2hhciAqIEFHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImFnbENob29zZVBpeGVsRm9ybWF0IiwKLQkiYWdsQ3JlYXRlQ29udGV4dCIsCi0JImFnbERlc2NyaWJlUGl4ZWxGb3JtYXQiLAotCSJhZ2xEZXN0cm95Q29udGV4dCIsCi0JImFnbERlc3Ryb3lQaXhlbEZvcm1hdCIsCi0JImFnbEVuYWJsZSIsCi0JImFnbEdldEN1cnJlbnRDb250ZXh0IiwKLQkiYWdsR2V0RHJhd2FibGUiLAotCSJhZ2xTZXRDdXJyZW50Q29udGV4dCIsCi0JImFnbFNldERyYXdhYmxlIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlJIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlfM0kiLAotCSJhZ2xTd2FwQnVmZmVycyIsCi0JImFnbFVwZGF0ZUNvbnRleHQiLAotfTsKLQotI2RlZmluZSBTVEFUU19OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3RfdG9vbHNfaW50ZXJuYWxfTmF0aXZlU3RhdHNfIyNmdW5jCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEFHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBBR0xfbmF0aXZlRnVuY3Rpb25Db3VudDsKLX0KLQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBTVEFUU19OQVRJVkUoQUdMXzFHZXRGdW5jdGlvbk5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShBR0xfMUdldEZ1bmN0aW9uQ2FsbENvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuIEFHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtpbmRleF07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1OWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2xfc3RhdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEFHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgQUdMX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWFnbENob29zZVBpeGVsRm9ybWF0X0ZVTkMsCi0JYWdsQ3JlYXRlQ29udGV4dF9GVU5DLAotCWFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQywKLQlhZ2xEZXN0cm95Q29udGV4dF9GVU5DLAotCWFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DLAotCWFnbEVuYWJsZV9GVU5DLAotCWFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMsCi0JYWdsR2V0RHJhd2FibGVfRlVOQywKLQlhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DLAotCWFnbFNldERyYXdhYmxlX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlJX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlfM0lfRlVOQywKLQlhZ2xTd2FwQnVmZmVyc19GVU5DLAotCWFnbFVwZGF0ZUNvbnRleHRfRlVOQywKLX0gQUdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MzFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvY2FyYm9uL0FHTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEzMzllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5jYXJib247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBBR0wgewotCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLS8qIEF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9OT05FID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfU0laRSA9IDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfTEVWRUwgPSAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX1JHQkEgPSA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0RPVUJMRUJVRkZFUiA9IDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFUkVPID0gNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BVVhfQlVGRkVSUyA9IDc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfUkVEX1NJWkUgPSA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0dSRUVOX1NJWkUgPSA5OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0JMVUVfU0laRSA9IDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0FMUEhBX1NJWkUgPSAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9ERVBUSF9TSVpFID0gMTI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFTkNJTF9TSVpFID0gMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fUkVEX1NJWkUgPSAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BQ0NVTV9HUkVFTl9TSVpFID0gMTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQkxVRV9TSVpFID0gMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQUxQSEFfU0laRSA9IDE3OwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFX0JVRkZFUlNfQVJCID0gNTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFU19BUkIgPSA1NjsKLQotLyogSW50ZWdlciBwYXJhbWV0ZXJzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQlVGRkVSX1JFQ1QgPSAyMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1dBUF9JTlRFUlZBTCA9IDIyMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfTkFNRSA9IDIzMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9DTElQX1JFR0lPTiA9IDI1NDsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENob29zZVBpeGVsRm9ybWF0KGludCBnZGV2cywgaW50IG5kZXYsIGludFtdIGF0dHJpYnMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENyZWF0ZUNvbnRleHQoaW50IHBpeCwgaW50IHNoYXJlKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gYWdsRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgcGl4LCBpbnQgYXR0cmliLCBpbnRbXSB2YWx1ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbERlc3Ryb3lDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXQoaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbEVuYWJsZShpbnQgY3R4LCBpbnQgcG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgYWdsR2V0RHJhd2FibGUoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEN1cnJlbnRDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXREcmF3YWJsZShpbnQgY3R4LCBpbnQgZHJhdyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEludGVnZXIoaW50IGN0eCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXRJbnRlZ2VyKGludCBjdHgsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgYWdsU3dhcEJ1ZmZlcnMoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFVwZGF0ZUNvbnRleHQoaW50IGN0eCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmYzc3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuY2FyYm9uLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7CQotCWludCBjb250ZXh0OwotCWludCBwaXhlbEZvcm1hdDsKLQlzdGF0aWMgZmluYWwgaW50IE1BWF9BVFRSSUJVVEVTID0gMzI7Ci0KLS8qKgotICogQ3JlYXRlIGEgR0xDYW52YXMgd2lkZ2V0IHVzaW5nIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJlZCBpbiB0aGUgR0xEYXRhCi0gKiBvYmplY3QgcHJvdmlkZWQuCi0gKgotICogQHBhcmFtIHBhcmVudCBhIGNvbXBvc2l0ZSB3aWRnZXQKLSAqIEBwYXJhbSBzdHlsZSB0aGUgYml0d2lzZSBPUidpbmcgb2Ygd2lkZ2V0IHN0eWxlcwotICogQHBhcmFtIGRhdGEgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIG9mIHRoZSBHTENhbnZhcwotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiB0aGUgZGF0YSBpcyBudWxsCi0gKiAgICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIHdoZW4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBwcm92aWRlZDwvdWw+IAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLSAqIDx1bD48bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfQ1JFQVRFX09CSkVDVCB3aGVuIGZhaWxlZCB0byBjcmVhdGUgT0xFIE9iamVjdAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfT1BFTl9GSUxFIHdoZW4gZmFpbGVkIHRvIG9wZW4gZmlsZQotICogICAgIDxsaT5FUlJPUl9JTlRFUkZBQ0VfTk9UX0ZPVU5EIHdoZW4gdW5hYmxlIHRvIGNyZWF0ZSBjYWxsYmFja3MgZm9yIE9MRSBJbnRlcmZhY2VzCi0gKiAgICAgPGxpPkVSUk9SX0lOVkFMSURfQ0xBU1NJRAotICogPC91bD4KLSAqLwotcHVibGljIEdMQ2FudmFzIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIEdMRGF0YSBkYXRhKSB7Ci0Jc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCWlmIChkYXRhID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWludCBhZ2xBdHRyaWIgW10gPSBuZXcgaW50IFtNQVhfQVRUUklCVVRFU107Ci0JaW50IHBvcyA9IDA7Ci0JYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1JHQkE7Ci0JaWYgKGRhdGEuZG91YmxlQnVmZmVyKSBhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfRE9VQkxFQlVGRkVSOwotCWlmIChkYXRhLnN0ZXJlbykgYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURVJFTzsKLQlpZiAoZGF0YS5yZWRTaXplID4gMCkgewotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfUkVEX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5yZWRTaXplOwotCX0KLQlpZiAoZGF0YS5ncmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZ3JlZW5TaXplOwotCX0KLQlpZiAoZGF0YS5ibHVlU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0JMVUVfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hbHBoYVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BTFBIQV9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5kZXB0aFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9ERVBUSF9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZGVwdGhTaXplOwotCX0KLQlpZiAoZGF0YS5zdGVuY2lsU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURU5DSUxfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnN0ZW5jaWxTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bVJlZFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9SRURfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtUmVkU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1HcmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1HcmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQmx1ZVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUFscGhhU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUFscGhhU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuc2FtcGxlQnVmZmVycyA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NBTVBMRV9CVUZGRVJTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0JfQotCWlmIChkYXRhLnNhbXBsZXMgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9TQU1QTEVTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9OT05FOwotCXBpeGVsRm9ybWF0ID0gQUdMLmFnbENob29zZVBpeGVsRm9ybWF0ICgwLCAwLCBhZ2xBdHRyaWIpOwotLy8JY29udGV4dCA9IEFHTC5hZ2xDcmVhdGVDb250ZXh0IChwaXhlbEZvcm1hdCwgc2hhcmUgPT0gbnVsbCA/IDAgOiBzaGFyZS5jb250ZXh0KTsKLQljb250ZXh0ID0gQUdMLmFnbENyZWF0ZUNvbnRleHQgKHBpeGVsRm9ybWF0LCAwKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlBR0wuYWdsU2V0RHJhd2FibGUgKGNvbnRleHQsIHBvcnQpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQlBR0wuYWdsRGVzdHJveUNvbnRleHQgKGNvbnRleHQpOwotCQkJCUFHTC5hZ2xEZXN0cm95UGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCWNhc2UgU1dULkhpZGU6Ci0JCQljYXNlIFNXVC5TaG93OgotCQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXhCb3VuZHMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlhZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlNob3csIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgbGlzdGVuZXIpOwotCUNvbnRyb2wgYyA9IHRoaXM7Ci0JZG8gewotCQljLmFkZExpc3RlbmVyKFNXVC5TaG93LCBsaXN0ZW5lcik7Ci0JCWMuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGxpc3RlbmVyKTsKLQkJYyA9IGMuZ2V0UGFyZW50KCk7Ci0JfSB3aGlsZSAoYyAhPSBzaGVsbCk7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgZml4Qm91bmRzICgpIHsKLQlHQ0RhdGEgZGF0YSA9IG5ldyBHQ0RhdGEgKCk7Ci0JaW50IGdjID0gaW50ZXJuYWxfbmV3X0dDIChkYXRhKTsKLQlSZWN0IGJvdW5kcyA9IG5ldyBSZWN0ICgpOwotCU9TLkdldFJlZ2lvbkJvdW5kcyAoZGF0YS52aXNpYmxlUmduLCBib3VuZHMpOwotCWludCB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0OwotCWludCBoZWlnaHQgPSBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDsKLQlSZWN0IHJlY3QgPSBuZXcgUmVjdCAoKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlPUy5HZXRQb3J0Qm91bmRzIChwb3J0LCByZWN0KTsKLQlpbnQgW10gZ2xib3VuZHMgPSBuZXcgaW50IFs0XTsKLQlnbGJvdW5kc1swXSA9IGJvdW5kcy5sZWZ0OwotCWdsYm91bmRzWzFdID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCAtIGJvdW5kcy50b3AgLSBoZWlnaHQ7Ci0JZ2xib3VuZHNbMl0gPSB3aWR0aDsKLQlnbGJvdW5kc1szXSA9IGhlaWdodDsKLQlBR0wuYWdsU2V0SW50ZWdlciAoY29udGV4dCwgQUdMLkFHTF9CVUZGRVJfUkVDVCwgZ2xib3VuZHMpOwotCUFHTC5hZ2xFbmFibGUgKGNvbnRleHQsIEFHTC5BR0xfQlVGRkVSX1JFQ1QpOwotCUFHTC5hZ2xTZXRJbnRlZ2VyIChjb250ZXh0LCBBR0wuQUdMX0NMSVBfUkVHSU9OLCBkYXRhLnZpc2libGVSZ24pOwotCUFHTC5hZ2xVcGRhdGVDb250ZXh0IChjb250ZXh0KTsKLQlpbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9TQU1QTEVfQlVGRkVSU19BUkIsIHZhbHVlKTsKLQlkYXRhLnNhbXBsZUJ1ZmZlcnMgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NBTVBMRVNfQVJCLCB2YWx1ZSk7Ci0JZGF0YS5zYW1wbGVzID0gdmFsdWUgWzBdOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVjZWl2ZXIncyBPcGVuR0wgY29udGV4dAotICogaXMgdGhlIGN1cnJlbnQgY29udGV4dC4KLSAqICAKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaG9sZHMgdGhlIGN1cnJlbnQgT3BlbkdMIGNvbnRleHQsCi0gKiBmYWxzZSBvdGhlcndpc2UKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNDdXJyZW50ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gQUdMLmFnbEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQ7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKEFHTC5hZ2xHZXRDdXJyZW50Q29udGV4dCAoKSAhPSBjb250ZXh0KSB7Ci0JCUFHTC5hZ2xTZXRDdXJyZW50Q29udGV4dCAoY29udGV4dCk7Ci0JfQotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlBR0wuYWdsU3dhcEJ1ZmZlcnMgKGNvbnRleHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNWU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MjcgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbF9zdGF0cy5oIgotCi0jZGVmaW5lIEdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19nbEFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFjY3VtKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLQlnbEFjY3VtKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQWxwaGFGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFscGhhRnVuYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQWxwaGFGdW5jX0ZVTkMpOwotCWdsQWxwaGFGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBbHBoYUZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEFyZVRleHR1cmVzUmVzaWRlbnQKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbEFyZVRleHR1cmVzUmVzaWRlbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamJvb2xlYW5BcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWpib29sZWFuICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JcmMgPSAoamJvb2xlYW4pZ2xBcmVUZXh0dXJlc1Jlc2lkZW50KGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xBcnJheUVsZW1lbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQXJyYXlFbGVtZW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFycmF5RWxlbWVudF9GVU5DKTsKLQlnbEFycmF5RWxlbWVudChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQXJyYXlFbGVtZW50X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCZWdpbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xCZWdpbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLQlnbEJlZ2luKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQmluZFRleHR1cmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmluZFRleHR1cmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLQlnbEJpbmRUZXh0dXJlKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQml0bWFwCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEJpdG1hcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGpieXRlQXJyYXkgYXJnNikKLXsKLQlqYnl0ZSAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaXRtYXBfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbEJpdG1hcChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCAoY29uc3QgR0x1Ynl0ZSAqKWxwYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQml0bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCbGVuZEZ1bmMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmxlbmRGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQmxlbmRGdW5jX0ZVTkMpOwotCWdsQmxlbmRGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCbGVuZEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENhbGxMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotCWdsQ2FsbExpc3QoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNCCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpieXRlQXJyYXkgYXJnMikKLXsKLQlqYnl0ZSAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNDCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpjaGFyQXJyYXkgYXJnMikKLXsKLQlqY2hhciAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Q2hhckFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNJCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2FsbExpc3RzX19JSV8zSV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0c19fSUlfM0lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotCWdsQ2xlYXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDbGVhckFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyQWNjdW0pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckFjY3VtX0ZVTkMpOwotCWdsQ2xlYXJBY2N1bShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJDb2xvcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckNvbG9yKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJDb2xvcl9GVU5DKTsKLQlnbENsZWFyQ29sb3IoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyQ29sb3JfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyRGVwdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ2xlYXJEZXB0aCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckRlcHRoX0ZVTkMpOwotCWdsQ2xlYXJEZXB0aChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJEZXB0aF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJJbmRleAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckluZGV4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJJbmRleF9GVU5DKTsKLQlnbENsZWFySW5kZXgoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFySW5kZXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyU3RlbmNpbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhclN0ZW5jaWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJTdGVuY2lsX0ZVTkMpOwotCWdsQ2xlYXJTdGVuY2lsKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDbGVhclN0ZW5jaWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsaXBQbGFuZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGlwUGxhbmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xDbGlwUGxhbmUoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNiKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNiX0ZVTkMpOwotCWdsQ29sb3IzYihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzYnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2RfRlVOQyk7Ci0JZ2xDb2xvcjNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM2R2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNmX0ZVTkMpOwotCWdsQ29sb3IzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpX0ZVTkMpOwotCWdsQ29sb3IzaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3Izc19GVU5DKTsKLQlnbENvbG9yM3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3N2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3Izc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3Izc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3ViCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3ViKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLQlnbENvbG9yM3ViKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3VidikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZUFycmF5IGFyZzApCi17Ci0JamJ5dGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWJ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjN1YnYoKGNvbnN0IEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotCWdsQ29sb3IzdWkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotCWdsQ29sb3IzdXMoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3Vzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VzdigoY29uc3QgR0x1c2hvcnQgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Yl9GVU5DKTsKLQlnbENvbG9yNGIoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0YnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGRfRlVOQyk7Ci0JZ2xDb2xvcjRkKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Zl9GVU5DKTsKLQlnbENvbG9yNGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpX0ZVTkMpOwotCWdsQ29sb3I0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHNfRlVOQyk7Ci0JZ2xDb2xvcjRzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1YgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci0JZ2xDb2xvcjR1YihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVidgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVidl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCWdsQ29sb3I0dWJ2KChjb25zdCBHTHVieXRlICopbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1YnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotCWdsQ29sb3I0dWkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNHVpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMiwganNob3J0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLQlnbENvbG9yNHVzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjR1c3YoKGNvbnN0IEdMdXNob3J0ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvck1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3JNYXNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpib29sZWFuIGFyZzAsIGpib29sZWFuIGFyZzEsIGpib29sZWFuIGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvck1hc2tfRlVOQyk7Ci0JZ2xDb2xvck1hc2soYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3JNYXRlcmlhbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvck1hdGVyaWFsKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3JNYXRlcmlhbF9GVU5DKTsKLQlnbENvbG9yTWF0ZXJpYWwoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWF0ZXJpYWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvclBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsQ29sb3JQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvcHlQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVBpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlQaXhlbHNfRlVOQyk7Ci0JZ2xDb3B5UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4SW1hZ2UxRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleEltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleFN1YkltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4U3ViSW1hZ2UyRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDdWxsRmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDdWxsRmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLQlnbEN1bGxGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlTGlzdHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLQlnbERlbGV0ZUxpc3RzKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlVGV4dHVyZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlbGV0ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbERlbGV0ZVRleHR1cmVzKGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVsZXRlVGV4dHVyZXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoRnVuYwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aEZ1bmMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRGVwdGhGdW5jX0ZVTkMpOwotCWdsRGVwdGhGdW5jKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZXB0aEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoTWFzawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW4gYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlcHRoTWFza19GVU5DKTsKLQlnbERlcHRoTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhNYXNrX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEZXB0aFJhbmdlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERlcHRoUmFuZ2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZXB0aFJhbmdlX0ZVTkMpOwotCWdsRGVwdGhSYW5nZShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhSYW5nZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGlzYWJsZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEaXNhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVfRlVOQyk7Ci0JZ2xEaXNhYmxlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEaXNhYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEaXNhYmxlQ2xpZW50U3RhdGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGlzYWJsZUNsaWVudFN0YXRlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbERpc2FibGVDbGllbnRTdGF0ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGlzYWJsZUNsaWVudFN0YXRlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QXJyYXlzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdBcnJheXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERyYXdBcnJheXNfRlVOQyk7Ci0JZ2xEcmF3QXJyYXlzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3QXJyYXlzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdCdWZmZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd0J1ZmZlcl9GVU5DKTsKLQlnbERyYXdCdWZmZXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbERyYXdCdWZmZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdFbGVtZW50cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEcmF3RWxlbWVudHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsRHJhd0VsZW1lbnRzKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRHJhd1BpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd1BpeGVsc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2xEcmF3UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFZGdlRmxhZwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYm9vbGVhbiBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci0JZ2xFZGdlRmxhZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFnUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ1BvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqYm9vbGVhbkFycmF5IGFyZzEpCi17Ci0JamJvb2xlYW4gKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdQb2ludGVyX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xFZGdlRmxhZ1BvaW50ZXIoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFZGdlRmxhZ1BvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFndgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW5BcnJheSBhcmcwKQotewotCWpib29sZWFuICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVkZ2VGbGFndl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsRWRnZUZsYWd2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWd2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRW5hYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVuYWJsZV9GVU5DKTsKLQlnbEVuYWJsZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRW5hYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGVDbGllbnRTdGF0ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmFibGVDbGllbnRTdGF0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbEVuYWJsZUNsaWVudFN0YXRlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEVuZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRW5kX0ZVTkMpOwotCWdsRW5kKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEVuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kTGlzdAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmRMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotCWdsRW5kTGlzdCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQxZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLQlnbEV2YWxDb29yZDFkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLQlnbEV2YWxDb29yZDFmKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMWZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotCWdsRXZhbENvb3JkMmQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMmR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEV2YWxDb29yZDJkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLQlnbEV2YWxDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQyZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsTWVzaDEKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbE1lc2gxKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsTWVzaDFfRlVOQyk7Ci0JZ2xFdmFsTWVzaDEoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxNZXNoMV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbE1lc2gyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxNZXNoMikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxNZXNoMl9GVU5DKTsKLQlnbEV2YWxNZXNoMihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbE1lc2gyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsUG9pbnQxCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxQb2ludDEpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbFBvaW50MV9GVU5DKTsKLQlnbEV2YWxQb2ludDEoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxQb2ludDFfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEV2YWxQb2ludDIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbFBvaW50MikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxQb2ludDJfRlVOQyk7Ci0JZ2xFdmFsUG9pbnQyKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsUG9pbnQyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xGZWVkYmFja0J1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGZWVkYmFja0J1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmVlZGJhY2tCdWZmZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xGZWVkYmFja0J1ZmZlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGZWVkYmFja0J1ZmZlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmluaXNoCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZpbmlzaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmluaXNoX0ZVTkMpOwotCWdsRmluaXNoKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZpbmlzaF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmx1c2gKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRmx1c2gpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEZsdXNoX0ZVTkMpOwotCWdsRmx1c2goKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRmx1c2hfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRm9nZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZl9GVU5DKTsKLQlnbEZvZ2YoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGb2dmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRm9naQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGb2dpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9naV9GVU5DKTsKLQlnbEZvZ2koYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xGb2dpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dpdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRm9naXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZyb250RmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGcm9udEZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJvbnRGYWNlX0ZVTkMpOwotCWdsRnJvbnRGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGcm9udEZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZydXN0dW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRnJ1c3R1bSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGpkb3VibGUgYXJnNCwgamRvdWJsZSBhcmc1KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJ1c3R1bV9GVU5DKTsKLQlnbEZydXN0dW0oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZydXN0dW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlbkxpc3RzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMX05BVElWRShnbEdlbkxpc3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2VuTGlzdHNfRlVOQyk7Ci0JcmMgPSAoamludClnbEdlbkxpc3RzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZW5MaXN0c19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlblRleHR1cmVzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdlblRleHR1cmVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZW5UZXh0dXJlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZW5UZXh0dXJlcyhhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdlblRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRCb29sZWFudgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRCb29sZWFudikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpib29sZWFuQXJyYXkgYXJnMSkKLXsKLQlqYm9vbGVhbiAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0Qm9vbGVhbnYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0Q2xpcFBsYW5lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldENsaXBQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxKQotewotCWpkb3VibGUgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldENsaXBQbGFuZShhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXREb3VibGV2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldERvdWJsZXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldERvdWJsZXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0RG91YmxldihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0RG91Ymxldl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RXJyb3IKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0RXJyb3IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0RXJyb3JfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldEVycm9yKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldEVycm9yX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RmxvYXR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEZsb2F0dikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldEZsb2F0dl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldEZsb2F0dihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRGbG9hdHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldEludGVnZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEludGVnZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRJbnRlZ2Vydl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRJbnRlZ2VydihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0SW50ZWdlcnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldExpZ2h0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TGlnaHRmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldExpZ2h0ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXBmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXBmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRNYXBmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldE1hdGVyaWFsaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWF0ZXJpYWxpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRNYXRlcmlhbGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldE1hdGVyaWFsaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UGl4ZWxNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcGZ2KGFyZzAsIGxwYXJnMSk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQaXhlbE1hcHVpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcHVpdihhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdWl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRQaXhlbE1hcHVzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRQaXhlbE1hcHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpzaG9ydEFycmF5IGFyZzEpCi17Ci0JanNob3J0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0UGl4ZWxNYXB1c3YoYXJnMCwgKEdMdXNob3J0ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UGl4ZWxNYXB1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBvaW50ZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBvaW50ZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JZ2xHZXRQb2ludGVydihhcmcwLCAoR0x2b2lkICoqKWxwYXJnMSk7Ci0JaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0UG9seWdvblN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UG9seWdvblN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQb2x5Z29uU3RpcHBsZSgoR0x1Ynl0ZSAqKWxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UG9seWdvblN0aXBwbGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldFN0cmluZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhHZW5mdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhHZW5mdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhHZW5mdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhHZW5mdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhJbWFnZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhJbWFnZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4SW1hZ2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4SW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgbHBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEltYWdlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleExldmVsUGFyYW1ldGVyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamZsb2F0QXJyYXkgYXJnMykKLXsKLQlqZmxvYXQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCX0KLQlnbEdldFRleExldmVsUGFyYW1ldGVyZnYoYXJnMCwgYXJnMSwgYXJnMiwgbHBhcmczKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnRBcnJheSBhcmczKQotewotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xIaW50Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEhpbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xIaW50X0ZVTkMpOwotCWdsSGludChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSGludF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhNYXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4TWFzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleE1hc2tfRlVOQyk7Ci0JZ2xJbmRleE1hc2soYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4TWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhQb2ludGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsSW5kZXhQb2ludGVyKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhkX0ZVTkMpOwotCWdsSW5kZXhkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4Zl9GVU5DKTsKLQlnbEluZGV4ZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEluZGV4ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleGlfRlVOQyk7Ci0JZ2xJbmRleGkoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xJbmRleGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhzX0ZVTkMpOwotCWdsSW5kZXhzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbml0TmFtZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5pdE5hbWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbml0TmFtZXNfRlVOQyk7Ci0JZ2xJbml0TmFtZXMoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5pdE5hbWVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbnRlcmxlYXZlZEFycmF5cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbnRlcmxlYXZlZEFycmF5cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbnRlcmxlYXZlZEFycmF5c19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xJbnRlcmxlYXZlZEFycmF5cyhhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW50ZXJsZWF2ZWRBcnJheXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbElzRW5hYmxlZAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xfTkFUSVZFKGdsSXNFbmFibGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbElzRW5hYmxlZF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbElzRW5hYmxlZChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSXNFbmFibGVkX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSXNMaXN0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJc0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSXNMaXN0X0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWdsSXNMaXN0KGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJc0xpc3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJc1RleHR1cmUKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbElzVGV4dHVyZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJc1RleHR1cmVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xJc1RleHR1cmUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbElzVGV4dHVyZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLQlnbExpZ2h0TW9kZWxmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRNb2RlbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbExpZ2h0TW9kZWxmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci0JZ2xMaWdodE1vZGVsaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodE1vZGVsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xMaWdodE1vZGVsaXYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZfRlVOQyk7Ci0JZ2xMaWdodGYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaWdodGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGlnaHRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGlfRlVOQyk7Ci0JZ2xMaWdodGkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGluZVN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotCWdsTGluZVN0aXBwbGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaW5lV2lkdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVdpZHRoKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGluZVdpZHRoX0ZVTkMpOwotCWdsTGluZVdpZHRoKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaW5lV2lkdGhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpc3RCYXNlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpc3RCYXNlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotCWdsTGlzdEJhc2UoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkSWRlbnRpdHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZElkZW50aXR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2FkSWRlbnRpdHlfRlVOQyk7Ci0JZ2xMb2FkSWRlbnRpdHkoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZElkZW50aXR5X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkTWF0cml4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMb2FkTWF0cml4ZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExvYWRNYXRyaXhkX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbExvYWRNYXRyaXhkKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4ZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE1hdHJpeGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE1hdHJpeGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE1hdHJpeGZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xMb2FkTWF0cml4ZihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE5hbWUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci0JZ2xMb2FkTmFtZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExvZ2ljT3AKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9naWNPcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2dpY09wX0ZVTkMpOwotCWdsTG9naWNPcChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9naWNPcF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTWFwMWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpkb3VibGVBcnJheSBhcmc1KQotewotCWpkb3VibGUgKmxwYXJnNT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMWRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNSkgbHBhcmc1ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAxZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAxZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdEFycmF5IGFyZzUpCi17Ci0JamZsb2F0ICpscGFyZzU9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDFmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBscGFyZzUsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hcDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpkb3VibGVBcnJheSBhcmc5KQotewotCWpkb3VibGUgKmxwYXJnOT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMmRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOSkgbHBhcmc5ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgbHBhcmc5LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdCBhcmc1LCBqZmxvYXQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpmbG9hdEFycmF5IGFyZzkpCi17Ci0JamZsb2F0ICpscGFyZzk9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDJmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc5KSBscGFyZzkgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc5LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc5LCBscGFyZzksIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQxZF9GVU5DKTsKLQlnbE1hcEdyaWQxZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDFmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwR3JpZDFmX0ZVTkMpOwotCWdsTWFwR3JpZDFmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXBHcmlkMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZF9GVU5DKTsKLQlnbE1hcEdyaWQyZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZl9GVU5DKTsKLQlnbE1hcEdyaWQyZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWF0ZXJpYWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZl9GVU5DKTsKLQlnbE1hdGVyaWFsZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hdGVyaWFsaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXRlcmlhbGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsaV9GVU5DKTsKLQlnbE1hdGVyaWFsaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGl2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXRlcmlhbGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRyaXhNb2RlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdHJpeE1vZGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0cml4TW9kZV9GVU5DKTsKLQlnbE1hdHJpeE1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdHJpeE1vZGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE11bHRNYXRyaXhkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE11bHRNYXRyaXhkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTXVsdE1hdHJpeGRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTXVsdE1hdHJpeGQobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNdWx0TWF0cml4ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNdWx0TWF0cml4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xNdWx0TWF0cml4Zl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE11bHRNYXRyaXhmKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOZXdMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE5ld0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOZXdMaXN0X0ZVTkMpOwotCWdsTmV3TGlzdChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTmV3TGlzdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGUgYXJnMCwgamJ5dGUgYXJnMSwgamJ5dGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotCWdsTm9ybWFsM2IoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2J2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOb3JtYWwzYnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotCWdsTm9ybWFsM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci0JZ2xOb3JtYWwzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotCWdsTm9ybWFsM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci0JZ2xOb3JtYWwzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWxQb2ludGVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsUG9pbnRlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsUG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsT3J0aG8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsT3J0aG8pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotCWdsT3J0aG8oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQYXNzVGhyb3VnaAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQYXNzVGhyb3VnaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotCWdsUGFzc1Rocm91Z2goYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbE1hcGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xQaXhlbE1hcGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdWl2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVpbnQgKilscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxNYXB1aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqc2hvcnRBcnJheSBhcmcyKQotewotCWpzaG9ydCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbE1hcHVzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdXN2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVzaG9ydCAqKWxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwdXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbFN0b3JlZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQaXhlbFN0b3JlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsU3RvcmVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsU3RvcmVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsVHJhbnNmZXJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsVHJhbnNmZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxUcmFuc2ZlcmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUGl4ZWxUcmFuc2ZlcmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxab29tCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsWm9vbSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFpvb21fRlVOQyk7Ci0JZ2xQaXhlbFpvb20oYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsWm9vbV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUG9pbnRTaXplCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvaW50U2l6ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvaW50U2l6ZV9GVU5DKTsKLQlnbFBvaW50U2l6ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9pbnRTaXplX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uTW9kZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQb2x5Z29uTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotCWdsUG9seWdvbk1vZGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uT2Zmc2V0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25PZmZzZXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUG9seWdvbk9mZnNldF9GVU5DKTsKLQlnbFBvbHlnb25PZmZzZXQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25PZmZzZXRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBvbHlnb25TdGlwcGxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25TdGlwcGxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb2x5Z29uU3RpcHBsZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUG9seWdvblN0aXBwbGUoKEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQ2xpZW50QXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BDbGllbnRBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BDbGllbnRBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQ2xpZW50QXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BNYXRyaXgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BNYXRyaXhfRlVOQyk7Ci0JZ2xQb3BNYXRyaXgoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BOYW1lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvcE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci0JZ2xQb3BOYW1lKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFByaW9yaXRpemVUZXh0dXJlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQcmlvcml0aXplVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFByaW9yaXRpemVUZXh0dXJlcyhhcmcwLCAoY29uc3QgR0x1aW50ICopbHBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoQXR0cmliCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFB1c2hBdHRyaWIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHVzaEF0dHJpYl9GVU5DKTsKLQlnbFB1c2hBdHRyaWIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFB1c2hBdHRyaWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFB1c2hDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUHVzaENsaWVudEF0dHJpYikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoQ2xpZW50QXR0cmliX0ZVTkMpOwotCWdsUHVzaENsaWVudEF0dHJpYihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHVzaENsaWVudEF0dHJpYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUHVzaE1hdHJpeAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotCWdsUHVzaE1hdHJpeCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoTmFtZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLQlnbFB1c2hOYW1lKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLQlnbFJhc3RlclBvczJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MyZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLQlnbFJhc3RlclBvczJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Myc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMnN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Mzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNHN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmVhZEJ1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWFkQnVmZmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlYWRCdWZmZXJfRlVOQyk7Ci0JZ2xSZWFkQnVmZmVyKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWFkQnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWFkUGl4ZWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlYWRQaXhlbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWFkUGl4ZWxzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFJlYWRQaXhlbHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlYWRQaXhlbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotCWdsUmVjdGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGR2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci0JZ2xSZWN0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCWpmbG9hdCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0ZnYobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotCWdsUmVjdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGl2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci0JZ2xSZWN0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCwganNob3J0QXJyYXkgYXJnMSkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCWpzaG9ydCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0c3YobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlbmRlck1vZGUKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVuZGVyTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamludCByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFJlbmRlck1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSb3RhdGVkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJvdGF0ZWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUm90YXRlZF9GVU5DKTsKLQlnbFJvdGF0ZWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJvdGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJvdGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUm90YXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJvdGF0ZWZfRlVOQyk7Ci0JZ2xSb3RhdGVmKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSb3RhdGVmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTY2FsZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2NhbGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2FsZWRfRlVOQyk7Ci0JZ2xTY2FsZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNjYWxlZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2NhbGVmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNjYWxlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2NhbGVmX0ZVTkMpOwotCWdsU2NhbGVmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTY2FsZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFNjaXNzb3IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2Npc3NvcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2lzc29yX0ZVTkMpOwotCWdsU2Npc3NvcihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2Npc3Nvcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2VsZWN0QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNlbGVjdEJ1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFNlbGVjdEJ1ZmZlcl9GVU5DKTsKLQlnbFNlbGVjdEJ1ZmZlcihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2VsZWN0QnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTaGFkZU1vZGVsCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNoYWRlTW9kZWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2hhZGVNb2RlbF9GVU5DKTsKLQlnbFNoYWRlTW9kZWwoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNoYWRlTW9kZWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFN0ZW5jaWxGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLQlnbFN0ZW5jaWxGdW5jKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU3RlbmNpbE1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU3RlbmNpbE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci0JZ2xTdGVuY2lsTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxPcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xTdGVuY2lsT3ApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFN0ZW5jaWxPcF9GVU5DKTsKLQlnbFN0ZW5jaWxPcChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE9wX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZF9GVU5DKTsKLQlnbFRleENvb3JkMWQoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmX0ZVTkMpOwotCWdsVGV4Q29vcmQxZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQxZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDFmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWlfRlVOQyk7Ci0JZ2xUZXhDb29yZDFpKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMWl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc19GVU5DKTsKLQlnbFRleENvb3JkMXMoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmRfRlVOQyk7Ci0JZ2xUZXhDb29yZDJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmZfRlVOQyk7Ci0JZ2xUZXhDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpX0ZVTkMpOwotCWdsVGV4Q29vcmQyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQycykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzX0ZVTkMpOwotCWdsVGV4Q29vcmQycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkX0ZVTkMpOwotCWdsVGV4Q29vcmQzZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZl9GVU5DKTsKLQlnbFRleENvb3JkM2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzaSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaV9GVU5DKTsKLQlnbFRleENvb3JkM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM3NfRlVOQyk7Ci0JZ2xUZXhDb29yZDNzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM3N2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZF9GVU5DKTsKLQlnbFRleENvb3JkNGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNGR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0ZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmX0ZVTkMpOwotCWdsVGV4Q29vcmQ0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQ0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0aQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGlfRlVOQyk7Ci0JZ2xUZXhDb29yZDRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c19GVU5DKTsKLQlnbFRleENvb3JkNHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNHN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0c3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZFBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmRQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhFbnZmX0ZVTkMpOwotCWdsVGV4RW52ZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4RW52aV9GVU5DKTsKLQlnbFRleEVudmkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEVudmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5kKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5kX0ZVTkMpOwotCWdsVGV4R2VuZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5mCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZl9GVU5DKTsKLQlnbFRleEdlbmYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEdlbmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5mdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEdlbmZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEdlbmlfRlVOQyk7Ci0JZ2xUZXhHZW5pKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhHZW5pX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5pdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5pdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhHZW5pdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnRBcnJheSBhcmc3KQotewotCWppbnQgKmxwYXJnNz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4SW1hZ2UxRF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGxwYXJnNyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhJbWFnZTJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcsIGpieXRlQXJyYXkgYXJnOCkKLXsKLQlqYnl0ZSAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGxwYXJnOCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzgpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcmZfRlVOQyk7Ci0JZ2xUZXhQYXJhbWV0ZXJmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJpX0ZVTkMpOwotCWdsVGV4UGFyYW1ldGVyaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhTdWJJbWFnZTFECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTFEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMURfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleFN1YkltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNywgamludEFycmF5IGFyZzgpCi17Ci0JamludCAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMkRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZF9GVU5DKTsKLQlnbFRyYW5zbGF0ZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZl9GVU5DKTsKLQlnbFRyYW5zbGF0ZWYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci0JZ2xWZXJ0ZXgyZChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4MmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotCWdsVmVydGV4MmYoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci0JZ2xWZXJ0ZXgyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4Mml2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotCWdsVmVydGV4MnMoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MnN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLQlnbFZlcnRleDNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2R2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JZ2xWZXJ0ZXgzZHYobHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotCWdsVmVydGV4M2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLQlnbFZlcnRleDNpKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xWZXJ0ZXgzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotCWdsVmVydGV4M3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotCWdsVmVydGV4NGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotCWdsVmVydGV4NGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotCWdsVmVydGV4NGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotCWdsVmVydGV4NHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleFBvaW50ZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVmVydGV4UG9pbnRlcihhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgbHBhcmczLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4UG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmlld3BvcnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmlld3BvcnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci0JZ2xWaWV3cG9ydChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmMGExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpZmRlZiBfX0FQUExFX18KLSNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KLSNlbHNlCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxHTC9nbC5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2VmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAzMzU7Ci1pbnQgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMzM1XTsKLWNoYXIgKiBHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImdsQWNjdW0iLCAKLQkiZ2xBbHBoYUZ1bmMiLCAKLQkiZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IiwgCi0JImdsQXJyYXlFbGVtZW50IiwgCi0JImdsQmVnaW4iLCAKLQkiZ2xCaW5kVGV4dHVyZSIsIAotCSJnbEJpdG1hcCIsIAotCSJnbEJsZW5kRnVuYyIsIAotCSJnbENhbGxMaXN0IiwgCi0JImdsQ2FsbExpc3RzX19JSV8zQiIsIAotCSJnbENhbGxMaXN0c19fSUlfM0MiLCAKLQkiZ2xDYWxsTGlzdHNfX0lJXzNJIiwgCi0JImdsQ2xlYXIiLCAKLQkiZ2xDbGVhckFjY3VtIiwgCi0JImdsQ2xlYXJDb2xvciIsIAotCSJnbENsZWFyRGVwdGgiLCAKLQkiZ2xDbGVhckluZGV4IiwgCi0JImdsQ2xlYXJTdGVuY2lsIiwgCi0JImdsQ2xpcFBsYW5lIiwgCi0JImdsQ29sb3IzYiIsIAotCSJnbENvbG9yM2J2IiwgCi0JImdsQ29sb3IzZCIsIAotCSJnbENvbG9yM2R2IiwgCi0JImdsQ29sb3IzZiIsIAotCSJnbENvbG9yM2Z2IiwgCi0JImdsQ29sb3IzaSIsIAotCSJnbENvbG9yM2l2IiwgCi0JImdsQ29sb3IzcyIsIAotCSJnbENvbG9yM3N2IiwgCi0JImdsQ29sb3IzdWIiLCAKLQkiZ2xDb2xvcjN1YnYiLCAKLQkiZ2xDb2xvcjN1aSIsIAotCSJnbENvbG9yM3VpdiIsIAotCSJnbENvbG9yM3VzIiwgCi0JImdsQ29sb3IzdXN2IiwgCi0JImdsQ29sb3I0YiIsIAotCSJnbENvbG9yNGJ2IiwgCi0JImdsQ29sb3I0ZCIsIAotCSJnbENvbG9yNGR2IiwgCi0JImdsQ29sb3I0ZiIsIAotCSJnbENvbG9yNGZ2IiwgCi0JImdsQ29sb3I0aSIsIAotCSJnbENvbG9yNGl2IiwgCi0JImdsQ29sb3I0cyIsIAotCSJnbENvbG9yNHViIiwgCi0JImdsQ29sb3I0dWJ2IiwgCi0JImdsQ29sb3I0dWkiLCAKLQkiZ2xDb2xvcjR1aXYiLCAKLQkiZ2xDb2xvcjR1cyIsIAotCSJnbENvbG9yNHVzdiIsIAotCSJnbENvbG9yTWFzayIsIAotCSJnbENvbG9yTWF0ZXJpYWwiLCAKLQkiZ2xDb2xvclBvaW50ZXIiLCAKLQkiZ2xDb3B5UGl4ZWxzIiwgCi0JImdsQ29weVRleEltYWdlMUQiLCAKLQkiZ2xDb3B5VGV4SW1hZ2UyRCIsIAotCSJnbENvcHlUZXhTdWJJbWFnZTFEIiwgCi0JImdsQ29weVRleFN1YkltYWdlMkQiLCAKLQkiZ2xDdWxsRmFjZSIsIAotCSJnbERlbGV0ZUxpc3RzIiwgCi0JImdsRGVsZXRlVGV4dHVyZXMiLCAKLQkiZ2xEZXB0aEZ1bmMiLCAKLQkiZ2xEZXB0aE1hc2siLCAKLQkiZ2xEZXB0aFJhbmdlIiwgCi0JImdsRGlzYWJsZSIsIAotCSJnbERpc2FibGVDbGllbnRTdGF0ZSIsIAotCSJnbERyYXdBcnJheXMiLCAKLQkiZ2xEcmF3QnVmZmVyIiwgCi0JImdsRHJhd0VsZW1lbnRzIiwgCi0JImdsRHJhd1BpeGVscyIsIAotCSJnbEVkZ2VGbGFnIiwgCi0JImdsRWRnZUZsYWdQb2ludGVyIiwgCi0JImdsRWRnZUZsYWd2IiwgCi0JImdsRW5hYmxlIiwgCi0JImdsRW5hYmxlQ2xpZW50U3RhdGUiLCAKLQkiZ2xFbmQiLCAKLQkiZ2xFbmRMaXN0IiwgCi0JImdsRXZhbENvb3JkMWQiLCAKLQkiZ2xFdmFsQ29vcmQxZHYiLCAKLQkiZ2xFdmFsQ29vcmQxZiIsIAotCSJnbEV2YWxDb29yZDFmdiIsIAotCSJnbEV2YWxDb29yZDJkIiwgCi0JImdsRXZhbENvb3JkMmR2IiwgCi0JImdsRXZhbENvb3JkMmYiLCAKLQkiZ2xFdmFsQ29vcmQyZnYiLCAKLQkiZ2xFdmFsTWVzaDEiLCAKLQkiZ2xFdmFsTWVzaDIiLCAKLQkiZ2xFdmFsUG9pbnQxIiwgCi0JImdsRXZhbFBvaW50MiIsIAotCSJnbEZlZWRiYWNrQnVmZmVyIiwgCi0JImdsRmluaXNoIiwgCi0JImdsRmx1c2giLCAKLQkiZ2xGb2dmIiwgCi0JImdsRm9nZnYiLCAKLQkiZ2xGb2dpIiwgCi0JImdsRm9naXYiLCAKLQkiZ2xGcm9udEZhY2UiLCAKLQkiZ2xGcnVzdHVtIiwgCi0JImdsR2VuTGlzdHMiLCAKLQkiZ2xHZW5UZXh0dXJlcyIsIAotCSJnbEdldEJvb2xlYW52IiwgCi0JImdsR2V0Q2xpcFBsYW5lIiwgCi0JImdsR2V0RG91YmxldiIsIAotCSJnbEdldEVycm9yIiwgCi0JImdsR2V0RmxvYXR2IiwgCi0JImdsR2V0SW50ZWdlcnYiLCAKLQkiZ2xHZXRMaWdodGZ2IiwgCi0JImdsR2V0TGlnaHRpdiIsIAotCSJnbEdldE1hcGR2IiwgCi0JImdsR2V0TWFwZnYiLCAKLQkiZ2xHZXRNYXBpdiIsIAotCSJnbEdldE1hdGVyaWFsZnYiLCAKLQkiZ2xHZXRNYXRlcmlhbGl2IiwgCi0JImdsR2V0UGl4ZWxNYXBmdiIsIAotCSJnbEdldFBpeGVsTWFwdWl2IiwgCi0JImdsR2V0UGl4ZWxNYXB1c3YiLCAKLQkiZ2xHZXRQb2ludGVydiIsIAotCSJnbEdldFBvbHlnb25TdGlwcGxlIiwgCi0JImdsR2V0U3RyaW5nIiwgCi0JImdsR2V0VGV4RW52ZnYiLCAKLQkiZ2xHZXRUZXhFbnZpdiIsIAotCSJnbEdldFRleEdlbmR2IiwgCi0JImdsR2V0VGV4R2VuZnYiLCAKLQkiZ2xHZXRUZXhHZW5pdiIsIAotCSJnbEdldFRleEltYWdlIiwgCi0JImdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleExldmVsUGFyYW1ldGVyaXYiLCAKLQkiZ2xHZXRUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleFBhcmFtZXRlcml2IiwgCi0JImdsSGludCIsIAotCSJnbEluZGV4TWFzayIsIAotCSJnbEluZGV4UG9pbnRlciIsIAotCSJnbEluZGV4ZCIsIAotCSJnbEluZGV4ZHYiLCAKLQkiZ2xJbmRleGYiLCAKLQkiZ2xJbmRleGZ2IiwgCi0JImdsSW5kZXhpIiwgCi0JImdsSW5kZXhpdiIsIAotCSJnbEluZGV4cyIsIAotCSJnbEluZGV4c3YiLCAKLQkiZ2xJbml0TmFtZXMiLCAKLQkiZ2xJbnRlcmxlYXZlZEFycmF5cyIsIAotCSJnbElzRW5hYmxlZCIsIAotCSJnbElzTGlzdCIsIAotCSJnbElzVGV4dHVyZSIsIAotCSJnbExpZ2h0TW9kZWxmIiwgCi0JImdsTGlnaHRNb2RlbGZ2IiwgCi0JImdsTGlnaHRNb2RlbGkiLCAKLQkiZ2xMaWdodE1vZGVsaXYiLCAKLQkiZ2xMaWdodGYiLCAKLQkiZ2xMaWdodGZ2IiwgCi0JImdsTGlnaHRpIiwgCi0JImdsTGlnaHRpdiIsIAotCSJnbExpbmVTdGlwcGxlIiwgCi0JImdsTGluZVdpZHRoIiwgCi0JImdsTGlzdEJhc2UiLCAKLQkiZ2xMb2FkSWRlbnRpdHkiLCAKLQkiZ2xMb2FkTWF0cml4ZCIsIAotCSJnbExvYWRNYXRyaXhmIiwgCi0JImdsTG9hZE5hbWUiLCAKLQkiZ2xMb2dpY09wIiwgCi0JImdsTWFwMWQiLCAKLQkiZ2xNYXAxZiIsIAotCSJnbE1hcDJkIiwgCi0JImdsTWFwMmYiLCAKLQkiZ2xNYXBHcmlkMWQiLCAKLQkiZ2xNYXBHcmlkMWYiLCAKLQkiZ2xNYXBHcmlkMmQiLCAKLQkiZ2xNYXBHcmlkMmYiLCAKLQkiZ2xNYXRlcmlhbGYiLCAKLQkiZ2xNYXRlcmlhbGZ2IiwgCi0JImdsTWF0ZXJpYWxpIiwgCi0JImdsTWF0ZXJpYWxpdiIsIAotCSJnbE1hdHJpeE1vZGUiLCAKLQkiZ2xNdWx0TWF0cml4ZCIsIAotCSJnbE11bHRNYXRyaXhmIiwgCi0JImdsTmV3TGlzdCIsIAotCSJnbE5vcm1hbDNiIiwgCi0JImdsTm9ybWFsM2J2IiwgCi0JImdsTm9ybWFsM2QiLCAKLQkiZ2xOb3JtYWwzZHYiLCAKLQkiZ2xOb3JtYWwzZiIsIAotCSJnbE5vcm1hbDNmdiIsIAotCSJnbE5vcm1hbDNpIiwgCi0JImdsTm9ybWFsM2l2IiwgCi0JImdsTm9ybWFsM3MiLCAKLQkiZ2xOb3JtYWwzc3YiLCAKLQkiZ2xOb3JtYWxQb2ludGVyIiwgCi0JImdsT3J0aG8iLCAKLQkiZ2xQYXNzVGhyb3VnaCIsIAotCSJnbFBpeGVsTWFwZnYiLCAKLQkiZ2xQaXhlbE1hcHVpdiIsIAotCSJnbFBpeGVsTWFwdXN2IiwgCi0JImdsUGl4ZWxTdG9yZWYiLCAKLQkiZ2xQaXhlbFN0b3JlaSIsIAotCSJnbFBpeGVsVHJhbnNmZXJmIiwgCi0JImdsUGl4ZWxUcmFuc2ZlcmkiLCAKLQkiZ2xQaXhlbFpvb20iLCAKLQkiZ2xQb2ludFNpemUiLCAKLQkiZ2xQb2x5Z29uTW9kZSIsIAotCSJnbFBvbHlnb25PZmZzZXQiLCAKLQkiZ2xQb2x5Z29uU3RpcHBsZSIsIAotCSJnbFBvcEF0dHJpYiIsIAotCSJnbFBvcENsaWVudEF0dHJpYiIsIAotCSJnbFBvcE1hdHJpeCIsIAotCSJnbFBvcE5hbWUiLCAKLQkiZ2xQcmlvcml0aXplVGV4dHVyZXMiLCAKLQkiZ2xQdXNoQXR0cmliIiwgCi0JImdsUHVzaENsaWVudEF0dHJpYiIsIAotCSJnbFB1c2hNYXRyaXgiLCAKLQkiZ2xQdXNoTmFtZSIsIAotCSJnbFJhc3RlclBvczJkIiwgCi0JImdsUmFzdGVyUG9zMmR2IiwgCi0JImdsUmFzdGVyUG9zMmYiLCAKLQkiZ2xSYXN0ZXJQb3MyZnYiLCAKLQkiZ2xSYXN0ZXJQb3MyaSIsIAotCSJnbFJhc3RlclBvczJpdiIsIAotCSJnbFJhc3RlclBvczJzIiwgCi0JImdsUmFzdGVyUG9zMnN2IiwgCi0JImdsUmFzdGVyUG9zM2QiLCAKLQkiZ2xSYXN0ZXJQb3MzZHYiLCAKLQkiZ2xSYXN0ZXJQb3MzZiIsIAotCSJnbFJhc3RlclBvczNmdiIsIAotCSJnbFJhc3RlclBvczNpIiwgCi0JImdsUmFzdGVyUG9zM2l2IiwgCi0JImdsUmFzdGVyUG9zM3MiLCAKLQkiZ2xSYXN0ZXJQb3Mzc3YiLCAKLQkiZ2xSYXN0ZXJQb3M0ZCIsIAotCSJnbFJhc3RlclBvczRkdiIsIAotCSJnbFJhc3RlclBvczRmIiwgCi0JImdsUmFzdGVyUG9zNGZ2IiwgCi0JImdsUmFzdGVyUG9zNGkiLCAKLQkiZ2xSYXN0ZXJQb3M0aXYiLCAKLQkiZ2xSYXN0ZXJQb3M0cyIsIAotCSJnbFJhc3RlclBvczRzdiIsIAotCSJnbFJlYWRCdWZmZXIiLCAKLQkiZ2xSZWFkUGl4ZWxzIiwgCi0JImdsUmVjdGQiLCAKLQkiZ2xSZWN0ZHYiLCAKLQkiZ2xSZWN0ZiIsIAotCSJnbFJlY3RmdiIsIAotCSJnbFJlY3RpIiwgCi0JImdsUmVjdGl2IiwgCi0JImdsUmVjdHMiLCAKLQkiZ2xSZWN0c3YiLCAKLQkiZ2xSZW5kZXJNb2RlIiwgCi0JImdsUm90YXRlZCIsIAotCSJnbFJvdGF0ZWYiLCAKLQkiZ2xTY2FsZWQiLCAKLQkiZ2xTY2FsZWYiLCAKLQkiZ2xTY2lzc29yIiwgCi0JImdsU2VsZWN0QnVmZmVyIiwgCi0JImdsU2hhZGVNb2RlbCIsIAotCSJnbFN0ZW5jaWxGdW5jIiwgCi0JImdsU3RlbmNpbE1hc2siLCAKLQkiZ2xTdGVuY2lsT3AiLCAKLQkiZ2xUZXhDb29yZDFkIiwgCi0JImdsVGV4Q29vcmQxZHYiLCAKLQkiZ2xUZXhDb29yZDFmIiwgCi0JImdsVGV4Q29vcmQxZnYiLCAKLQkiZ2xUZXhDb29yZDFpIiwgCi0JImdsVGV4Q29vcmQxaXYiLCAKLQkiZ2xUZXhDb29yZDFzIiwgCi0JImdsVGV4Q29vcmQxc3YiLCAKLQkiZ2xUZXhDb29yZDJkIiwgCi0JImdsVGV4Q29vcmQyZHYiLCAKLQkiZ2xUZXhDb29yZDJmIiwgCi0JImdsVGV4Q29vcmQyZnYiLCAKLQkiZ2xUZXhDb29yZDJpIiwgCi0JImdsVGV4Q29vcmQyaXYiLCAKLQkiZ2xUZXhDb29yZDJzIiwgCi0JImdsVGV4Q29vcmQyc3YiLCAKLQkiZ2xUZXhDb29yZDNkIiwgCi0JImdsVGV4Q29vcmQzZHYiLCAKLQkiZ2xUZXhDb29yZDNmIiwgCi0JImdsVGV4Q29vcmQzZnYiLCAKLQkiZ2xUZXhDb29yZDNpIiwgCi0JImdsVGV4Q29vcmQzaXYiLCAKLQkiZ2xUZXhDb29yZDNzIiwgCi0JImdsVGV4Q29vcmQzc3YiLCAKLQkiZ2xUZXhDb29yZDRkIiwgCi0JImdsVGV4Q29vcmQ0ZHYiLCAKLQkiZ2xUZXhDb29yZDRmIiwgCi0JImdsVGV4Q29vcmQ0ZnYiLCAKLQkiZ2xUZXhDb29yZDRpIiwgCi0JImdsVGV4Q29vcmQ0aXYiLCAKLQkiZ2xUZXhDb29yZDRzIiwgCi0JImdsVGV4Q29vcmQ0c3YiLCAKLQkiZ2xUZXhDb29yZFBvaW50ZXIiLCAKLQkiZ2xUZXhFbnZmIiwgCi0JImdsVGV4RW52ZnYiLCAKLQkiZ2xUZXhFbnZpIiwgCi0JImdsVGV4RW52aXYiLCAKLQkiZ2xUZXhHZW5kIiwgCi0JImdsVGV4R2VuZHYiLCAKLQkiZ2xUZXhHZW5mIiwgCi0JImdsVGV4R2VuZnYiLCAKLQkiZ2xUZXhHZW5pIiwgCi0JImdsVGV4R2VuaXYiLCAKLQkiZ2xUZXhJbWFnZTFEIiwgCi0JImdsVGV4SW1hZ2UyRCIsIAotCSJnbFRleFBhcmFtZXRlcmYiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbFRleFBhcmFtZXRlcmkiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJpdiIsIAotCSJnbFRleFN1YkltYWdlMUQiLCAKLQkiZ2xUZXhTdWJJbWFnZTJEIiwgCi0JImdsVHJhbnNsYXRlZCIsIAotCSJnbFRyYW5zbGF0ZWYiLCAKLQkiZ2xWZXJ0ZXgyZCIsIAotCSJnbFZlcnRleDJkdiIsIAotCSJnbFZlcnRleDJmIiwgCi0JImdsVmVydGV4MmZ2IiwgCi0JImdsVmVydGV4MmkiLCAKLQkiZ2xWZXJ0ZXgyaXYiLCAKLQkiZ2xWZXJ0ZXgycyIsIAotCSJnbFZlcnRleDJzdiIsIAotCSJnbFZlcnRleDNkIiwgCi0JImdsVmVydGV4M2R2IiwgCi0JImdsVmVydGV4M2YiLCAKLQkiZ2xWZXJ0ZXgzZnYiLCAKLQkiZ2xWZXJ0ZXgzaSIsIAotCSJnbFZlcnRleDNpdiIsIAotCSJnbFZlcnRleDNzIiwgCi0JImdsVmVydGV4M3N2IiwgCi0JImdsVmVydGV4NGQiLCAKLQkiZ2xWZXJ0ZXg0ZHYiLCAKLQkiZ2xWZXJ0ZXg0ZiIsIAotCSJnbFZlcnRleDRmdiIsIAotCSJnbFZlcnRleDRpIiwgCi0JImdsVmVydGV4NGl2IiwgCi0JImdsVmVydGV4NHMiLCAKLQkiZ2xWZXJ0ZXg0c3YiLCAKLQkiZ2xWZXJ0ZXhQb2ludGVyIiwgCi0JImdsVmlld3BvcnQiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWZlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotI2lmZGVmIE5BVElWRV9TVEFUUwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMX25hdGl2ZUZ1bmN0aW9uTmFtZXNbXTsKLSNkZWZpbmUgR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbHNlCi0jZGVmaW5lIEdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xBY2N1bV9GVU5DLAotCWdsQWxwaGFGdW5jX0ZVTkMsCi0JZ2xBcmVUZXh0dXJlc1Jlc2lkZW50X0ZVTkMsCi0JZ2xBcnJheUVsZW1lbnRfRlVOQywKLQlnbEJlZ2luX0ZVTkMsCi0JZ2xCaW5kVGV4dHVyZV9GVU5DLAotCWdsQml0bWFwX0ZVTkMsCi0JZ2xCbGVuZEZ1bmNfRlVOQywKLQlnbENhbGxMaXN0X0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNJX0ZVTkMsCi0JZ2xDbGVhcl9GVU5DLAotCWdsQ2xlYXJBY2N1bV9GVU5DLAotCWdsQ2xlYXJDb2xvcl9GVU5DLAotCWdsQ2xlYXJEZXB0aF9GVU5DLAotCWdsQ2xlYXJJbmRleF9GVU5DLAotCWdsQ2xlYXJTdGVuY2lsX0ZVTkMsCi0JZ2xDbGlwUGxhbmVfRlVOQywKLQlnbENvbG9yM2JfRlVOQywKLQlnbENvbG9yM2J2X0ZVTkMsCi0JZ2xDb2xvcjNkX0ZVTkMsCi0JZ2xDb2xvcjNkdl9GVU5DLAotCWdsQ29sb3IzZl9GVU5DLAotCWdsQ29sb3IzZnZfRlVOQywKLQlnbENvbG9yM2lfRlVOQywKLQlnbENvbG9yM2l2X0ZVTkMsCi0JZ2xDb2xvcjNzX0ZVTkMsCi0JZ2xDb2xvcjNzdl9GVU5DLAotCWdsQ29sb3IzdWJfRlVOQywKLQlnbENvbG9yM3Vidl9GVU5DLAotCWdsQ29sb3IzdWlfRlVOQywKLQlnbENvbG9yM3Vpdl9GVU5DLAotCWdsQ29sb3IzdXNfRlVOQywKLQlnbENvbG9yM3Vzdl9GVU5DLAotCWdsQ29sb3I0Yl9GVU5DLAotCWdsQ29sb3I0YnZfRlVOQywKLQlnbENvbG9yNGRfRlVOQywKLQlnbENvbG9yNGR2X0ZVTkMsCi0JZ2xDb2xvcjRmX0ZVTkMsCi0JZ2xDb2xvcjRmdl9GVU5DLAotCWdsQ29sb3I0aV9GVU5DLAotCWdsQ29sb3I0aXZfRlVOQywKLQlnbENvbG9yNHNfRlVOQywKLQlnbENvbG9yNHViX0ZVTkMsCi0JZ2xDb2xvcjR1YnZfRlVOQywKLQlnbENvbG9yNHVpX0ZVTkMsCi0JZ2xDb2xvcjR1aXZfRlVOQywKLQlnbENvbG9yNHVzX0ZVTkMsCi0JZ2xDb2xvcjR1c3ZfRlVOQywKLQlnbENvbG9yTWFza19GVU5DLAotCWdsQ29sb3JNYXRlcmlhbF9GVU5DLAotCWdsQ29sb3JQb2ludGVyX0ZVTkMsCi0JZ2xDb3B5UGl4ZWxzX0ZVTkMsCi0JZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DLAotCWdsQ29weVRleEltYWdlMkRfRlVOQywKLQlnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMsCi0JZ2xDb3B5VGV4U3ViSW1hZ2UyRF9GVU5DLAotCWdsQ3VsbEZhY2VfRlVOQywKLQlnbERlbGV0ZUxpc3RzX0ZVTkMsCi0JZ2xEZWxldGVUZXh0dXJlc19GVU5DLAotCWdsRGVwdGhGdW5jX0ZVTkMsCi0JZ2xEZXB0aE1hc2tfRlVOQywKLQlnbERlcHRoUmFuZ2VfRlVOQywKLQlnbERpc2FibGVfRlVOQywKLQlnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DLAotCWdsRHJhd0FycmF5c19GVU5DLAotCWdsRHJhd0J1ZmZlcl9GVU5DLAotCWdsRHJhd0VsZW1lbnRzX0ZVTkMsCi0JZ2xEcmF3UGl4ZWxzX0ZVTkMsCi0JZ2xFZGdlRmxhZ19GVU5DLAotCWdsRWRnZUZsYWdQb2ludGVyX0ZVTkMsCi0JZ2xFZGdlRmxhZ3ZfRlVOQywKLQlnbEVuYWJsZV9GVU5DLAotCWdsRW5hYmxlQ2xpZW50U3RhdGVfRlVOQywKLQlnbEVuZF9GVU5DLAotCWdsRW5kTGlzdF9GVU5DLAotCWdsRXZhbENvb3JkMWRfRlVOQywKLQlnbEV2YWxDb29yZDFkdl9GVU5DLAotCWdsRXZhbENvb3JkMWZfRlVOQywKLQlnbEV2YWxDb29yZDFmdl9GVU5DLAotCWdsRXZhbENvb3JkMmRfRlVOQywKLQlnbEV2YWxDb29yZDJkdl9GVU5DLAotCWdsRXZhbENvb3JkMmZfRlVOQywKLQlnbEV2YWxDb29yZDJmdl9GVU5DLAotCWdsRXZhbE1lc2gxX0ZVTkMsCi0JZ2xFdmFsTWVzaDJfRlVOQywKLQlnbEV2YWxQb2ludDFfRlVOQywKLQlnbEV2YWxQb2ludDJfRlVOQywKLQlnbEZlZWRiYWNrQnVmZmVyX0ZVTkMsCi0JZ2xGaW5pc2hfRlVOQywKLQlnbEZsdXNoX0ZVTkMsCi0JZ2xGb2dmX0ZVTkMsCi0JZ2xGb2dmdl9GVU5DLAotCWdsRm9naV9GVU5DLAotCWdsRm9naXZfRlVOQywKLQlnbEZyb250RmFjZV9GVU5DLAotCWdsRnJ1c3R1bV9GVU5DLAotCWdsR2VuTGlzdHNfRlVOQywKLQlnbEdlblRleHR1cmVzX0ZVTkMsCi0JZ2xHZXRCb29sZWFudl9GVU5DLAotCWdsR2V0Q2xpcFBsYW5lX0ZVTkMsCi0JZ2xHZXREb3VibGV2X0ZVTkMsCi0JZ2xHZXRFcnJvcl9GVU5DLAotCWdsR2V0RmxvYXR2X0ZVTkMsCi0JZ2xHZXRJbnRlZ2Vydl9GVU5DLAotCWdsR2V0TGlnaHRmdl9GVU5DLAotCWdsR2V0TGlnaHRpdl9GVU5DLAotCWdsR2V0TWFwZHZfRlVOQywKLQlnbEdldE1hcGZ2X0ZVTkMsCi0JZ2xHZXRNYXBpdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxmdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxpdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXBmdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXB1aXZfRlVOQywKLQlnbEdldFBpeGVsTWFwdXN2X0ZVTkMsCi0JZ2xHZXRQb2ludGVydl9GVU5DLAotCWdsR2V0UG9seWdvblN0aXBwbGVfRlVOQywKLQlnbEdldFN0cmluZ19GVU5DLAotCWdsR2V0VGV4RW52ZnZfRlVOQywKLQlnbEdldFRleEVudml2X0ZVTkMsCi0JZ2xHZXRUZXhHZW5kdl9GVU5DLAotCWdsR2V0VGV4R2VuZnZfRlVOQywKLQlnbEdldFRleEdlbml2X0ZVTkMsCi0JZ2xHZXRUZXhJbWFnZV9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DLAotCWdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQywKLQlnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMsCi0JZ2xIaW50X0ZVTkMsCi0JZ2xJbmRleE1hc2tfRlVOQywKLQlnbEluZGV4UG9pbnRlcl9GVU5DLAotCWdsSW5kZXhkX0ZVTkMsCi0JZ2xJbmRleGR2X0ZVTkMsCi0JZ2xJbmRleGZfRlVOQywKLQlnbEluZGV4ZnZfRlVOQywKLQlnbEluZGV4aV9GVU5DLAotCWdsSW5kZXhpdl9GVU5DLAotCWdsSW5kZXhzX0ZVTkMsCi0JZ2xJbmRleHN2X0ZVTkMsCi0JZ2xJbml0TmFtZXNfRlVOQywKLQlnbEludGVybGVhdmVkQXJyYXlzX0ZVTkMsCi0JZ2xJc0VuYWJsZWRfRlVOQywKLQlnbElzTGlzdF9GVU5DLAotCWdsSXNUZXh0dXJlX0ZVTkMsCi0JZ2xMaWdodE1vZGVsZl9GVU5DLAotCWdsTGlnaHRNb2RlbGZ2X0ZVTkMsCi0JZ2xMaWdodE1vZGVsaV9GVU5DLAotCWdsTGlnaHRNb2RlbGl2X0ZVTkMsCi0JZ2xMaWdodGZfRlVOQywKLQlnbExpZ2h0ZnZfRlVOQywKLQlnbExpZ2h0aV9GVU5DLAotCWdsTGlnaHRpdl9GVU5DLAotCWdsTGluZVN0aXBwbGVfRlVOQywKLQlnbExpbmVXaWR0aF9GVU5DLAotCWdsTGlzdEJhc2VfRlVOQywKLQlnbExvYWRJZGVudGl0eV9GVU5DLAotCWdsTG9hZE1hdHJpeGRfRlVOQywKLQlnbExvYWRNYXRyaXhmX0ZVTkMsCi0JZ2xMb2FkTmFtZV9GVU5DLAotCWdsTG9naWNPcF9GVU5DLAotCWdsTWFwMWRfRlVOQywKLQlnbE1hcDFmX0ZVTkMsCi0JZ2xNYXAyZF9GVU5DLAotCWdsTWFwMmZfRlVOQywKLQlnbE1hcEdyaWQxZF9GVU5DLAotCWdsTWFwR3JpZDFmX0ZVTkMsCi0JZ2xNYXBHcmlkMmRfRlVOQywKLQlnbE1hcEdyaWQyZl9GVU5DLAotCWdsTWF0ZXJpYWxmX0ZVTkMsCi0JZ2xNYXRlcmlhbGZ2X0ZVTkMsCi0JZ2xNYXRlcmlhbGlfRlVOQywKLQlnbE1hdGVyaWFsaXZfRlVOQywKLQlnbE1hdHJpeE1vZGVfRlVOQywKLQlnbE11bHRNYXRyaXhkX0ZVTkMsCi0JZ2xNdWx0TWF0cml4Zl9GVU5DLAotCWdsTmV3TGlzdF9GVU5DLAotCWdsTm9ybWFsM2JfRlVOQywKLQlnbE5vcm1hbDNidl9GVU5DLAotCWdsTm9ybWFsM2RfRlVOQywKLQlnbE5vcm1hbDNkdl9GVU5DLAotCWdsTm9ybWFsM2ZfRlVOQywKLQlnbE5vcm1hbDNmdl9GVU5DLAotCWdsTm9ybWFsM2lfRlVOQywKLQlnbE5vcm1hbDNpdl9GVU5DLAotCWdsTm9ybWFsM3NfRlVOQywKLQlnbE5vcm1hbDNzdl9GVU5DLAotCWdsTm9ybWFsUG9pbnRlcl9GVU5DLAotCWdsT3J0aG9fRlVOQywKLQlnbFBhc3NUaHJvdWdoX0ZVTkMsCi0JZ2xQaXhlbE1hcGZ2X0ZVTkMsCi0JZ2xQaXhlbE1hcHVpdl9GVU5DLAotCWdsUGl4ZWxNYXB1c3ZfRlVOQywKLQlnbFBpeGVsU3RvcmVmX0ZVTkMsCi0JZ2xQaXhlbFN0b3JlaV9GVU5DLAotCWdsUGl4ZWxUcmFuc2ZlcmZfRlVOQywKLQlnbFBpeGVsVHJhbnNmZXJpX0ZVTkMsCi0JZ2xQaXhlbFpvb21fRlVOQywKLQlnbFBvaW50U2l6ZV9GVU5DLAotCWdsUG9seWdvbk1vZGVfRlVOQywKLQlnbFBvbHlnb25PZmZzZXRfRlVOQywKLQlnbFBvbHlnb25TdGlwcGxlX0ZVTkMsCi0JZ2xQb3BBdHRyaWJfRlVOQywKLQlnbFBvcENsaWVudEF0dHJpYl9GVU5DLAotCWdsUG9wTWF0cml4X0ZVTkMsCi0JZ2xQb3BOYW1lX0ZVTkMsCi0JZ2xQcmlvcml0aXplVGV4dHVyZXNfRlVOQywKLQlnbFB1c2hBdHRyaWJfRlVOQywKLQlnbFB1c2hDbGllbnRBdHRyaWJfRlVOQywKLQlnbFB1c2hNYXRyaXhfRlVOQywKLQlnbFB1c2hOYW1lX0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZF9GVU5DLAotCWdsUmFzdGVyUG9zMmR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZl9GVU5DLAotCWdsUmFzdGVyUG9zMmZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyaV9GVU5DLAotCWdsUmFzdGVyUG9zMml2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Myc19GVU5DLAotCWdsUmFzdGVyUG9zMnN2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZF9GVU5DLAotCWdsUmFzdGVyUG9zM2R2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZl9GVU5DLAotCWdsUmFzdGVyUG9zM2Z2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzaV9GVU5DLAotCWdsUmFzdGVyUG9zM2l2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Mzc19GVU5DLAotCWdsUmFzdGVyUG9zM3N2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0ZF9GVU5DLAotCWdsUmFzdGVyUG9zNGR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0Zl9GVU5DLAotCWdsUmFzdGVyUG9zNGZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0aV9GVU5DLAotCWdsUmFzdGVyUG9zNGl2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0c19GVU5DLAotCWdsUmFzdGVyUG9zNHN2X0ZVTkMsCi0JZ2xSZWFkQnVmZmVyX0ZVTkMsCi0JZ2xSZWFkUGl4ZWxzX0ZVTkMsCi0JZ2xSZWN0ZF9GVU5DLAotCWdsUmVjdGR2X0ZVTkMsCi0JZ2xSZWN0Zl9GVU5DLAotCWdsUmVjdGZ2X0ZVTkMsCi0JZ2xSZWN0aV9GVU5DLAotCWdsUmVjdGl2X0ZVTkMsCi0JZ2xSZWN0c19GVU5DLAotCWdsUmVjdHN2X0ZVTkMsCi0JZ2xSZW5kZXJNb2RlX0ZVTkMsCi0JZ2xSb3RhdGVkX0ZVTkMsCi0JZ2xSb3RhdGVmX0ZVTkMsCi0JZ2xTY2FsZWRfRlVOQywKLQlnbFNjYWxlZl9GVU5DLAotCWdsU2Npc3Nvcl9GVU5DLAotCWdsU2VsZWN0QnVmZmVyX0ZVTkMsCi0JZ2xTaGFkZU1vZGVsX0ZVTkMsCi0JZ2xTdGVuY2lsRnVuY19GVU5DLAotCWdsU3RlbmNpbE1hc2tfRlVOQywKLQlnbFN0ZW5jaWxPcF9GVU5DLAotCWdsVGV4Q29vcmQxZF9GVU5DLAotCWdsVGV4Q29vcmQxZHZfRlVOQywKLQlnbFRleENvb3JkMWZfRlVOQywKLQlnbFRleENvb3JkMWZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDFpX0ZVTkMsCi0JZ2xUZXhDb29yZDFpdl9GVU5DLAotCWdsVGV4Q29vcmQxc19GVU5DLAotCWdsVGV4Q29vcmQxc3ZfRlVOQywKLQlnbFRleENvb3JkMmRfRlVOQywKLQlnbFRleENvb3JkMmR2X0ZVTkMsCi0JZ2xUZXhDb29yZDJmX0ZVTkMsCi0JZ2xUZXhDb29yZDJmdl9GVU5DLAotCWdsVGV4Q29vcmQyaV9GVU5DLAotCWdsVGV4Q29vcmQyaXZfRlVOQywKLQlnbFRleENvb3JkMnNfRlVOQywKLQlnbFRleENvb3JkMnN2X0ZVTkMsCi0JZ2xUZXhDb29yZDNkX0ZVTkMsCi0JZ2xUZXhDb29yZDNkdl9GVU5DLAotCWdsVGV4Q29vcmQzZl9GVU5DLAotCWdsVGV4Q29vcmQzZnZfRlVOQywKLQlnbFRleENvb3JkM2lfRlVOQywKLQlnbFRleENvb3JkM2l2X0ZVTkMsCi0JZ2xUZXhDb29yZDNzX0ZVTkMsCi0JZ2xUZXhDb29yZDNzdl9GVU5DLAotCWdsVGV4Q29vcmQ0ZF9GVU5DLAotCWdsVGV4Q29vcmQ0ZHZfRlVOQywKLQlnbFRleENvb3JkNGZfRlVOQywKLQlnbFRleENvb3JkNGZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDRpX0ZVTkMsCi0JZ2xUZXhDb29yZDRpdl9GVU5DLAotCWdsVGV4Q29vcmQ0c19GVU5DLAotCWdsVGV4Q29vcmQ0c3ZfRlVOQywKLQlnbFRleENvb3JkUG9pbnRlcl9GVU5DLAotCWdsVGV4RW52Zl9GVU5DLAotCWdsVGV4RW52ZnZfRlVOQywKLQlnbFRleEVudmlfRlVOQywKLQlnbFRleEVudml2X0ZVTkMsCi0JZ2xUZXhHZW5kX0ZVTkMsCi0JZ2xUZXhHZW5kdl9GVU5DLAotCWdsVGV4R2VuZl9GVU5DLAotCWdsVGV4R2VuZnZfRlVOQywKLQlnbFRleEdlbmlfRlVOQywKLQlnbFRleEdlbml2X0ZVTkMsCi0JZ2xUZXhJbWFnZTFEX0ZVTkMsCi0JZ2xUZXhJbWFnZTJEX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaV9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaXZfRlVOQywKLQlnbFRleFN1YkltYWdlMURfRlVOQywKLQlnbFRleFN1YkltYWdlMkRfRlVOQywKLQlnbFRyYW5zbGF0ZWRfRlVOQywKLQlnbFRyYW5zbGF0ZWZfRlVOQywKLQlnbFZlcnRleDJkX0ZVTkMsCi0JZ2xWZXJ0ZXgyZHZfRlVOQywKLQlnbFZlcnRleDJmX0ZVTkMsCi0JZ2xWZXJ0ZXgyZnZfRlVOQywKLQlnbFZlcnRleDJpX0ZVTkMsCi0JZ2xWZXJ0ZXgyaXZfRlVOQywKLQlnbFZlcnRleDJzX0ZVTkMsCi0JZ2xWZXJ0ZXgyc3ZfRlVOQywKLQlnbFZlcnRleDNkX0ZVTkMsCi0JZ2xWZXJ0ZXgzZHZfRlVOQywKLQlnbFZlcnRleDNmX0ZVTkMsCi0JZ2xWZXJ0ZXgzZnZfRlVOQywKLQlnbFZlcnRleDNpX0ZVTkMsCi0JZ2xWZXJ0ZXgzaXZfRlVOQywKLQlnbFZlcnRleDNzX0ZVTkMsCi0JZ2xWZXJ0ZXgzc3ZfRlVOQywKLQlnbFZlcnRleDRkX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZHZfRlVOQywKLQlnbFZlcnRleDRmX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZnZfRlVOQywKLQlnbFZlcnRleDRpX0ZVTkMsCi0JZ2xWZXJ0ZXg0aXZfRlVOQywKLQlnbFZlcnRleDRzX0ZVTkMsCi0JZ2xWZXJ0ZXg0c3ZfRlVOQywKLQlnbFZlcnRleFBvaW50ZXJfRlVOQywKLQlnbFZpZXdwb3J0X0ZVTkMsCi19IEdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDkwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTk2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2luY2x1ZGUgImdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNzA3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNkZWZpbmUgR0xVX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTFVfIyNmdW5jCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5DdXJ2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCZWdpbkN1cnZlX0ZVTkMpOwotCWdsdUJlZ2luQ3VydmUoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5DdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luUG9seWdvbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luUG9seWdvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLQlnbHVCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luU3VyZmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luU3VyZmFjZV9GVU5DKTsKLQlnbHVCZWdpblN1cmZhY2UoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5TdXJmYWNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5UcmltCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QmVnaW5UcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QmVnaW5UcmltX0ZVTkMpOwotCWdsdUJlZ2luVHJpbSgoR0xVbnVyYnMgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVCZWdpblRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVCdWlsZDFETWlwbWFwcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJ1aWxkMURNaXBtYXBzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QnVpbGQxRE1pcG1hcHNfRlVOQyk7Ci0JcmMgPSAoamludClnbHVCdWlsZDFETWlwbWFwcyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCAoY29uc3Qgdm9pZCAqKWFyZzUpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMURNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJ1aWxkMkRNaXBtYXBzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QnVpbGQyRE1pcG1hcHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamJ5dGVBcnJheSBhcmc2KQotewotCWpieXRlICpscGFyZzY9TlVMTDsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCdWlsZDJETWlwbWFwc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JfQotCXJjID0gKGppbnQpZ2x1QnVpbGQyRE1pcG1hcHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUN5bGluZGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1Q3lsaW5kZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1Q3lsaW5kZXJfRlVOQyk7Ci0JZ2x1Q3lsaW5kZXIoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVDeWxpbmRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdURlbGV0ZU51cmJzUmVuZGVyZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVEZWxldGVOdXJic1JlbmRlcmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcl9GVU5DKTsKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyKChHTFVudXJicyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZU51cmJzUmVuZGVyZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVRdWFkcmljCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlUXVhZHJpYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci0JZ2x1RGVsZXRlUXVhZHJpYygoR0xVcXVhZHJpYyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVUZXNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlVGVzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci0JZ2x1RGVsZXRlVGVzcygoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEaXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLQlnbHVEaXNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZEN1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RW5kQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLQlnbHVFbmRDdXJ2ZSgoR0xVbnVyYnNPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRQb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kUG9seWdvbl9GVU5DKTsKLQlnbHVFbmRQb2x5Z29uKChHTFV0cmlhbmd1bGF0b3JPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1RW5kU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVuZFN1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRTdXJmYWNlX0ZVTkMpOwotCWdsdUVuZFN1cmZhY2UoKEdMVW51cmJzT2JqICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RW5kU3VyZmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFRyaW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRUcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kVHJpbV9GVU5DKTsKLQlnbHVFbmRUcmltKChHTFVudXJic09iaiAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVuZFRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVFcnJvclN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVycm9yU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFcnJvclN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUVycm9yU3RyaW5nKGFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVycm9yU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUdldE51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXROdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1R2V0TnVyYnNQcm9wZXJ0eSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVHZXRTdHJpbmcKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldFN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUdldFN0cmluZyhhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRTdHJpbmdfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1R2V0VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1R2V0VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlQXJyYXkgYXJnMikKLXsKLQlqZG91YmxlICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1R2V0VGVzc1Byb3BlcnR5X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbHVHZXRUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVMb2FkU2FtcGxpbmdNYXRyaWNlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXMoKEdMVW51cmJzICopYXJnMCwgbHBhcmcxLCBscGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TG9va0F0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TG9va0F0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMywgamRvdWJsZSBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamRvdWJsZSBhcmc3LCBqZG91YmxlIGFyZzgpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUxvb2tBdF9GVU5DKTsKLQlnbHVMb29rQXQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TG9va0F0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3TnVyYnNSZW5kZXJlcgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld051cmJzUmVuZGVyZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdOdXJic1JlbmRlcmVyX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3TnVyYnNSZW5kZXJlcigpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld051cmJzUmVuZGVyZXJfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3UXVhZHJpYwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1F1YWRyaWMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdRdWFkcmljX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3UXVhZHJpYygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1F1YWRyaWNfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3VGVzcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1Rlc3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdUZXNzX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3VGVzcygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1Rlc3NfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV4dENvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOZXh0Q29udG91cikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TmV4dENvbnRvdXJfRlVOQyk7Ci0JZ2x1TmV4dENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOZXh0Q29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzQ2FsbGJhY2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic0NhbGxiYWNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1TnVyYnNDYWxsYmFjaygoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCAoR0x2b2lkKCopKWFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic0N1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TnVyYnNDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqZmxvYXRBcnJheSBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWpmbG9hdCAqbHBhcmc0PU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNDdXJ2ZSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIsIGFyZzMsIGxwYXJnNCwgYXJnNSwgYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TnVyYnNDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TnVyYnNQcm9wZXJ0eV9GVU5DKTsKLQlnbHVOdXJic1Byb3BlcnR5KChHTFVudXJicyAqKWFyZzAsIGFyZzEsIGFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic1N1cmZhY2UKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1N1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIsIGppbnQgYXJnMywgamZsb2F0QXJyYXkgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGpmbG9hdEFycmF5IGFyZzcsIGppbnQgYXJnOCwgamludCBhcmc5LCBqaW50IGFyZzEwKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JamZsb2F0ICpscGFyZzQ9TlVMTDsKLQlqZmxvYXQgKmxwYXJnNz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNTdXJmYWNlKChHTFVudXJic09iaiAqKWFyZzAsIGFyZzEsIGxwYXJnMiwgYXJnMywgbHBhcmc0LCBhcmc1LCBhcmc2LCBscGFyZzcsIGFyZzgsIGFyZzksIGFyZzEwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVPcnRobzJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1T3J0aG8yRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU9ydGhvMkRfRlVOQyk7Ci0JZ2x1T3J0aG8yRChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVPcnRobzJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UGFydGlhbERpc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQYXJ0aWFsRGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamRvdWJsZSBhcmc1LCBqZG91YmxlIGFyZzYpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVBhcnRpYWxEaXNrX0ZVTkMpOwotCWdsdVBhcnRpYWxEaXNrKChHTFVxdWFkcmljICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGFydGlhbERpc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQZXJzcGVjdGl2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVBlcnNwZWN0aXZlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci0JZ2x1UGVyc3BlY3RpdmUoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQaWNrTWF0cml4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UGlja01hdHJpeCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVQaWNrTWF0cml4X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCX0KLQlnbHVQaWNrTWF0cml4KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVBpY2tNYXRyaXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQcm9qZWN0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JcmMgPSAoamludClnbHVQcm9qZWN0KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMywgbHBhcmc0LCBscGFyZzUsIGxwYXJnNiwgbHBhcmc3LCBscGFyZzgpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UHdsQ3VydmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQd2xDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UHdsQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1UHdsQ3VydmUoKEdMVW51cmJzICopYXJnMCwgYXJnMSwgbHBhcmcyLCBhcmczLCBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVQd2xDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1UXVhZHJpY0NhbGxiYWNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljRHJhd1N0eWxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY0RyYXdTdHlsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLQlnbHVRdWFkcmljRHJhd1N0eWxlKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNOb3JtYWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY05vcm1hbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMpOwotCWdsdVF1YWRyaWNOb3JtYWxzKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY05vcm1hbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljT3JpZW50YXRpb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVRdWFkcmljT3JpZW50YXRpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNPcmllbnRhdGlvbl9GVU5DKTsKLQlnbHVRdWFkcmljT3JpZW50YXRpb24oKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljT3JpZW50YXRpb25fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljVGV4dHVyZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNUZXh0dXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamJvb2xlYW4gYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY1RleHR1cmVfRlVOQyk7Ci0JZ2x1UXVhZHJpY1RleHR1cmUoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVNjYWxlSW1hZ2UKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVTY2FsZUltYWdlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U2NhbGVJbWFnZV9GVU5DKTsKLQlyYyA9IChqaW50KWdsdVNjYWxlSW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKGNvbnN0IHZvaWQgKilhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCAodm9pZCAqKWFyZzgpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNjYWxlSW1hZ2VfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1U3BoZXJlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1U3BoZXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U3BoZXJlX0ZVTkMpOwotCWdsdVNwaGVyZSgoR0xVcXVhZHJpYyAqKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNwaGVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpbkNvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Db250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLQlnbHVUZXNzQmVnaW5Db250b3VyKChHTFV0ZXNzZWxhdG9yICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpblBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Qb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQmVnaW5Qb2x5Z29uX0ZVTkMpOwotCWdsdVRlc3NCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IgKilhcmcwLCAoR0x2b2lkICopYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1VGVzc0NhbGxiYWNrKChHTFV0ZXNzZWxhdG9yICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzRW5kQ29udG91cgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NFbmRDb250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0VuZENvbnRvdXJfRlVOQyk7Ci0JZ2x1VGVzc0VuZENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzRW5kQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NFbmRQb2x5Z29uCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc0VuZFBvbHlnb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzRW5kUG9seWdvbl9GVU5DKTsKLQlnbHVUZXNzRW5kUG9seWdvbigoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc05vcm1hbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NOb3JtYWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotCWdsdVRlc3NOb3JtYWwoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NQcm9wZXJ0eV9GVU5DKTsKLQlnbHVUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzVmVydGV4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1ZlcnRleCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxLCBqaW50IGFyZzIpCi17Ci0JamRvdWJsZSAqbHBhcmcxPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NWZXJ0ZXhfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsdVRlc3NWZXJ0ZXgoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBscGFyZzEsIChHTHZvaWQgKilhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc1ZlcnRleF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVVuUHJvamVjdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVVuUHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVVuUHJvamVjdF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlyYyA9IChqaW50KWdsdVVuUHJvamVjdChhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMsIGxwYXJnNCwgbHBhcmc1LCBscGFyZzYsIGxwYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVVblByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOGIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8T3BlbkdML2dsdS5oPgotI2Vsc2UKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPEdML2dsdS5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZmMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50ID0gNTE7Ci1pbnQgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzUxXTsKLWNoYXIgKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbHVCZWdpbkN1cnZlIiwgCi0JImdsdUJlZ2luUG9seWdvbiIsIAotCSJnbHVCZWdpblN1cmZhY2UiLCAKLQkiZ2x1QmVnaW5UcmltIiwgCi0JImdsdUJ1aWxkMURNaXBtYXBzIiwgCi0JImdsdUJ1aWxkMkRNaXBtYXBzIiwgCi0JImdsdUN5bGluZGVyIiwgCi0JImdsdURlbGV0ZU51cmJzUmVuZGVyZXIiLCAKLQkiZ2x1RGVsZXRlUXVhZHJpYyIsIAotCSJnbHVEZWxldGVUZXNzIiwgCi0JImdsdURpc2siLCAKLQkiZ2x1RW5kQ3VydmUiLCAKLQkiZ2x1RW5kUG9seWdvbiIsIAotCSJnbHVFbmRTdXJmYWNlIiwgCi0JImdsdUVuZFRyaW0iLCAKLQkiZ2x1RXJyb3JTdHJpbmciLCAKLQkiZ2x1R2V0TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVHZXRTdHJpbmciLCAKLQkiZ2x1R2V0VGVzc1Byb3BlcnR5IiwgCi0JImdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIiwgCi0JImdsdUxvb2tBdCIsIAotCSJnbHVOZXdOdXJic1JlbmRlcmVyIiwgCi0JImdsdU5ld1F1YWRyaWMiLCAKLQkiZ2x1TmV3VGVzcyIsIAotCSJnbHVOZXh0Q29udG91ciIsIAotCSJnbHVOdXJic0NhbGxiYWNrIiwgCi0JImdsdU51cmJzQ3VydmUiLCAKLQkiZ2x1TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVOdXJic1N1cmZhY2UiLCAKLQkiZ2x1T3J0aG8yRCIsIAotCSJnbHVQYXJ0aWFsRGlzayIsIAotCSJnbHVQZXJzcGVjdGl2ZSIsIAotCSJnbHVQaWNrTWF0cml4IiwgCi0JImdsdVByb2plY3QiLCAKLQkiZ2x1UHdsQ3VydmUiLCAKLQkiZ2x1UXVhZHJpY0NhbGxiYWNrIiwgCi0JImdsdVF1YWRyaWNEcmF3U3R5bGUiLCAKLQkiZ2x1UXVhZHJpY05vcm1hbHMiLCAKLQkiZ2x1UXVhZHJpY09yaWVudGF0aW9uIiwgCi0JImdsdVF1YWRyaWNUZXh0dXJlIiwgCi0JImdsdVNjYWxlSW1hZ2UiLCAKLQkiZ2x1U3BoZXJlIiwgCi0JImdsdVRlc3NCZWdpbkNvbnRvdXIiLCAKLQkiZ2x1VGVzc0JlZ2luUG9seWdvbiIsIAotCSJnbHVUZXNzQ2FsbGJhY2siLCAKLQkiZ2x1VGVzc0VuZENvbnRvdXIiLCAKLQkiZ2x1VGVzc0VuZFBvbHlnb24iLCAKLQkiZ2x1VGVzc05vcm1hbCIsIAotCSJnbHVUZXNzUHJvcGVydHkiLCAKLQkiZ2x1VGVzc1ZlcnRleCIsIAotCSJnbHVVblByb2plY3QiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTFVfMUdldEZ1bmN0aW9uQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlyZXR1cm4gR0xVX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci19Ci0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMVV8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xVX25hdGl2ZUZ1bmN0aW9uTmFtZXNbaW5kZXhdKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xVXzFHZXRGdW5jdGlvbkNhbGxDb3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNzNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWdsdUJlZ2luQ3VydmVfRlVOQywKLQlnbHVCZWdpblBvbHlnb25fRlVOQywKLQlnbHVCZWdpblN1cmZhY2VfRlVOQywKLQlnbHVCZWdpblRyaW1fRlVOQywKLQlnbHVCdWlsZDFETWlwbWFwc19GVU5DLAotCWdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMsCi0JZ2x1Q3lsaW5kZXJfRlVOQywKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyX0ZVTkMsCi0JZ2x1RGVsZXRlUXVhZHJpY19GVU5DLAotCWdsdURlbGV0ZVRlc3NfRlVOQywKLQlnbHVEaXNrX0ZVTkMsCi0JZ2x1RW5kQ3VydmVfRlVOQywKLQlnbHVFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1RW5kU3VyZmFjZV9GVU5DLAotCWdsdUVuZFRyaW1fRlVOQywKLQlnbHVFcnJvclN0cmluZ19GVU5DLAotCWdsdUdldE51cmJzUHJvcGVydHlfRlVOQywKLQlnbHVHZXRTdHJpbmdfRlVOQywKLQlnbHVHZXRUZXNzUHJvcGVydHlfRlVOQywKLQlnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DLAotCWdsdUxvb2tBdF9GVU5DLAotCWdsdU5ld051cmJzUmVuZGVyZXJfRlVOQywKLQlnbHVOZXdRdWFkcmljX0ZVTkMsCi0JZ2x1TmV3VGVzc19GVU5DLAotCWdsdU5leHRDb250b3VyX0ZVTkMsCi0JZ2x1TnVyYnNDYWxsYmFja19GVU5DLAotCWdsdU51cmJzQ3VydmVfRlVOQywKLQlnbHVOdXJic1Byb3BlcnR5X0ZVTkMsCi0JZ2x1TnVyYnNTdXJmYWNlX0ZVTkMsCi0JZ2x1T3J0aG8yRF9GVU5DLAotCWdsdVBhcnRpYWxEaXNrX0ZVTkMsCi0JZ2x1UGVyc3BlY3RpdmVfRlVOQywKLQlnbHVQaWNrTWF0cml4X0ZVTkMsCi0JZ2x1UHJvamVjdF9GVU5DLAotCWdsdVB3bEN1cnZlX0ZVTkMsCi0JZ2x1UXVhZHJpY0NhbGxiYWNrX0ZVTkMsCi0JZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DLAotCWdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMsCi0JZ2x1UXVhZHJpY09yaWVudGF0aW9uX0ZVTkMsCi0JZ2x1UXVhZHJpY1RleHR1cmVfRlVOQywKLQlnbHVTY2FsZUltYWdlX0ZVTkMsCi0JZ2x1U3BoZXJlX0ZVTkMsCi0JZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DLAotCWdsdVRlc3NCZWdpblBvbHlnb25fRlVOQywKLQlnbHVUZXNzQ2FsbGJhY2tfRlVOQywKLQlnbHVUZXNzRW5kQ29udG91cl9GVU5DLAotCWdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1VGVzc05vcm1hbF9GVU5DLAotCWdsdVRlc3NQcm9wZXJ0eV9GVU5DLAotCWdsdVRlc3NWZXJ0ZXhfRlVOQywKLQlnbHVVblByb2plY3RfRlVOQywKLX0gR0xVX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwY2U0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTFhY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNpbmNsdWRlICJnbHUuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAic3d0LmgiCi0KLWludCBJU19KTklfMV8yID0gMDsKLQotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKSB7Ci0JSVNfSk5JXzFfMiA9IDE7Ci0JcmV0dXJuIEpOSV9WRVJTSU9OXzFfMjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI5MDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5DX3N3dF9ICi0jZGVmaW5lIElOQ19zd3RfSAotCi0jaW5jbHVkZSAiam5pLmgiCi0KLS8qIEZvciBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGKHgpCi0vKiNkZWZpbmUgREVCVUdfUFJJTlRGKHgpIHByaW50ZiB4OyAqLwotCi0vKiBkZWZpbmUgdGhpcyB0byBwcmludCBvdXQgZGVidWcgc3RhdGVtZW50cyAqLwotLyogI2RlZmluZSBERUJVR19DQUxMX1BSSU5UUyAqLwotLyogI2RlZmluZSBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMgKi8KLQotI2lmZGVmIERFQlVHX0NBTExfUFJJTlRTCi0jZGVmaW5lIERFQlVHX0NBTEwoZnVuYykgZnByaW50ZihzdGRlcnIsIGZ1bmMpOwotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0FMTChmdW5jKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpIFwKLQlpZiAoYWRkcmVzcyA9PSAwKSB7IFwKLQkJamNsYXNzIGNsYXp6ID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAib3JnL2VjbGlwc2Uvc3d0L1NXVEVycm9yIik7IFwKLQkJaWYgKGNsYXp6ICE9IE5VTEwpIHsgXAotCQkJKCplbnYpLT5UaHJvd05ldyhlbnYsIGNsYXp6LCAiQXJndW1lbnQgY2Fubm90IGJlIE5VTEwiKTsgXAotCQl9IFwKLQkJcmV0dXJuOyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpCi0jZW5kaWYKLQotI2RlZmluZSBERUNMX0dMT0IocFN5bSkKLSNkZWZpbmUgUEdMT0IoeCkgeAotCi0jZGVmaW5lIE5BVElWRV9FTlRFUihlbnYsY2xhenosZnVuYykKLSNkZWZpbmUgTkFUSVZFX0VYSVQoZW52LGNsYXp6LGZ1bmMpCi0KLSNlbmRpZiAvKiBpZm5kZWYgSU5DX3N3dF9IICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFhNGZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi1wdWJsaWMgY2xhc3MgR0wgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSU0lPTl8xXzEgPSAxOwotCi0JLyogQWNjdW1PcCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNID0gMHgwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPQUQgPSAweDAxMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVUVVJOID0gMHgwMTAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01VTFQgPSAweDAxMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUREID0gMHgwMTA0OwotCi0JLyogQWxwaGFGdW5jdGlvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FVkVSID0gMHgwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MgPSAweDAyMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVQUwgPSAweDAyMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMID0gMHgwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUFURVIgPSAweDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9URVFVQUwgPSAweDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VRVUFMID0gMHgwMjA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMV0FZUyA9IDB4MDIwNzsKLQotCS8qIEF0dHJpYk1hc2sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0JJVCA9IDB4MDAwMDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX0JJVCA9IDB4MDAwMDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9CSVQgPSAweDAwMDAwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRV9CSVQgPSAweDAwMDAwMDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01PREVfQklUID0gMHgwMDAwMDAyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVElOR19CSVQgPSAweDAwMDAwMDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19CSVQgPSAweDAwMDAwMDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgPSAweDAwMDAwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNX0JVRkZFUl9CSVQgPSAweDAwMDAwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCA9IDB4MDAwMDA0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlRfQklUID0gMHgwMDAwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUkFOU0ZPUk1fQklUID0gMHgwMDAwMTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTkFCTEVfQklUID0gMHgwMDAwMjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9CVUZGRVJfQklUID0gMHgwMDAwNDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ISU5UX0JJVCA9IDB4MDAwMDgwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVZBTF9CSVQgPSAweDAwMDEwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfQklUID0gMHgwMDAyMDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJVCA9IDB4MDAwNDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CSVQgPSAweDAwMDgwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMTF9BVFRSSUJfQklUUyA9IDB4MDAwZmZmZmY7Ci0KLQkvKiBCZWdpbk1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMgPSAweDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORVMgPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9MT09QID0gMHgwMDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RSSVAgPSAweDAwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTID0gMHgwMDA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX1NUUklQID0gMHgwMDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX0ZBTiA9IDB4MDAwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEUyA9IDB4MDAwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEX1NUUklQID0gMHgwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT04gPSAweDAwMDk7Ci0KLQkvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aRVJPID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19DT0xPUiA9IDB4MDMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SID0gMHgwMzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQSA9IDB4MDMwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBID0gMHgwMzAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9BTFBIQSA9IDB4MDMwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBID0gMHgwMzA1OwotCi0JLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLQkvKiAgICAgIEdMX1pFUk8gKi8KLQkvKiAgICAgIEdMX09ORSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9DT0xPUiA9IDB4MDMwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SID0gMHgwMzA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSA9IDB4MDMwODsKLQkvKiAgICAgIEdMX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0JLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCi0KLQkvKiBCb29sZWFuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJVRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFMU0UgPSAwOwotCi0JLyogQ2xlYXJCdWZmZXJNYXNrICovCi0JLyogICAgICBHTF9DT0xPUl9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9BQ0NVTV9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgKi8KLQkvKiAgICAgIEdMX0RFUFRIX0JVRkZFUl9CSVQgKi8KLQotCS8qIENsaWVudEFycmF5VHlwZSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0KLQkvKiBDbGlwUGxhbmVOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTAgPSAweDMwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTEgPSAweDMwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTIgPSAweDMwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTMgPSAweDMwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTQgPSAweDMwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTUgPSAweDMwMDU7Ci0KLQkvKiBDb2xvck1hdGVyaWFsRmFjZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9BTUJJRU5UICovCi0JLyogICAgICBHTF9ESUZGVVNFICovCi0JLyogICAgICBHTF9TUEVDVUxBUiAqLwotCS8qICAgICAgR0xfRU1JU1NJT04gKi8KLQkvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLQotCS8qIENvbG9yUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX0JZVEUgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9VTlNJR05FRF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9VTlNJR05FRF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIEN1bGxGYWNlTW9kZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBEYXRhVHlwZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JZVEUgPSAweDE0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfQllURSA9IDB4MTQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSE9SVCA9IDB4MTQwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVCA9IDB4MTQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlQgPSAweDE0MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfSU5UID0gMHgxNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUID0gMHgxNDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzJfQllURVMgPSAweDE0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfM19CWVRFUyA9IDB4MTQwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF80X0JZVEVTID0gMHgxNDA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPVUJMRSA9IDB4MTQwQTsKLQotCS8qIERlcHRoRnVuY3Rpb24gKi8KLQkvKiAgICAgIEdMX05FVkVSICovCi0JLyogICAgICBHTF9MRVNTICovCi0JLyogICAgICBHTF9FUVVBTCAqLwotCS8qICAgICAgR0xfTEVRVUFMICovCi0JLyogICAgICBHTF9HUkVBVEVSICovCi0JLyogICAgICBHTF9OT1RFUVVBTCAqLwotCS8qICAgICAgR0xfR0VRVUFMICovCi0JLyogICAgICBHTF9BTFdBWVMgKi8KLQotCS8qIERyYXdCdWZmZXJNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfTEVGVCA9IDB4MDQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9SSUdIVCA9IDB4MDQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLX0xFRlQgPSAweDA0MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkFDS19SSUdIVCA9IDB4MDQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVCA9IDB4MDQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLID0gMHgwNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFRlQgPSAweDA0MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUklHSFQgPSAweDA0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgPSAweDA0MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMCA9IDB4MDQwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BVVgxID0gMHgwNDBBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVWDIgPSAweDA0MEI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMyA9IDB4MDQwQzsKLQotCS8qIEVuYWJsZSAqLwotCS8qICAgICAgR0xfRk9HICovCi0JLyogICAgICBHTF9MSUdIVElORyAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8xRCAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8yRCAqLwotCS8qICAgICAgR0xfTElORV9TVElQUExFICovCi0JLyogICAgICBHTF9QT0xZR09OX1NUSVBQTEUgKi8KLQkvKiAgICAgIEdMX0NVTExfRkFDRSAqLwotCS8qICAgICAgR0xfQUxQSEFfVEVTVCAqLwotCS8qICAgICAgR0xfQkxFTkQgKi8KLQkvKiAgICAgIEdMX0lOREVYX0xPR0lDX09QICovCi0JLyogICAgICBHTF9DT0xPUl9MT0dJQ19PUCAqLwotCS8qICAgICAgR0xfRElUSEVSICovCi0JLyogICAgICBHTF9TVEVOQ0lMX1RFU1QgKi8KLQkvKiAgICAgIEdMX0RFUFRIX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUwICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FMSAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTIgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUzICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FNCAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTUgKi8KLQkvKiAgICAgIEdMX0xJR0hUMCAqLwotCS8qICAgICAgR0xfTElHSFQxICovCi0JLyogICAgICBHTF9MSUdIVDIgKi8KLQkvKiAgICAgIEdMX0xJR0hUMyAqLwotCS8qICAgICAgR0xfTElHSFQ0ICovCi0JLyogICAgICBHTF9MSUdIVDUgKi8KLQkvKiAgICAgIEdMX0xJR0hUNiAqLwotCS8qICAgICAgR0xfTElHSFQ3ICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9TICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9UICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9SICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9RICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAxX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDFfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDFfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCS8qICAgICAgR0xfTUFQMl9DT0xPUl80ICovCi0JLyogICAgICBHTF9NQVAyX0lOREVYICovCi0JLyogICAgICBHTF9NQVAyX05PUk1BTCAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzEgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USCAqLwotCS8qICAgICAgR0xfTElORV9TTU9PVEggKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fU01PT1RIICovCi0JLyogICAgICBHTF9TQ0lTU09SX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NPTE9SX01BVEVSSUFMICovCi0JLyogICAgICBHTF9OT1JNQUxJWkUgKi8KLQkvKiAgICAgIEdMX0FVVE9fTk9STUFMICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVkgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWSAqLwotCS8qICAgICAgR0xfQ09MT1JfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVkgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9MSU5FICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0KLQkvKiBFcnJvckNvZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9FTlVNID0gMHgwNTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfVkFMVUUgPSAweDA1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gPSAweDA1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfT1ZFUkZMT1cgPSAweDA1MDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfVU5ERVJGTE9XID0gMHgwNTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09VVF9PRl9NRU1PUlkgPSAweDA1MDU7Ci0KLQkvKiBGZWVkQmFja01vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8yRCA9IDB4MDYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRCA9IDB4MDYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUiA9IDB4MDYwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUl9URVhUVVJFID0gMHgwNjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzREX0NPTE9SX1RFWFRVUkUgPSAweDA2MDQ7Ci0KLQkvKiBGZWVkQmFja1Rva2VuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFTU19USFJPVUdIX1RPS0VOID0gMHgwNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1RPS0VOID0gMHgwNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfVE9LRU4gPSAweDA3MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9UT0tFTiA9IDB4MDcwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CSVRNQVBfVE9LRU4gPSAweDA3MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19QSVhFTF9UT0tFTiA9IDB4MDcwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT1BZX1BJWEVMX1RPS0VOID0gMHgwNzA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfUkVTRVRfVE9LRU4gPSAweDA3MDc7Ci0KLQkvKiBGb2dNb2RlICovCi0JLyogICAgICBHTF9MSU5FQVIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFAgPSAweDA4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhQMiA9IDB4MDgwMTsKLQotCS8qIEZvZ1BhcmFtZXRlciAqLwotCS8qICAgICAgR0xfRk9HX0NPTE9SICovCi0JLyogICAgICBHTF9GT0dfREVOU0lUWSAqLwotCS8qICAgICAgR0xfRk9HX0VORCAqLwotCS8qICAgICAgR0xfRk9HX0lOREVYICovCi0JLyogICAgICBHTF9GT0dfTU9ERSAqLwotCS8qICAgICAgR0xfRk9HX1NUQVJUICovCi0KLQkvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVyA9IDB4MDkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DQ1cgPSAweDA5MDE7Ci0KLQkvKiBHZXRNYXBUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0VGRiA9IDB4MEEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUkRFUiA9IDB4MEEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET01BSU4gPSAweDBBMDI7Ci0KLQkvKiBHZXRQaXhlbE1hcCAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fSSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1NfVE9fUyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1JfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0dfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0JfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0FfVE9fQSAqLwotCi0JLyogR2V0UG9pbnRlclRhcmdldCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSICovCi0KLQkvKiBHZXRUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0NPTE9SID0gMHgwQjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfSU5ERVggPSAweDBCMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwgPSAweDBCMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyA9IDB4MEIwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9DT0xPUiA9IDB4MEIwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWCA9IDB4MEIwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyA9IDB4MEIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTiA9IDB4MEIwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRCA9IDB4MEIwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSA9IDB4MEIwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TTU9PVEggPSAweDBCMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRSA9IDB4MEIxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX1JBTkdFID0gMHgwQjEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkgPSAweDBCMTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEggPSAweDBCMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSCA9IDB4MEIyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1dJRFRIX1JBTkdFID0gMHgwQjIyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkgPSAweDBCMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TVElQUExFID0gMHgwQjI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOID0gMHgwQjI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQgPSAweDBCMjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9NT0RFID0gMHgwQjMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSVNUX05FU1RJTkcgPSAweDBCMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9CQVNFID0gMHgwQjMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfSU5ERVggPSAweDBCMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9NT0RFID0gMHgwQjQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU01PT1RIID0gMHgwQjQxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRSA9IDB4MEI0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUcgPSAweDBCNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFID0gMHgwQjQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFID0gMHgwQjQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UX0ZBQ0UgPSAweDBCNDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRJTkcgPSAweDBCNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSID0gMHgwQjUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX1RXT19TSURFID0gMHgwQjUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX0FNQklFTlQgPSAweDBCNTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVfTU9ERUwgPSAweDBCNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUxfRkFDRSA9IDB4MEI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVIgPSAweDBCNTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUwgPSAweDBCNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HID0gMHgwQjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19JTkRFWCA9IDB4MEI2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfREVOU0lUWSA9IDB4MEI2MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfU1RBUlQgPSAweDBCNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0VORCA9IDB4MEI2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfTU9ERSA9IDB4MEI2NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfQ09MT1IgPSAweDBCNjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfUkFOR0UgPSAweDBCNzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfVEVTVCA9IDB4MEI3MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9XUklURU1BU0sgPSAweDBCNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgPSAweDBCNzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfRlVOQyA9IDB4MEI3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9DTEVBUl9WQUxVRSA9IDB4MEI4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1RFU1QgPSAweDBCOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSA9IDB4MEI5MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZVTkMgPSAweDBCOTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLID0gMHgwQjkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRkFJTCA9IDB4MEI5NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCA9IDB4MEI5NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyA9IDB4MEI5NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1JFRiA9IDB4MEI5NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyA9IDB4MEI5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfTU9ERSA9IDB4MEJBMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxJWkUgPSAweDBCQTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQgPSAweDBCQTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIID0gMHgwQkEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBCQTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9TVEFDS19ERVBUSCA9IDB4MEJBNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYID0gMHgwQkE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYID0gMHgwQkE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFUUklYID0gMHgwQkE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUVFJJQl9TVEFDS19ERVBUSCA9IDB4MEJCMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwQkIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1QgPSAweDBCQzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVF9GVU5DID0gMHgwQkMxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1RfUkVGID0gMHgwQkMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJVEhFUiA9IDB4MEJEMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1QgPSAweDBCRTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDID0gMHgwQkUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EID0gMHgwQkUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QX01PREUgPSAweDBCRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTE9HSUNfT1AgPSAweDBCRjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTE9HSUNfT1AgPSAweDBCRjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYX0JVRkZFUlMgPSAweDBDMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19CVUZGRVIgPSAweDBDMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVBRF9CVUZGRVIgPSAweDBDMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CT1ggPSAweDBDMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9URVNUID0gMHgwQzExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0NMRUFSX1ZBTFVFID0gMHgwQzIwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX1dSSVRFTUFTSyA9IDB4MEMyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSA9IDB4MEMyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9XUklURU1BU0sgPSAweDBDMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTU9ERSA9IDB4MEMzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBX01PREUgPSAweDBDMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFQlVGRkVSID0gMHgwQzMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURVJFTyA9IDB4MEMzMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJfTU9ERSA9IDB4MEM0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgPSAweDBDNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU01PT1RIX0hJTlQgPSAweDBDNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEhfSElOVCA9IDB4MEM1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UID0gMHgwQzUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19ISU5UID0gMHgwQzU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1MgPSAweDBDNjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9HRU5fVCA9IDB4MEM2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9SID0gMHgwQzYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1EgPSAweDBDNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fSSA9IDB4MEM3MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfU19UT19TID0gMHgwQzcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1IgPSAweDBDNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fRyA9IDB4MEM3MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19CID0gMHgwQzc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0EgPSAweDBDNzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1JfVE9fUiA9IDB4MEM3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfR19UT19HID0gMHgwQzc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0IgPSAweDBDNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0FfVE9fQSA9IDB4MEM3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgPSAweDBDQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1NfVE9fU19TSVpFID0gMHgwQ0IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1JfU0laRSA9IDB4MENCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgPSAweDBDQjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fQl9TSVpFID0gMHgwQ0I0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0FfU0laRSA9IDB4MENCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgPSAweDBDQjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0dfVE9fR19TSVpFID0gMHgwQ0I3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0JfU0laRSA9IDB4MENCODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgPSAweDBDQjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX1NXQVBfQllURVMgPSAweDBDRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX0xTQl9GSVJTVCA9IDB4MENGMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfUk9XX0xFTkdUSCA9IDB4MENGMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfU0tJUF9ST1dTID0gMHgwQ0YzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOUEFDS19TS0lQX1BJWEVMUyA9IDB4MENGNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UID0gMHgwQ0Y1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBQ0tfU1dBUF9CWVRFUyA9IDB4MEQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0xTQl9GSVJTVCA9IDB4MEQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX1JPV19MRU5HVEggPSAweDBEMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1JPV1MgPSAweDBEMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1BJWEVMUyA9IDB4MEQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0FMSUdOTUVOVCA9IDB4MEQwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVBfQ09MT1IgPSAweDBEMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQX1NURU5DSUwgPSAweDBEMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfU0hJRlQgPSAweDBEMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfT0ZGU0VUID0gMHgwRDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9TQ0FMRSA9IDB4MEQxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRURfQklBUyA9IDB4MEQxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aT09NX1ggPSAweDBEMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfWk9PTV9ZID0gMHgwRDE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX1NDQUxFID0gMHgwRDE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJQVMgPSAweDBEMTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9TQ0FMRSA9IDB4MEQxQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTFVFX0JJQVMgPSAweDBEMUI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfU0NBTEUgPSAweDBEMUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfQklBUyA9IDB4MEQxRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9TQ0FMRSA9IDB4MEQxRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CSUFTID0gMHgwRDFGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FVkFMX09SREVSID0gMHgwRDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSUdIVFMgPSAweDBEMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSVBfUExBTkVTID0gMHgwRDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgPSAweDBEMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BJWEVMX01BUF9UQUJMRSA9IDB4MEQzNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwRDM1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggPSAweDBEMzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX05BTUVfU1RBQ0tfREVQVEggPSAweDBEMzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBEMzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggPSAweDBEMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAweDBEM0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggPSAweDBEM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCUElYRUxfQklUUyA9IDB4MEQ1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9CSVRTID0gMHgwRDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9CSVRTID0gMHgwRDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJVFMgPSAweDBENTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTID0gMHgwRDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX0JJVFMgPSAweDBENTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQklUUyA9IDB4MEQ1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JJVFMgPSAweDBENTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fUkVEX0JJVFMgPSAweDBENTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fR1JFRU5fQklUUyA9IDB4MEQ1OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9CTFVFX0JJVFMgPSAweDBENUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fQUxQSEFfQklUUyA9IDB4MEQ1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OQU1FX1NUQUNLX0RFUFRIID0gMHgwRDcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVVE9fTk9STUFMID0gMHgwRDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfQ09MT1JfNCA9IDB4MEQ5MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0lOREVYID0gMHgwRDkxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfTk9STUFMID0gMHgwRDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8xID0gMHgwRDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8yID0gMHgwRDk0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8zID0gMHgwRDk1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF80ID0gMHgwRDk2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVkVSVEVYXzMgPSAweDBEOTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9WRVJURVhfNCA9IDB4MEQ5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0NPTE9SXzQgPSAweDBEQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9JTkRFWCA9IDB4MERCMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX05PUk1BTCA9IDB4MERCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSA9IDB4MERCMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMiA9IDB4MERCNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyA9IDB4MERCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCA9IDB4MERCNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1ZFUlRFWF8zID0gMHgwREI3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDJfVkVSVEVYXzQgPSAweDBEQjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9HUklEX0RPTUFJTiA9IDB4MEREMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0dSSURfU0VHTUVOVFMgPSAweDBERDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9HUklEX0RPTUFJTiA9IDB4MEREMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0dSSURfU0VHTUVOVFMgPSAweDBERDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV8xRCA9IDB4MERFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFXzJEID0gMHgwREUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSID0gMHgwREYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFID0gMHgwREYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFID0gMHgwREYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NFTEVDVElPTl9CVUZGRVJfUE9JTlRFUiA9IDB4MERGMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1RJT05fQlVGRkVSX1NJWkUgPSAweDBERjQ7Ci0JLyogICAgICBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQklORElOR18yRCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVlfU0laRSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1NUUklERSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICovCi0KLQkvKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XSURUSCA9IDB4MTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0hFSUdIVCA9IDB4MTAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVCA9IDB4MTAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiA9IDB4MTAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUiA9IDB4MTAwNTsKLQkvKiAgICAgIEdMX1RFWFRVUkVfUkVEX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfR1JFRU5fU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9CTFVFX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQUxQSEFfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9QUklPUklUWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9SRVNJREVOVCAqLwotCi0JLyogSGludE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET05UX0NBUkUgPSAweDExMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFTVEVTVCA9IDB4MTEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OSUNFU1QgPSAweDExMDI7Ci0KLQkvKiBIaW50VGFyZ2V0ICovCi0JLyogICAgICBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9MSU5FX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9GT0dfSElOVCAqLwotCS8qICAgICAgR0xfUEhPTkdfSElOVCAqLwotCi0JLyogSW5kZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCi0JLyogICAgICBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAqLwotCi0JLyogTGlnaHROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQwID0gMHg0MDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMSA9IDB4NDAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDIgPSAweDQwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQzID0gMHg0MDAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNCA9IDB4NDAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDUgPSAweDQwMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ2ID0gMHg0MDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNyA9IDB4NDAwNzsKLQotCS8qIExpZ2h0UGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU1CSUVOVCA9IDB4MTIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ESUZGVVNFID0gMHgxMjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQRUNVTEFSID0gMHgxMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPU0lUSU9OID0gMHgxMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRElSRUNUSU9OID0gMHgxMjA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRVhQT05FTlQgPSAweDEyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BPVF9DVVRPRkYgPSAweDEyMDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gPSAweDEyMDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OID0gMHgxMjA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiA9IDB4MTIwOTsKLQotCS8qIEludGVybGVhdmVkQXJyYXlzICovCi0JLyogICAgICBHTF9WMkYgKi8KLQkvKiAgICAgIEdMX1YzRiAqLwotCS8qICAgICAgR0xfQzRVQl9WMkYgKi8KLQkvKiAgICAgIEdMX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9DM0ZfVjNGICovCi0JLyogICAgICBHTF9OM0ZfVjNGICovCi0JLyogICAgICBHTF9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX1Y0RiAqLwotCS8qICAgICAgR0xfVDJGX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9UMkZfQzNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX04zRl9WM0YgKi8KLQkvKiAgICAgIEdMX1QyRl9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX0M0Rl9OM0ZfVjRGICovCi0KLQkvKiBMaXN0TW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTVBJTEUgPSAweDEzMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NUElMRV9BTkRfRVhFQ1VURSA9IDB4MTMwMTsKLQotCS8qIExpc3ROYW1lVHlwZSAqLwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMXzJfQllURVMgKi8KLQkvKiAgICAgIEdMXzNfQllURVMgKi8KLQkvKiAgICAgIEdMXzRfQllURVMgKi8KLQotCS8qIExvZ2ljT3AgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEVBUiA9IDB4MTUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkQgPSAweDE1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EX1JFVkVSU0UgPSAweDE1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09QWSA9IDB4MTUwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkRfSU5WRVJURUQgPSAweDE1MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9PUCA9IDB4MTUwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9YT1IgPSAweDE1MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1IgPSAweDE1MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9SID0gMHgxNTA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VRVUlWID0gMHgxNTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkVSVCA9IDB4MTUwQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUl9SRVZFUlNFID0gMHgxNTBCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFlfSU5WRVJURUQgPSAweDE1MEM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfSU5WRVJURUQgPSAweDE1MEQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkFORCA9IDB4MTUwRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRVQgPSAweDE1MEY7Ci0KLQkvKiBNYXBUYXJnZXQgKi8KLQkvKiAgICAgIEdMX01BUDFfQ09MT1JfNCAqLwotCS8qICAgICAgR0xfTUFQMV9JTkRFWCAqLwotCS8qICAgICAgR0xfTUFQMV9OT1JNQUwgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF80ICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAyX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDJfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDJfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCi0JLyogTWF0ZXJpYWxGYWNlICovCi0JLyogICAgICBHTF9GUk9OVCAqLwotCS8qICAgICAgR0xfQkFDSyAqLwotCS8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLQotCS8qIE1hdGVyaWFsUGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRU1JU1NJT04gPSAweDE2MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hJTklORVNTID0gMHgxNjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgPSAweDE2MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVhFUyA9IDB4MTYwMzsKLQkvKiAgICAgIEdMX0FNQklFTlQgKi8KLQkvKiAgICAgIEdMX0RJRkZVU0UgKi8KLQkvKiAgICAgIEdMX1NQRUNVTEFSICovCi0KLQkvKiBNYXRyaXhNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXID0gMHgxNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT04gPSAweDE3MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRSA9IDB4MTcwMjsKLQotCS8qIE1lc2hNb2RlMSAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQotCS8qIE1lc2hNb2RlMiAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQkvKiAgICAgIEdMX0ZJTEwgKi8KLQotCS8qIE5vcm1hbFBvaW50ZXJUeXBlICovCi0JLyogICAgICBHTF9CWVRFICovCi0JLyogICAgICBHTF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9GTE9BVCAqLwotCS8qICAgICAgR0xfRE9VQkxFICovCi0KLQkvKiBQaXhlbENvcHlUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1IgPSAweDE4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEggPSAweDE4MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTCA9IDB4MTgwMjsKLQotCS8qIFBpeGVsRm9ybWF0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVggPSAweDE5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWCA9IDB4MTkwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQgPSAweDE5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEID0gMHgxOTAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOID0gMHgxOTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMVUUgPSAweDE5MDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEEgPSAweDE5MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCID0gMHgxOTA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEgPSAweDE5MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFID0gMHgxOTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRV9BTFBIQSA9IDB4MTkwQTsKLQotCS8qIFBpeGVsTWFwICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19JICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfU19UT19TICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19BICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfUl9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfR19UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQl9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQV9UT19BICovCi0KLQkvKiBQaXhlbFN0b3JlICovCi0JLyogICAgICBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfVU5QQUNLX1JPV19MRU5HVEggKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1JPV1MgKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0FMSUdOTUVOVCAqLwotCS8qICAgICAgR0xfUEFDS19TV0FQX0JZVEVTICovCi0JLyogICAgICBHTF9QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfUEFDS19ST1dfTEVOR1RIICovCi0JLyogICAgICBHTF9QQUNLX1NLSVBfUk9XUyAqLwotCS8qICAgICAgR0xfUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfUEFDS19BTElHTk1FTlQgKi8KLQotCS8qIFBpeGVsVHJhbnNmZXIgKi8KLQkvKiAgICAgIEdMX01BUF9DT0xPUiAqLwotCS8qICAgICAgR0xfTUFQX1NURU5DSUwgKi8KLQkvKiAgICAgIEdMX0lOREVYX1NISUZUICovCi0JLyogICAgICBHTF9JTkRFWF9PRkZTRVQgKi8KLQkvKiAgICAgIEdMX1JFRF9TQ0FMRSAqLwotCS8qICAgICAgR0xfUkVEX0JJQVMgKi8KLQkvKiAgICAgIEdMX0dSRUVOX1NDQUxFICovCi0JLyogICAgICBHTF9HUkVFTl9CSUFTICovCi0JLyogICAgICBHTF9CTFVFX1NDQUxFICovCi0JLyogICAgICBHTF9CTFVFX0JJQVMgKi8KLQkvKiAgICAgIEdMX0FMUEhBX1NDQUxFICovCi0JLyogICAgICBHTF9BTFBIQV9CSUFTICovCi0JLyogICAgICBHTF9ERVBUSF9TQ0FMRSAqLwotCS8qICAgICAgR0xfREVQVEhfQklBUyAqLwotCi0JLyogUGl4ZWxUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQklUTUFQID0gMHgxQTAwOwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQotCS8qIFBvbHlnb25Nb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlQgPSAweDFCMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORSA9IDB4MUIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSUxMID0gMHgxQjAyOwotCi0JLyogUmVhZEJ1ZmZlck1vZGUgKi8KLQkvKiAgICAgIEdMX0ZST05UX0xFRlQgKi8KLQkvKiAgICAgIEdMX0ZST05UX1JJR0hUICovCi0JLyogICAgICBHTF9CQUNLX0xFRlQgKi8KLQkvKiAgICAgIEdMX0JBQ0tfUklHSFQgKi8KLQkvKiAgICAgIEdMX0ZST05UICovCi0JLyogICAgICBHTF9CQUNLICovCi0JLyogICAgICBHTF9MRUZUICovCi0JLyogICAgICBHTF9SSUdIVCAqLwotCS8qICAgICAgR0xfQVVYMCAqLwotCS8qICAgICAgR0xfQVVYMSAqLwotCS8qICAgICAgR0xfQVVYMiAqLwotCS8qICAgICAgR0xfQVVYMyAqLwotCi0JLyogUmVuZGVyaW5nTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUiA9IDB4MUMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GRUVEQkFDSyA9IDB4MUMwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1QgPSAweDFDMDI7Ci0KLQkvKiBTaGFkaW5nTW9kZWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTEFUID0gMHgxRDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USCA9IDB4MUQwMTsKLQotCS8qIFN0ZW5jaWxGdW5jdGlvbiAqLwotCS8qICAgICAgR0xfTkVWRVIgKi8KLQkvKiAgICAgIEdMX0xFU1MgKi8KLQkvKiAgICAgIEdMX0VRVUFMICovCi0JLyogICAgICBHTF9MRVFVQUwgKi8KLQkvKiAgICAgIEdMX0dSRUFURVIgKi8KLQkvKiAgICAgIEdMX05PVEVRVUFMICovCi0JLyogICAgICBHTF9HRVFVQUwgKi8KLQkvKiAgICAgIEdMX0FMV0FZUyAqLwotCi0JLyogU3RlbmNpbE9wICovCi0JLyogICAgICBHTF9aRVJPICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfS0VFUCA9IDB4MUUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBMQUNFID0gMHgxRTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1IgPSAweDFFMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUiA9IDB4MUUwMzsKLQkvKiAgICAgIEdMX0lOVkVSVCAqLwotCi0JLyogU3RyaW5nTmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFTkRPUiA9IDB4MUYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJFUiA9IDB4MUYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJTSU9OID0gMHgxRjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYVEVOU0lPTlMgPSAweDFGMDM7Ci0KLQkvKiBUZXh0dXJlQ29vcmROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUyA9IDB4MjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UID0gMHgyMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IgPSAweDIwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUSA9IDB4MjAwMzsKLQotCS8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIFRleHR1cmVFbnZNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9EVUxBVEUgPSAweDIxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDQUwgPSAweDIxMDE7Ci0JLyogICAgICBHTF9CTEVORCAqLwotCS8qICAgICAgR0xfUkVQTEFDRSAqLwotCi0JLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgPSAweDIyMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlZfQ09MT1IgPSAweDIyMDE7Ci0KLQkvKiBUZXh0dXJlRW52VGFyZ2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlYgPSAweDIzMDA7Ci0KLQkvKiBUZXh0dXJlR2VuTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9MSU5FQVIgPSAweDI0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX0xJTkVBUiA9IDB4MjQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUEhFUkVfTUFQID0gMHgyNDAyOwotCi0JLyogVGV4dHVyZUdlblBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgPSAweDI1MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX1BMQU5FID0gMHgyNTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9QTEFORSA9IDB4MjUwMjsKLQotCS8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUID0gMHgyNjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUiA9IDB4MjYwMTsKLQotCS8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KLQkvKiAgICAgIEdMX05FQVJFU1QgKi8KLQkvKiAgICAgIEdMX0xJTkVBUiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgPSAweDI3MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUID0gMHgyNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMzsKLQotCS8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQUdfRklMVEVSID0gMHgyODAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiA9IDB4MjgwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfUyA9IDB4MjgwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfVCA9IDB4MjgwMzsKLQkvKiAgICAgIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SICovCi0JLyogICAgICBHTF9URVhUVVJFX1BSSU9SSVRZICovCi0KLQkvKiBUZXh0dXJlVGFyZ2V0ICovCi0JLyogICAgICBHTF9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9URVhUVVJFXzJEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzJEICovCi0KLQkvKiBUZXh0dXJlV3JhcE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEFNUCA9IDB4MjkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBFQVQgPSAweDI5MDE7Ci0KLQkvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogQ2xpZW50QXR0cmliTWFzayAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9QSVhFTF9TVE9SRV9CSVQgPSAweDAwMDAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9WRVJURVhfQVJSQVlfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQUxMX0FUVFJJQl9CSVRTID0gMHhmZmZmZmZmZjsKLQotCS8qIHBvbHlnb25fb2Zmc2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SID0gMHg4MDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTID0gMHgyQTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UID0gMHgyQTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgPSAweDJBMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCA9IDB4ODAzNzsKLQotCS8qIHRleHR1cmUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQTQgPSAweDgwM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEE4ID0gMHg4MDNDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBMTIgPSAweDgwM0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEExNiA9IDB4ODAzRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0U0ID0gMHg4MDNGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTggPSAweDgwNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTIgPSAweDgwNDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTYgPSAweDgwNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNF9BTFBIQTQgPSAweDgwNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNl9BTFBIQTIgPSAweDgwNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFOF9BTFBIQTggPSAweDgwNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTJfQUxQSEE0ID0gMHg4MDQ2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTEyX0FMUEhBMTIgPSAweDgwNDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTZfQUxQSEExNiA9IDB4ODA0ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFkgPSAweDgwNDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5URU5TSVRZNCA9IDB4ODA0QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFk4ID0gMHg4MDRCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTEyID0gMHg4MDRDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTE2ID0gMHg4MDREOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IzX0czX0IyID0gMHgyQTEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjQgPSAweDgwNEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNSA9IDB4ODA1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I4ID0gMHg4MDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEwID0gMHg4MDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEyID0gMHg4MDUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjE2ID0gMHg4MDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEyID0gMHg4MDU1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE0ID0gMHg4MDU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjVfQTEgPSAweDgwNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTggPSAweDgwNTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCMTBfQTIgPSAweDgwNTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTEyID0gMHg4MDVBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkExNiA9IDB4ODA1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFRF9TSVpFID0gMHg4MDVDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR1JFRU5fU0laRSA9IDB4ODA1RDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JMVUVfU0laRSA9IDB4ODA1RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0FMUEhBX1NJWkUgPSAweDgwNUY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSA9IDB4ODA2MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFID0gMHg4MDYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST1hZX1RFWFRVUkVfMUQgPSAweDgwNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPWFlfVEVYVFVSRV8yRCA9IDB4ODA2NDsKLQotCS8qIHRleHR1cmVfb2JqZWN0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9QUklPUklUWSA9IDB4ODA2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFU0lERU5UID0gMHg4MDY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR18xRCA9IDB4ODA2ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgPSAweDgwNjk7Ci0KLQkvKiB2ZXJ0ZXhfYXJyYXkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVkgPSAweDgwNzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZID0gMHg4MDc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZID0gMHg4MDc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZID0gMHg4MDc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFID0gMHg4MDdBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9UWVBFID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgPSAweDgwN0M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgPSAweDgwN0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERSA9IDB4ODA3RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFID0gMHg4MDgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1RZUEUgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFID0gMHg4MDgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1RZUEUgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFID0gMHg4MDg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgPSAweDgwODk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgPSAweDgwOEE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERSA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSID0gMHg4MDkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1BPSU5URVIgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSID0gMHg4MDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSID0gMHg4MDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1YyRiA9IDB4MkEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WM0YgPSAweDJBMjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WMkYgPSAweDJBMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WM0YgPSAweDJBMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzNGX1YzRiA9IDB4MkEyNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OM0ZfVjNGID0gMHgyQTI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0M0Rl9OM0ZfVjNGID0gMHgyQTI2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1QyRl9WM0YgPSAweDJBMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDRGX1Y0RiA9IDB4MkEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UMkZfQzRVQl9WM0YgPSAweDJBMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0MzRl9WM0YgPSAweDJBMkE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX04zRl9WM0YgPSAweDJBMkI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0M0Rl9OM0ZfVjNGID0gMHgyQTJDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1Q0Rl9DNEZfTjNGX1Y0RiA9IDB4MkEyRDsKLQotCS8qIEV4dGVuc2lvbnMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfdmVydGV4X2FycmF5ID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfYmdyYSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zd2FwX2hpbnQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9kcmF3X3JhbmdlX2VsZW1lbnRzID0gMTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XSU5fcGhvbmdfc2hhZGluZyAgICAgICAgICAgICAgPSAxOwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zcGVjdWxhcl9mb2cgICAgICAgICAgICAgICA9IDE7Ci0KLQkvKiBFWFRfdmVydGV4X2FycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX0VYVCA9IDB4ODA3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfRVhUID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX0VYVCA9IDB4ODA3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9FWFQgPSAweDgwNzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9FWFQgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCA9IDB4ODA3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgPSAweDgwN0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwN0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRV9FWFQgPSAweDgwODE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUID0gMHg4MDg5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0NPVU5UX0VYVCA9IDB4ODA4QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfQ09VTlRfRVhUID0gMHg4MDhEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA5MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFX0VYVCA9IEdMX0RPVUJMRTsKLQotCS8qIEVYVF9iZ3JhICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkdSX0VYVCA9IDB4ODBFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CR1JBX0VYVCA9IDB4ODBFMTsKLQotCS8qIEVYVF9wYWxldHRlZF90ZXh0dXJlICovCi0KLQkvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBHTF9DT0xPUl9UQUJMRV8qX1NHSSBlbnVtZXJhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfRk9STUFUX0VYVCA9IDB4ODBEODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9UQUJMRV9XSURUSF9FWFQgPSAweDgwRDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfRVhUID0gMHg4MERBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkVfRVhUID0gMHg4MERCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9FWFQgPSAweDgwREM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9FWFQgPSAweDgwREQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfRVhUID0gMHg4MERFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX0VYVCA9IDB4ODBERjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYMV9FWFQgPSAweDgwRTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgyX0VYVCA9IDB4ODBFMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9JTkRFWDRfRVhUID0gMHg4MEU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYOF9FWFQgPSAweDgwRTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxMl9FWFQgPSAweDgwRTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxNl9FWFQgPSAweDgwRTc7Ci0KLQkvKiBXSU5fZHJhd19yYW5nZV9lbGVtZW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FTEVNRU5UU19WRVJUSUNFU19XSU4gPSAweDgwRTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVNfV0lOID0gMHg4MEU5OwotCi0JLyogV0lOX3Bob25nX3NoYWRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSE9OR19XSU4gPSAweDgwRUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEhPTkdfSElOVF9XSU4gPSAweDgwRUI7Ci0KLQkvKiBXSU5fc3BlY3VsYXJfZm9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX1NQRUNVTEFSX1RFWFRVUkVfV0lOID0gMHg4MEVDOwotCi0JLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPcGVuR0wgdjEuMCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QID0gR0xfSU5ERVhfTE9HSUNfT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT01QT05FTlRTID0gR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQWNjdW0gKGludCBvcCwgZmxvYXQgdmFsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xBbHBoYUZ1bmMgKGludCBmdW5jLCBmbG9hdCByZWYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGJvb2xlYW5bXSByZXNpZGVuY2VzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQXJyYXlFbGVtZW50IChpbnQgaW5kZXgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xCZWdpbiAoaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFbmQgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpbmRUZXh0dXJlIChpbnQgdGFyZ2V0LCBpbnQgdGV4dHVyZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpdG1hcCAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCB4b3JpZywgZmxvYXQgeW9yaWcsIGZsb2F0IHhtb3ZlLCBmbG9hdCB5bW92ZSwgYnl0ZVtdIGJpdG1hcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJsZW5kRnVuYyAoaW50IHNmYWN0b3IsIGludCBkZmFjdG9yKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3QgKGludCBsaXN0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3RzIChpbnQgbiwgaW50IHR5cGUsIGJ5dGVbXSBsaXN0cyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENhbGxMaXN0cyAoaW50IG4sIGludCB0eXBlLCBjaGFyW10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDYWxsTGlzdHMgKGludCBuLCBpbnQgdHlwZSwgaW50W10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhciAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhckFjY3VtIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyQ29sb3IgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJEZXB0aCAoZG91YmxlIGRlcHRoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJJbmRleCAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyU3RlbmNpbCAoaW50IHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmUgKGludCBwbGFuZSwgZG91YmxlW10gZXF1YXRpb24pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNiIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZCAoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM2YgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNpIChpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzcyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3ViIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjN1cyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRkIChkb3VibGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUsIGludCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNHMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1aSAoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSwgaW50IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWJ2IChieXRlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0aXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hc2sgKGJvb2xlYW4gcmVkLCBib29sZWFuIGdyZWVuLCBib29sZWFuIGJsdWUsIGJvb2xlYW4gYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hdGVyaWFsIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclBvaW50ZXIgKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3JUYWJsZUVYVCAoaW50IHRhcmdldCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBkYXRhKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclN1YlRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGZvcm1hdCwgaW50IHR5cGUsIGludFtdIGRhdGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5UGl4ZWxzIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHR5cGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4SW1hZ2UxRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxGb3JtYXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgYm9yZGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29weVRleEltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCk7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ3VsbEZhY2UgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVsZXRlTGlzdHMgKGludCBsaXN0LCBpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhGdW5jIChpbnQgZnVuYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERlcHRoTWFzayAoYm9vbGVhbiBmbGFnKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhSYW5nZSAoZG91YmxlIHpuZWFyLCBkb3VibGUgemZhcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdBcnJheXMgKGludCBtb2RlLCBpbnQgZmlyc3QsIGludCBjb3VudCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdCdWZmZXIgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRHJhd0VsZW1lbnRzIChpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgdHlwZSwgaW50W10gaW5kaWNlcyk7IC8qIE1VTFRJUExFUyBUWVBFUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEcmF3UGl4ZWxzIChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRWRnZUZsYWcgKGJvb2xlYW4gZmxhZyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVkZ2VGbGFndiAoYm9vbGVhbltdIGZsYWcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFZGdlRmxhZ1BvaW50ZXIgKGludCBzdHJpZGUsIGJvb2xlYW5bXSBwb2ludGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRW5hYmxlIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGlzYWJsZSAoaW50IGNhcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlIChpbnQgYXJyYXkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKGludCBhcnJheSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFkIChkb3VibGUgdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFmIChmbG9hdCB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMmQgKGRvdWJsZSB1LCBkb3VibGUgdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDJmIChmbG9hdCB1LCBmbG9hdCB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWR2IChkb3VibGVbXSB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWZ2IChmbG9hdFtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZHYgKGRvdWJsZVtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZnYgKGZsb2F0W10gdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxNZXNoMSAoaW50IG1vZGUsIGludCBpMSwgaW50IGkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbE1lc2gyIChpbnQgbW9kZSwgaW50IGkxLCBpbnQgaTIsIGludCBqMSwgaW50IGoyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbFBvaW50MSAoaW50IGkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsUG9pbnQyIChpbnQgaSwgaW50IGopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGZWVkYmFja0J1ZmZlciAoaW50IHNpemUsIGludCB0eXBlLCBmbG9hdFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZpbmlzaCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRmx1c2ggKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2YgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGb2dpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2Z2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRm9naXYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRnJvbnRGYWNlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZydXN0dW0gKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3AsIGRvdWJsZSB6bmVhciwgZG91YmxlIHpmYXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbEdlbkxpc3RzIChpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZW5UZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Qm9vbGVhbnYgKGludCBwbmFtZSwgYm9vbGVhbltdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldERvdWJsZXYgKGludCBwbmFtZSwgZG91YmxlW10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0RmxvYXR2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0SW50ZWdlcnYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q2xpcFBsYW5lIChpbnQgcGxhbmUsIGRvdWJsZVtdIGVxdWF0aW9uKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gZGF0YSk7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRFcnJvciAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldE1hcGR2IChpbnQgdGFnZXJ0LCBpbnQgcXVlcnksIGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBmdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBpdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWxmdiAoaW50IGZhY2UsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXRlcmlhbGl2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcGZ2IChpbnQgbWFwLCBmbG9hdFtdIHZhbHVlcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFBpeGVsTWFwdWl2IChpbnQgbWFwLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcHVzdiAoaW50IG1hcCwgc2hvcnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQb2ludGVydiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCS8qIFRFU1QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0UG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRTdHJpbmcgKGludCBuYW1lKTsKLQkvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleEVudmZ2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4RW52aXYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhJbWFnZSAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyaXYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEhpbnQgKGludCB0YXJnZXQsIGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhkIChkb3VibGUgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4ZiAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4aSAoaW50IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleHMgKHNob3J0IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleGR2IChkb3VibGVbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhmdiAoZmxvYXRbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhpdiAoaW50W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4c3YgKHNob3J0W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4TWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsKLQkvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5pdE5hbWVzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbnRlcmxlYXZlZEFycmF5cyAoaW50IGZvcm1hdCwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLyogQ0hFQ0sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNFbmFibGVkIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNMaXN0IChpbnQgbGlzdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbElzVGV4dHVyZSAoaW50IHRleHR1cmUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0aSAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGZ2IChpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRNb2RlbGYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsZnYgKGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxpdiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpbmVTdGlwcGxlIChpbnQgZmFjdG9yLCBzaG9ydCBwYXR0ZXJuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGluZVdpZHRoIChmbG9hdCB3aWR0aCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpc3RCYXNlIChpbnQgYmFzZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExvYWRJZGVudGl0eSAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeGQgKGRvdWJsZVtdIG0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4ZiAoZmxvYXRbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE5hbWUgKGludCBuYW1lKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9naWNPcCAoaW50IG9wY29kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE1hcDFkIChpbnQgdGFyZ2V0LCBkb3VibGUgdTEsIGRvdWJsZSB1MiwgaW50IHN0cmlkZSwgaW50IG9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAxZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgc3RyaWRlLCBpbnQgb3JkZXIsIGZsb2F0W10gcG9pbnRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwMmQgKGludCB0YXJnZXQsIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZG91YmxlIHYxLCBkb3VibGUgdjIsIGludCB2c3RyaWRlLCBpbnQgdm9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAyZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZmxvYXQgdjEsIGZsb2F0IHYyLCBpbnQgdnN0cmlkZSwgaW50IHZvcmRlciwgZmxvYXRbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWQgKGludCB1biwgZG91YmxlIHUxLCBkb3VibGUgdTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWYgKGludCB1biwgZmxvYXQgdTEsIGZsb2F0IHUyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJkIChpbnQgdW4sIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdm0sIGRvdWJsZSB2MSwgZG91YmxlIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJmIChpbnQgdW4sIGZsb2F0IHUxLCBmbG9hdCB1MiwgaW50IHZtLCBmbG9hdCB2MSwgZmxvYXQgdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGYgKGludCBmYWNlLCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpIChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGZ2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpdiAoaW50IGZhY2UsIGludCBwbmFtZSwgaW50W10gcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRyaXhNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE11bHRNYXRyaXhkIChkb3VibGVbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeGYgKGZsb2F0W10gbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5ld0xpc3QgKGludCBsaXN0LCBpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuZExpc3QgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNiIChieXRlIG54LCBieXRlIG55LCBieXRlIG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2QgKGRvdWJsZSBueCwgZG91YmxlIG55LCBkb3VibGUgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzZiAoZmxvYXQgbngsIGZsb2F0IG55LCBmbG9hdCBueik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNpIChpbnQgbngsIGludCBueSwgaW50IG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM3MgKHNob3J0IG54LCBzaG9ydCBueSwgc2hvcnQgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE9ydGhvIChkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLCBkb3VibGUgdG9wLCBkb3VibGUgem5lYXIsIGRvdWJsZSB6ZmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGFzc1Rocm91Z2ggKGZsb2F0IHRva2VuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXBmdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIGZsb2F0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXB1aXYgKGludCBtYXAsIGludCBtYXBzaXplLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbE1hcHVzdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIHNob3J0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxTdG9yZWYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFN0b3JlaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFRyYW5zZmVyZiAoaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsVHJhbnNmZXJpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsWm9vbSAoZmxvYXQgeGZhY3RvciwgZmxvYXQgeWZhY3Rvcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvaW50U2l6ZSAoZmxvYXQgc2l6ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvbHlnb25Nb2RlIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0IChmbG9hdCBmYWN0b3IsIGZsb2F0IHVuaXRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHJpb3JpdGl6ZVRleHR1cmVzIChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGZsb2F0W10gcHJpb3JpdGllcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFB1c2hBdHRyaWIgKGludCBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wQXR0cmliICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoQ2xpZW50QXR0cmliIChpbnQgbWFzayk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvcENsaWVudEF0dHJpYiAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHVzaE1hdHJpeCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wTWF0cml4ICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoTmFtZSAoaW50IG5hbWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb3BOYW1lICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZCAoZG91YmxlIHgsIGRvdWJsZSB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMmYgKGZsb2F0IHgsIGZsb2F0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyaSAoaW50IHgsIGludCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMnMgKHNob3J0IHgsIHNob3J0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczNmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2kgKGludCB4LCBpbnQgeSwgaW50IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzcyAoc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGkgKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHMgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHosIHNob3J0IHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3Mzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWFkQnVmZmVyIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlYWRQaXhlbHMgKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RkIChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZiAoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aSAoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdHMgKHNob3J0IHgxLCBzaG9ydCB5MSwgc2hvcnQgeDIsIHNob3J0IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdGR2IChkb3VibGVbXSB2MSwgZG91YmxlW10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZnYgKGZsb2F0W10gdjEsIGZsb2F0W10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aXYgKGludFtdIHYxLCBpbnRbXSB2Mik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RzdiAoc2hvcnRbXSB2LCBzaG9ydFtdIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xSZW5kZXJNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWQgKGRvdWJsZSBhbmdsZSwgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWYgKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2Npc3NvciAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludCBidWZmZXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTaGFkZU1vZGVsIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFN0ZW5jaWxGdW5jIChpbnQgZnVuYywgaW50IHJlZiwgaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsTWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsT3AgKGludCBmYWlsLCBpbnQgemZhaWwsIGludCB6cGFzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWQgKGRvdWJsZSBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZiAoZmxvYXQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWkgKGludCBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxcyAoc2hvcnQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmQgKGRvdWJsZSBzLCBkb3VibGUgdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmYgKGZsb2F0IHMsIGZsb2F0IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJpIChpbnQgcywgaW50IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJzIChzaG9ydCBzLCBzaG9ydCB0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZCAoZG91YmxlIHMsIGRvdWJsZSB0LCBkb3VibGUgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2YgKGZsb2F0IHMsIGZsb2F0IHQsIGZsb2F0IHIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDNpIChpbnQgcywgaW50IHQsIGludCByKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzcyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGQgKGRvdWJsZSBzLCBkb3VibGUgdCwgZG91YmxlIHIsIGRvdWJsZSBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZiAoZmxvYXQgcywgZmxvYXQgdCwgZmxvYXQgciwgZmxvYXQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGkgKGludCBzLCBpbnQgdCwgaW50IHIsIGludCBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0cyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgciwgc2hvcnQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMml2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0c3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkUG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLypNVUxUSVBMRVMgQVJSQVlTIC0gQ0hFQ0sgTVNESywgQ09VTlQgUEFSQU0gTUlTU0lORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4RW52aSAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEVudml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEdlbmQgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGUgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mIChpbnQgY29vcmQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5pIChpbnQgY29vcmQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTJEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIHBpeGVscyk7IC8qIE1VTFRJUExFUyBBUlJBWVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmkgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFN1YkltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRyYW5zbGF0ZWQgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUcmFuc2xhdGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmQgKGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJmIChmbG9hdCB4LCBmbG9hdCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmkgKGludCB4LCBpbnQgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJzIChzaG9ydCB4LCBzaG9ydCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2QgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgzZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNpIChpbnQgeCwgaW50IHksIGludCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3MgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpIChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzIChzaG9ydCB4LCBzaG9ydCB5LCBzaG9ydCB6LCBzaG9ydCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmZ2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3N2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4UG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWaWV3cG9ydCAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0xVLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMxZTMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi0KLXB1YmxpYyBjbGFzcyBHTFUgewotCi0JLyogVmVyc2lvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJTSU9OXzFfMSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1ZFUlNJT05fMV8yID0gMTsKLQkKLQkvKiBFcnJvcnM6IChyZXR1cm4gdmFsdWUgMCA9IG5vIGVycm9yKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlZBTElEX0VOVU0gPSAxMDA5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOVkFMSURfVkFMVUUgPSAxMDA5MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVF9PRl9NRU1PUlkgPSAxMDA5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOQ09NUEFUSUJMRV9HTF9WRVJTSU9OID0gMTAwOTAzOwotCQotCS8qIFN0cmluZ05hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVkVSU0lPTiA9IDEwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURU5TSU9OUyA9IDEwMDgwMTsKLQkKLQkKLQkvKioqKiAgICAgICAgICAgUXVhZHJpYyBjb25zdGFudHMgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIFF1YWRyaWNOb3JtYWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU01PT1RIID0gMTAwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9GTEFUID0gMTAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OT05FID0gMTAwMDAyOwotCQotCS8qIFF1YWRyaWNEcmF3U3R5bGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUE9JTlQgPSAxMDAwMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0xJTkUgPSAxMDAwMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0ZJTEwgPSAxMDAwMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1NJTEhPVUVUVEUgPSAxMDAwMTM7Ci0JCi0JLyogUXVhZHJpY09yaWVudGF0aW9uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVFNJREUgPSAxMDAwMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOU0lERSA9IDEwMDAyMTsKLQkKLQkvKiBDYWxsYmFjayB0eXBlczogKi8KLQkvKiAgICAgIEdMVV9FUlJPUiAgICAgICAgICAgICAgIDEwMDEwMyAqLwotCQotCQotCS8qKioqICAgICAgICAgICBUZXNzZWxhdGlvbiBjb25zdGFudHMgICAgICAgICAgICoqKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgR0xVX1RFU1NfTUFYX0NPT1JEID0gMS4wZTE1MDsKLQkKLQkvKiBUZXNzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX1JVTEUgPSAxMDAxNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQk9VTkRBUllfT05MWSA9IDEwMDE0MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19UT0xFUkFOQ0UgPSAxMDAxNDI7Ci0JCi0JLyogVGVzc1dpbmRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX09ERCA9IDEwMDEzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05PTlpFUk8gPSAxMDAxMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfV0lORElOR19QT1NJVElWRSA9IDEwMDEzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05FR0FUSVZFID0gMTAwMTMzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1dJTkRJTkdfQUJTX0dFUV9UV08gPSAxMDAxMzQ7Ci0JCi0JLyogVGVzc0NhbGxiYWNrICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQkVHSU4gPSAxMDAxMDA7ICAvKiB2b2lkIChDQUxMQkFDSyopKEdMZW51bSAgICB0eXBlKSAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19WRVJURVggPSAxMDAxMDE7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQgICAgICAqZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FTkQgPSAxMDAxMDI7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQpICAgICAgICAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUiA9IDEwMDEwMzsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xlbnVtICAgIGVycm5vKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBRyA9IDEwMDEwNDsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xib29sZWFuIGJvdW5kYXJ5RWRnZSkgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09NQklORSA9IDEwMDEwNTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0KSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19CRUdJTl9EQVRBID0gMTAwMTA2OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgdHlwZSwgIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1ZFUlRFWF9EQVRBID0gMTAwMTA3OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKmRhdGEsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VORF9EQVRBID0gMTAwMTA4OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKnBvbHlnb25fZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUl9EQVRBID0gMTAwMTA5OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgZXJybm8sIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBR19EQVRBID0gMTAwMTEwOyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGJvb2xlYW4gYm91bmRhcnlFZGdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0NPTUJJTkVfREFUQSA9IDEwMDExMTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCQotCS8qIFRlc3NFcnJvciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SMSA9IDEwMDE1MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjIgPSAxMDAxNTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1IzID0gMTAwMTUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNCA9IDEwMDE1NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjUgPSAxMDAxNTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1I2ID0gMTAwMTU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNyA9IDEwMDE1NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjggPSAxMDAxNTg7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfTUlTU0lOR19CRUdJTl9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfQkVHSU5fQ09OVE9VUiA9IEdMVV9URVNTX0VSUk9SMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19NSVNTSU5HX0VORF9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfRU5EX0NPTlRPVVIgPSBHTFVfVEVTU19FUlJPUjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09PUkRfVE9PX0xBUkdFID0gR0xVX1RFU1NfRVJST1I1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX05FRURfQ09NQklORV9DQUxMQkFDSyA9IEdMVV9URVNTX0VSUk9SNjsKLQkKLQkvKioqKiAgICAgICAgICAgTlVSQlMgY29uc3RhbnRzICAgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIE51cmJzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQVVUT19MT0FEX01BVFJJWCA9IDEwMDIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ1VMTElORyA9IDEwMDIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU0FNUExJTkdfVE9MRVJBTkNFID0gMTAwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9ESVNQTEFZX01PREUgPSAxMDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfVE9MRVJBTkNFID0gMTAwMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9TQU1QTElOR19NRVRIT0QgPSAxMDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VfU1RFUCA9IDEwMDIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVl9TVEVQID0gMTAwMjA3OwotCQotCS8qIE51cmJzU2FtcGxpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUEFUSF9MRU5HVEggPSAxMDAyMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfRVJST1IgPSAxMDAyMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0RPTUFJTl9ESVNUQU5DRSA9IDEwMDIxNzsKLQkKLQkKLQkvKiBOdXJic1RyaW0gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTUFQMV9UUklNXzIgPSAxMDAyMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX01BUDFfVFJJTV8zID0gMTAwMjExOwotCQotCS8qIE51cmJzRGlzcGxheSAqLwotCS8qICAgICAgR0xVX0ZJTEwgICAgICAgICAgICAgICAgMTAwMDEyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVExJTkVfUE9MWUdPTiA9IDEwMDI0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfT1VUTElORV9QQVRDSCA9IDEwMDI0MTsKLQkKLQkvKiBOdXJic0NhbGxiYWNrICovCi0JLyogICAgICBHTFVfRVJST1IgICAgICAgICAgICAgICAxMDAxMDMgKi8KLQkKLQkvKiBOdXJic0Vycm9ycyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEgPSAxMDAyNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SMiA9IDEwMDI1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1IzID0gMTAwMjUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjQgPSAxMDAyNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SNSA9IDEwMDI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I2ID0gMTAwMjU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjcgPSAxMDAyNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SOCA9IDEwMDI1ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I5ID0gMTAwMjU5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEwID0gMTAwMjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjExID0gMTAwMjYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEyID0gMTAwMjYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEzID0gMTAwMjYzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE0ID0gMTAwMjY0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE1ID0gMTAwMjY1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE2ID0gMTAwMjY2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE3ID0gMTAwMjY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE4ID0gMTAwMjY4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE5ID0gMTAwMjY5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIwID0gMTAwMjcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIxID0gMTAwMjcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIyID0gMTAwMjcyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIzID0gMTAwMjczOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI0ID0gMTAwMjc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI1ID0gMTAwMjc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI2ID0gMTAwMjc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI3ID0gMTAwMjc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI4ID0gMTAwMjc4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI5ID0gMTAwMjc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMwID0gMTAwMjgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMxID0gMTAwMjgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMyID0gMTAwMjgyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMzID0gMTAwMjgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM0ID0gMTAwMjg0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM1ID0gMTAwMjg1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM2ID0gMTAwMjg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM3ID0gMTAwMjg3OwotCQotCS8qIENvbnRvdXJzIHR5cGVzIC0tIG9ic29sZXRlISAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9DVyA9IDEwMDEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ0NXID0gMTAwMTIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlRFUklPUiA9IDEwMDEyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURVJJT1IgPSAxMDAxMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VOS05PV04gPSAxMDAxMjQ7Ci0JCi0JLyogTmFtZXMgd2l0aG91dCAiVEVTU18iIHByZWZpeCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9CRUdJTiA9IEdMVV9URVNTX0JFR0lOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJURVggPSBHTFVfVEVTU19WRVJURVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0VORCA9IEdMVV9URVNTX0VORDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVJST1IgPSBHTFVfVEVTU19FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRURHRV9GTEFHID0gR0xVX1RFU1NfRURHRV9GTEFHOwotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5DdXJ2ZSAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kQ3VydmUgKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUJlZ2luUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5TdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVFbmRTdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVCZWdpblRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUVuZFRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQxRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50IGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQyRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUN5bGluZGVyIChpbnQgcW9iaiwgZG91YmxlIGJhc2VSYWRpdXMsIGRvdWJsZSB0b3BSYWRpdXMsIGRvdWJsZSBoZWlnaHQsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlciAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlUXVhZHJpYyAoaW50IHFvYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlVGVzcyAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGlzayAoaW50IHFvYmosIGRvdWJsZSBpbm5lclJhZGl1cywgZG91YmxlIG91dGVyUmFkaXVzLCBpbnQgc2xpY2VzLCBpbnQgbG9vcHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVFcnJvclN0cmluZyAoaW50IGVyckNvZGUpOyAgLyogU0hPVUxEIFJFVFVSTiBBIFNUUklORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1R2V0TnVyYnNQcm9wZXJ0eSAoaW50IG5vYmosIGludCBwcm9wZXJ0eSwgZmxvYXRbXSB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdUdldFN0cmluZyAoaW50IG5hbWUpOyAvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVHZXRUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGRvdWJsZVtdIHZhbHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIChpbnQgbm9iaiwgZmxvYXRbXSBtb2RlbE1hdHJpeCwgZmxvYXRbXSBwcm9qTWF0cml4LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVMb29rQXQgKGRvdWJsZSBleWV4LCBkb3VibGUgZXlleSwgZG91YmxlIGV5ZXosIGRvdWJsZSBjZW50ZXJ4LCBkb3VibGUgY2VudGVyeSwgZG91YmxlIGNlbnRlcnosIGRvdWJsZSB1cHgsIGRvdWJsZSB1cHksIGRvdWJsZSB1cHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdOdXJic1JlbmRlcmVyICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdRdWFkcmljICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdUZXNzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TmV4dENvbnRvdXIgKGludCB0ZXNzLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic0NhbGxiYWNrIChpbnQgbm9iaiwgaW50IHdoaWNoLCBpbnQgZm4pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TnVyYnNDdXJ2ZSAoaW50IG5vYmosIGludCBua25vdHMsIGZsb2F0W10ga25vdCwgaW50IHN0cmlkZSwgZmxvYXRbXSBjdGxhcnJheSwgaW50IG9yZGVyLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1Byb3BlcnR5IChpbnQgbm9iaiwgaW50IHByb3BlcnR5LCBmbG9hdCB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1N1cmZhY2UgKGludCBub2JqLCBpbnQgc2tub3RfY291bnQsIGZsb2F0W10gc2tub3QsIGludCB0a25vdF9jb3VudCwgZmxvYXRbXSB0a25vdCwgaW50IHNfc3RyaWRlLCBpbnQgdF9zdHJpZGUsIGZsb2F0W10gY3RsYXJyYXksIGludCBzb3JkZXIsIGludCB0b3JkZXIsIGludCB0eXBlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdU9ydGhvMkQgKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3ApOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGFydGlhbERpc2sgKGludCBxb2JqLCBkb3VibGUgaW5uZXJSYWRpdXMsIGRvdWJsZSBvdXRlclJhZGl1cywgaW50IHNsaWNlcywgaW50IGxvb3BzLCBkb3VibGUgc3RhcnRBbmdsZSwgZG91YmxlIHN3ZWVwQW5nbGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGVyc3BlY3RpdmUgKGRvdWJsZSBmb3Z5LCBkb3VibGUgYXNwZWN0LCBkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVBpY2tNYXRyaXggKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVByb2plY3QgKGRvdWJsZSBvYmp4LCBkb3VibGUgb2JqeSwgZG91YmxlIG9ianosZG91YmxlW10gbW9kZWxNYXRyaXgsIGRvdWJsZVtdIHByb2pNYXRyaXgsIGludFtdIHZpZXdwb3J0LCBkb3VibGVbXSB3aW54LCBkb3VibGVbXSB3aW55LCBkb3VibGVbXSB3aW56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVB3bEN1cnZlIChpbnQgbm9iaiwgaW50IGNvdW50LCBmbG9hdFtdIGFycmF5LCBpbnQgc3RyaWRlLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljQ2FsbGJhY2sgKGludCBxb2JqLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljRHJhd1N0eWxlIChpbnQgcW9iaiwgaW50IGRyYXdTdHlsZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljTm9ybWFscyAoaW50IHFvYmosIGludCBub3JtYWxzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVF1YWRyaWNPcmllbnRhdGlvbiAoaW50IHFvYmosIGludCBvcmllbnRhdGlvbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljVGV4dHVyZSAoaW50IHFvYmosIGJvb2xlYW4gdGV4dHVyZUNvb3Jkcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVNjYWxlSW1hZ2UgKGludCBmb3JtYXQsIGludCB3aWR0aGluLCBpbnQgaGVpZ2h0aW4sIGludCB0eXBlaW4sIGludCBkYXRhaW4sIGludCB3aWR0aG91dCwgaW50IGhlaWdodG91dCwgaW50IHR5cGVvdXQsIGludCBkYXRhb3V0KTsgLypNVUxUSVBMRVMgVFlQRVMgQVJSQVlTKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVNwaGVyZSAoaW50IHFvYmosIGRvdWJsZSByYWRpdXMsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0JlZ2luQ29udG91ciAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0VuZENvbnRvdXIgKGludCB0ZXNzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NCZWdpblBvbHlnb24gKGludCB0ZXNzLCBpbnQgcG9seWdvbl9kYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NFbmRQb2x5Z29uIChpbnQgdGVzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzQ2FsbGJhY2sgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzTm9ybWFsIChpbnQgdGVzcywgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgcHJvcGVydHksIGRvdWJsZSB2YWx1ZSk7IC8qIENIRUNLIE1TRE4sIFZBTFVFJ1MgVFlQRSBJUyBET1VCTEUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NWZXJ0ZXggKGludCB0ZXNzLCBkb3VibGVbXSBjb29yZHMsIGludCBkYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1VW5Qcm9qZWN0IChkb3VibGUgd2lueCwgZG91YmxlIHdpbnksIGRvdWJsZSB3aW56LCBkb3VibGVbXSBtb2RlbE1hdHJpeCwgZG91YmxlW10gcHJvak1hdHJpeCwgaW50W10gdmlld3BvcnQsIGRvdWJsZVtdIG9iangsIGRvdWJsZVtdIG9ianksIGRvdWJsZVtdIG9ianopOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmMTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotLyoqCi0gKiBUaGUgR0xEYXRhIGNsYXNzIGlzIGEgZGV2aWNlLWluZGVwZW5kZW50IGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgcGl4ZWwgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBHTCBkcmF3YWJsZS4KLSAqCi0gKiBAc2VlIEdMQ2FudmFzCi0gKi8KLQotcHVibGljIGNsYXNzIEdMRGF0YSB7Ci0JLyoqCi0JICogU3BlY2lmaWVzIGEgZG91YmxlLWJ1ZmZlcmVkIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dAotCSAqIGNyZWF0aW9uLCBvbmx5IGRvdWJsZS1idWZmZXJlZCBmb3JtYXRzIGFyZSBjb25zaWRlcmVkCi0JICogd2hlbiBzZXQgdG8gdHJ1ZS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG91YmxlQnVmZmVyOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGEgc3RlcmVvIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwKLQkgKiBvbmx5IHN0ZXJlbyBmb3JtYXRzIGFyZSBjb25zaWRlcmVkIHdoZW4gc2V0IHRvIHRydWUuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN0ZXJlbzsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIHJlZCBjaGFubmVsLgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgcmVkU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGdyZWVuIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGJsdWUgY2hhbm5lbC4KLQkgKiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlIG1pbmltdW0KLQkgKiByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBibHVlU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGFscGhhIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFscGhhU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGRlcHRoIGJ1ZmZlci4gIER1cmluZyBjb250ZXh0Ci0JICogY3JlYXRpb24sIHRoZSBzbWFsbGVzdCBkZXB0aCBidWZmZXIgb2YgYXQgbGVhc3QgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3Igbm8gZGVwdGgKLQkgKiBidWZmZXIuCi0JICovCi0JcHVibGljIGludCBkZXB0aFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgZGVzaXJlZCBudW1iZXIgb2Ygc3RlbmNpbCBiaXRwbGFuZXMuICBEdXJpbmcKLQkgKiBjb250ZXh0IGNyZWF0aW9uLCB0aGUgc21hbGxlc3Qgc3RlbmNpbCBidWZmZXIgb2YgYXQKLQkgKiBsZWFzdCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3IKLQkgKiBubyBzdGVuY2lsIGJ1ZmZlci4KLQkgKi8KLQlwdWJsaWMgaW50IHN0ZW5jaWxTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIHJlZAotCSAqIGNoYW5uZWwuIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUKLQkgKiBtaW5pbXVtIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgYWNjdW1SZWRTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGdyZWVuCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtR3JlZW5TaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGJsdWUKLQkgKiBjaGFubmVsLiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlCi0JICogbWluaW11bSByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBhY2N1bUJsdWVTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGFscGhhCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtQWxwaGFTaXplOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHVzZWQgYnkgdGhpcyBjb250ZXh0LgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHJlcXVlc3RlZC4KLQkgKi8KLQlwdWJsaWMgaW50IHNhbXBsZUJ1ZmZlcnM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYWNjZXB0ZWQgaW4gdGhlIG11bHRpc2FtcGxlIGJ1ZmZlci4KLQkgKiBEdXJpbmcgY3JlYXRpb24sIHBpeGVsIGZvcm1hdHMgd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mCi0JICogc2FtcGxlcyB0aGF0IG1lZXRzIG9yIGV4Y2VlZHMgdGhlIHNwZWNpZmllZCBtaW5pbXVtIG51bWJlcgotCSAqIGFyZSBwcmVmZXJyZWQuCi0JICovCi0JcHVibGljIGludCBzYW1wbGVzOwotCQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gKGRvdWJsZUJ1ZmZlciA/ICJkb3VibGVCdWZmZXIsIiA6ICIiKSArCi0JCShzdGVyZW8gPyAic3RlcmVvLCIgOiAiIikgKwotCQkicjoiICsgcmVkU2l6ZSArICIgZzoiICsgZ3JlZW5TaXplICsgIiBiOiIgKyBibHVlU2l6ZSArICIgYToiICsgYWxwaGFTaXplICsgIiwiICsKLQkJImRlcHRoOiIgKyBkZXB0aFNpemUgKyAiLHN0ZW5jaWw6IiArIHN0ZW5jaWxTaXplICsKLQkJIixhY2N1bSByOiIgKyBhY2N1bVJlZFNpemUgKyAiZzoiICsgYWNjdW1HcmVlblNpemUgKyAiYjoiICsgYWNjdW1CbHVlU2l6ZSArICJhOiIgKyBhY2N1bUFscGhhU2l6ZSArCi0JCSIsc2FtcGxlQnVmZmVyczoiICsgc2FtcGxlQnVmZmVycyArICIsc2FtcGxlczoiICsgc2FtcGxlczsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvSW1hZ2VEYXRhVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDY5MDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLQotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCQkvLyBwYWxldHRlIGluZGV4ZWQgY29sb3IgZm9ybWF0cwotCQlUWVBFX0lOREVYXzggPSA2LAotCQlUWVBFX0lOREVYXzQgPSA3LAotCQlUWVBFX0lOREVYXzIgPSA4LAotCQlUWVBFX0lOREVYXzFfTVNCID0gOSwKLQkJVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJsaXRzIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UgaW50byBhIGRpcmVjdCBwYWxldHRlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGU6IFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGVwdGgsIG9yZGVyIGFuZCBtYXNrcwotCSAqIGFyZSBwYWlyd2lzZSBlcXVhbCBhbmQgdGhlIGJsaXR0ZXIgb3BlcmF0aW9uIGlzIEJMSVRfU1JDLAotCSAqIHRoZSBtYXNrcyBhcmUgaWdub3JlZC4gIEhlbmNlIHdoZW4gbm90IGNoYW5naW5nIHRoZSBpbWFnZQotCSAqIGRhdGEgZm9ybWF0LCAwIG1heSBiZSBzcGVjaWZpZWQgZm9yIHRoZSBtYXNrcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wIHRoZSBibGl0dGVyIG9wZXJhdGlvbjogYSBjb21iaW5hdGlvbiBvZiBCTElUX3h4eCBmbGFncwotCSAqICAgICAgICAoc2VlIEJMSVRfeHh4IGNvbnN0YW50cykKLQkgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc291cmNlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIHNyY0RlcHRoIHRoZSBzb3VyY2UgZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc291cmNlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBzcmNPcmRlciB0aGUgc291cmNlIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIHNyY0RlcHRoIGlzIG5vdCAxNiBvciAzMgotCSAqIEBwYXJhbSBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjUmVkTWFzayB0aGUgc291cmNlIHJlZCBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gc3JjR3JlZW5NYXNrIHRoZSBzb3VyY2UgZ3JlZW4gY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0JsdWVNYXNrIHRoZSBzb3VyY2UgYmx1ZSBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gYWxwaGFNb2RlIHRoZSBhbHBoYSBibGVuZGluZyBvciBtYXNrIG1vZGUsIG1heSBiZQotCSAqICAgICAgICBhbiBpbnRlZ2VyIDAtMjU1IGZvciBnbG9iYWwgYWxwaGE7IGlnbm9yZWQgaWYgQkxJVF9BTFBIQQotCSAqICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBibGl0dGVyIG9wZXJhdGlvbnMKLQkgKiAgICAgICAgKHNlZSBBTFBIQV9NT0RFX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIGFscGhhRGF0YSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBkYXRhLCB2YXJpZXMgZGVwZW5kaW5nCi0JICogICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBhbHBoYU1vZGUgYW5kIHNvbWV0aW1lcyBpZ25vcmVkCi0JICogQHBhcmFtIGFscGhhU3RyaWRlIHRoZSBhbHBoYSBkYXRhIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBhbHBoYVggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGFscGhhWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgYWxwaGEgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIGRlc3REZXB0aCB0aGUgZGVzdGluYXRpb24gZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gZGVzdFggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RZIHRoZSB0b3AtbGVmdCB5LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0SGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGRlc3RHcmVlbk1hc2sgdGhlIGRlc3RpbmF0aW9uIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0Qmx1ZU1hc2sgdGhlIGRlc3RpbmF0aW9uIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGZsaXBYIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzCi0JICogQHBhcmFtIGZsaXBZIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMKLQkgKi8KLQlzdGF0aWMgdm9pZCBibGl0KGludCBvcCwKLQkJYnl0ZVtdIHNyY0RhdGEsIGludCBzcmNEZXB0aCwgaW50IHNyY1N0cmlkZSwgaW50IHNyY09yZGVyLAotCQlpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKLQkJaW50IHNyY1JlZE1hc2ssIGludCBzcmNHcmVlbk1hc2ssIGludCBzcmNCbHVlTWFzaywKLQkJaW50IGFscGhhTW9kZSwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhU3RyaWRlLCBpbnQgYWxwaGFYLCBpbnQgYWxwaGFZLAotCQlieXRlW10gZGVzdERhdGEsIGludCBkZXN0RGVwdGgsIGludCBkZXN0U3RyaWRlLCBpbnQgZGVzdE9yZGVyLAotCQlpbnQgZGVzdFgsIGludCBkZXN0WSwgaW50IGRlc3RXaWR0aCwgaW50IGRlc3RIZWlnaHQsCi0JCWludCBkZXN0UmVkTWFzaywgaW50IGRlc3RHcmVlbk1hc2ssIGludCBkZXN0Qmx1ZU1hc2ssCi0JCWJvb2xlYW4gZmxpcFgsIGJvb2xlYW4gZmxpcFkpIHsKLQkJaWYgKChkZXN0V2lkdGggPD0gMCkgfHwgKGRlc3RIZWlnaHQgPD0gMCkgfHwgKGFscGhhTW9kZSA9PSBBTFBIQV9UUkFOU1BBUkVOVCkpIHJldHVybjsKLQotCQkvLyB0aGVzZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgcGFyYW1zIGxhdGVyCi0JCWZpbmFsIGludCBzcmNBbHBoYU1hc2sgPSAwLCBkZXN0QWxwaGFNYXNrID0gMDsKLQotCQkvKioqIFByZXBhcmUgc2NhbGluZyBkYXRhICoqKi8KLQkJZmluYWwgaW50IGR3bTEgPSBkZXN0V2lkdGggLSAxOwotCQlmaW5hbCBpbnQgc2Z4aSA9IChkd20xICE9IDApID8gKGludCkoKCgobG9uZylzcmNXaWR0aCA8PCAxNikgLSAxKSAvIGR3bTEpIDogMDsKLQkJZmluYWwgaW50IGRobTEgPSBkZXN0SGVpZ2h0IC0gMTsKLQkJZmluYWwgaW50IHNmeWkgPSAoZGhtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjSGVpZ2h0IDw8IDE2KSAtIDEpIC8gZGhtMSkgOiAwOwotCi0JCS8qKiogUHJlcGFyZSBzb3VyY2UtcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IHNicHAsIHN0eXBlOwotCQlzd2l0Y2ggKHNyY0RlcHRoKSB7Ci0JCQljYXNlIDg6Ci0JCQkJc2JwcCA9IDE7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfODsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJc2JwcCA9IDI7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlzYnBwID0gMzsKLQkJCQlzdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJc2JwcCA9IDQ7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc291cmNlIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IHNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCQkvKioqIFByZXBhcmUgZGVzdGluYXRpb24tcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IGRicHAsIGR0eXBlOwotCQlzd2l0Y2ggKGRlc3REZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCWRicHAgPSAxOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWRicHAgPSAyOwotCQkJCWR0eXBlID0gKGRlc3RPcmRlciA9PSBNU0JfRklSU1QpID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWRicHAgPSAzOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlkYnBwID0gNDsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzdGluYXRpb24gdHlwZSIpOwotCQkJCXJldHVybjsKLQkJfQkJCQotCQlpbnQgZHByID0gKChmbGlwWSkgPyBkZXN0WSArIGRobTEgOiBkZXN0WSkgKiBkZXN0U3RyaWRlICsgKChmbGlwWCkgPyBkZXN0WCArIGR3bTEgOiBkZXN0WCkgKiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeGkgPSAoZmxpcFgpID8gLWRicHAgOiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeWkgPSAoZmxpcFkpID8gLWRlc3RTdHJpZGUgOiBkZXN0U3RyaWRlOwotCi0JCS8qKiogUHJlcGFyZSBzcGVjaWFsIHByb2Nlc3NpbmcgZGF0YSAqKiovCi0JCWludCBhcHI7Ci0JCWlmICgob3AgJiBCTElUX0FMUEhBKSAhPSAwKSB7Ci0JCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCWNhc2UgQUxQSEFfTUFTS19VTlBBQ0tFRDoKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYXByID0gYWxwaGFZICogYWxwaGFTdHJpZGUgKyBhbHBoYVg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxQSEFfTUFTS19QQUNLRUQ6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYWxwaGFTdHJpZGUgPDw9IDM7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfSU5ERVg6Ci0JCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbHBoYSB0eXBlIik7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFscGhhTW9kZSA9IChhbHBoYU1vZGUgPDwgMTYpIC8gMjU1OyAvLyBwcmVzY2FsZQotCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCWFwciA9IDA7Ci0JCX0KLQotCQkvKioqIEJsaXQgKioqLwotCQlpbnQgZHAgPSBkcHI7Ci0JCWludCBzcCA9IHNwcjsKLQkJaWYgKChhbHBoYU1vZGUgPT0gMHgxMDAwMCkgJiYgKHN0eXBlID09IGR0eXBlKSAmJgotCQkJKHNyY1JlZE1hc2sgPT0gZGVzdFJlZE1hc2spICYmIChzcmNHcmVlbk1hc2sgPT0gZGVzdEdyZWVuTWFzaykgJiYKLQkJCShzcmNCbHVlTWFzayA9PSBkZXN0Qmx1ZU1hc2spICYmIChzcmNBbHBoYU1hc2sgPT0gZGVzdEFscGhhTWFzaykpIHsKLQkJCS8qKiogRmFzdCBibGl0IChzdHJhaWdodCBjb3B5KSAqKiovCi0JCQlzd2l0Y2ggKHNicHApIHsKLQkJCQljYXNlIDE6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIDI6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gc3JjRGF0YVtzcCArIDFdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSBzcmNEYXRhW3NwICsgM107Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKioqIENvbXByZWhlbnNpdmUgYmxpdCAoYXBwbHkgdHJhbnNmb3JtYXRpb25zKSAqKiovCi0JCWZpbmFsIGludCBzcmNSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNSZWRNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY1JlZHMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY1JlZE1hc2ssIHNyY1JlZFNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNHcmVlblNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0dyZWVuTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNHcmVlbnMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0dyZWVuTWFzaywgc3JjR3JlZW5TaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0JsdWVNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY0JsdWVzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNCbHVlTWFzaywgc3JjQmx1ZVNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNBbHBoYVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0FscGhhTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNBbHBoYXMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0FscGhhTWFzaywgc3JjQWxwaGFTaGlmdCldOwotCi0JCWZpbmFsIGludCBkZXN0UmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdFJlZE1hc2spOwotCQlmaW5hbCBpbnQgZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdFJlZHMgPSBBTllfVE9fRUlHSFRbZGVzdFJlZFdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0R3JlZW5NYXNrKTsKLQkJZmluYWwgaW50IGRlc3RHcmVlbldpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RHcmVlbk1hc2ssIGRlc3RHcmVlblNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RHcmVlbnMgPSBBTllfVE9fRUlHSFRbZGVzdEdyZWVuV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuUHJlU2hpZnQgPSA4IC0gZGVzdEdyZWVuV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RCbHVlTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0Qmx1ZXMgPSBBTllfVE9fRUlHSFRbZGVzdEJsdWVXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVByZVNoaWZ0ID0gOCAtIGRlc3RCbHVlV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0QWxwaGFNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RBbHBoYU1hc2ssIGRlc3RBbHBoYVNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RBbHBoYXMgPSBBTllfVE9fRUlHSFRbZGVzdEFscGhhV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhUHJlU2hpZnQgPSA4IC0gZGVzdEFscGhhV2lkdGg7Ci0KLQkJaW50IGFwID0gYXByLCBhbHBoYSA9IGFscGhhTW9kZTsKLQkJaW50IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotCQlpbnQgcnEgPSAwLCBncSA9IDAsIGJxID0gMCwgYXEgPSAwOwotCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwKLQkJCQlzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsCi0JCQkJYXAgPSBhcHIgKz0gKHNmeSA+Pj4gMTYpICogYWxwaGFTdHJpZGUsCi0JCQkJc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLAotCQkJCWRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LAotCQkJCQlkcCArPSBkcHJ4aSwKLQkJCQkJc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgKioqLwotCQkJCXN3aXRjaCAoc3R5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSBzcmNEYXRhW3NwXSAmIDB4ZmY7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcF0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQotCQkJCS8qKiogRE8gU1BFQ0lBTCBQUk9DRVNTSU5HIElGIFJFUVVJUkVEICoqKi8KLQkJCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCQlhbHBoYSA9ICgoYWxwaGFEYXRhW2FwXSAmIDB4ZmYpIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWFwICs9IChzZnggPj4gMTYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCQlhbHBoYSA9IChhIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJCQlhbHBoYSA9IChhbHBoYURhdGFbYXBdICE9IDApID8gMHgxMDAwMCA6IDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwID4+IDNdIDw8ICgoYXAgJiA3KSArIDkpKSAmIDB4MTAwMDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQkJYWxwaGEgPSAweDEwMDAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICs9IDMpIHsKLQkJCQkJCQlpZiAoKHIgPT0gYWxwaGFEYXRhW2ldKSAmJiAoZyA9PSBhbHBoYURhdGFbaSArIDFdKSAmJiAoYiA9PSBhbHBoYURhdGFbaSArIDJdKSkgewotCQkJCQkJCQlhbHBoYSA9IDB4MDAwMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhbHBoYSAhPSAweDEwMDAwKSB7Ci0JCQkJCWlmIChhbHBoYSA9PSAweDAwMDApIGNvbnRpbnVlOwotCQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ184OiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSBkZXN0RGF0YVtkcF0gJiAweGZmOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcCArIDFdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgM10gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHAgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gUGVyZm9ybSBhbHBoYSBibGVuZGluZwotCQkJCQlhID0gYXEgKyAoKGEgLSBhcSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCXIgPSBycSArICgociAtIHJxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJZyA9IGdxICsgKChnIC0gZ3EpICogYWxwaGEgPj4gMTYpOwotCQkJCQliID0gYnEgKyAoKGIgLSBicSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJfQotCi0JCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCQlmaW5hbCBpbnQgZGF0YSA9IAotCQkJCQkociA+Pj4gZGVzdFJlZFByZVNoaWZ0IDw8IGRlc3RSZWRTaGlmdCkgfAotCQkJCQkoZyA+Pj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkJKGIgPj4+IGRlc3RCbHVlUHJlU2hpZnQgPDwgZGVzdEJsdWVTaGlmdCkgfAotCQkJCQkoYSA+Pj4gZGVzdEFscGhhUHJlU2hpZnQgPDwgZGVzdEFscGhhU2hpZnQpOwotCQkJCXN3aXRjaCAoZHR5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIGRhdGE7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgPj4+IDI0KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDE2KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQkJaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCQltYXNrID4+Pj0gMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLQkgKi8KLQlzdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJbWFzayA+Pj49IHNoaWZ0OwotCQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGkgLSBzaGlmdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0KLQkJSW1hZ2VEYXRhVXRpbC5ibGl0ICgKLQkJCTEsCi0JCQlzb3VyY2UuZGF0YSwKLQkJCXNvdXJjZS5kZXB0aCwKLQkJCXNvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkoc291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJc291cmNlLndpZHRoLAotCQkJc291cmNlLmhlaWdodCwKLQkJCXNvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCTI1NSwKLQkJCW51bGwsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQluZXdTb3VyY2UuZGF0YSwKLQkJCW5ld1NvdXJjZS5kZXB0aCwKLQkJCW5ld1NvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkobmV3U291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NjdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIExpYnJhcnkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbG9hZExpYnJhcnkgKFN0cmluZyBuYW1lKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtICgpOwkKLQl0cnkgewotCQlTdHJpbmcgbmV3TmFtZSA9IG5hbWUgKyAnLScgKyBwbGF0Zm9ybTsKLQkJU3lzdGVtLmxvYWRMaWJyYXJ5IChuZXdOYW1lKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUxKSB7CQkKLQkJdGhyb3cgZTE7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI2ZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotaWYgWyAiJHtPU30iID0gIiIgXTsgdGhlbgotCU9TPWB1bmFtZSAtc2AKLWZpCi0KLWNhc2UgJE9TIGluCi0JIkxpbnV4IikKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCBHVEsgdmVyc2lvbiBvZiBTV1QgT3BlbkdMIgotCQk7OwotCSopCi0JCWVjaG8gIioqKiBVbmtub3duIE9TIDwke09TfT4iCi0JCTs7Ci1lc2FjCi0KLWV4cG9ydCBKQVZBX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJHsxKyIkQCJ9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjE1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbHhfc3RhdHMuaCIKLQotI2RlZmluZSBHTFhfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9ndGtfR0xYXyMjZnVuYwotCi0jaWZuZGVmIE5PX2dsWENob29zZVZpc3VhbAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYyA9IDA7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWENob29zZVZpc3VhbF9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGppbnQpZ2xYQ2hvb3NlVmlzdWFsKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENvcHlDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYQ29weUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLQlnbFhDb3B5Q29udGV4dChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENyZWF0ZUNvbnRleHQKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxLCBqaW50IGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSBnZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsICZfYXJnMSkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWENyZWF0ZUNvbnRleHQoYXJnMCwgbHBhcmcxLCBhcmcyLCBhcmczKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhDcmVhdGVHTFhQaXhtYXAKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDcmVhdGVHTFhQaXhtYXBfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamludClnbFhDcmVhdGVHTFhQaXhtYXAoYXJnMCwgbHBhcmcxLCBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWERlc3Ryb3lDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYRGVzdHJveUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotCWdsWERlc3Ryb3lDb250ZXh0KGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYRGVzdHJveUdMWFBpeG1hcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lHTFhQaXhtYXBfRlVOQyk7Ci0JZ2xYRGVzdHJveUdMWFBpeG1hcChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYR2V0Q2xpZW50U3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q2xpZW50U3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDbGllbnRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDbGllbnRTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldENvbmZpZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldENvbmZpZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDb25maWdfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzMpIGlmICgobHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWEdldENvbmZpZyhhcmcwLCBscGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci1mYWlsOgotCWlmIChhcmczICYmIGxwYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q29uZmlnX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnRDb250ZXh0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50Q29udGV4dCgpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYSXNEaXJlY3QKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYSXNEaXJlY3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbFhJc0RpcmVjdChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhNYWtlQ3VycmVudAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xYX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYTWFrZUN1cnJlbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbl9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCWlmIChhcmcyKSBpZiAoKGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYUXVlcnlFeHRlbnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25fRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFF1ZXJ5U2VydmVyU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeVNlcnZlclN0cmluZyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhRdWVyeVZlcnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlWZXJzaW9uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMj1OVUxMOwotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCWlmIChhcmcxKSBpZiAoKGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeVZlcnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFN3YXBCdWZmZXJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotCWdsWFN3YXBCdWZmZXJzKGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYVXNlWEZvbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xYX05BVElWRShnbFhVc2VYRm9udCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYV2FpdEdMCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRHTF9GVU5DKTsKLQlnbFhXYWl0R0woKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhXYWl0R0xfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhXYWl0WAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWFdhaXRYKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRYX0ZVTkMpOwotCWdsWFdhaXRYKCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYV2FpdFhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19tZW1tb3ZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUobWVtbW92ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIG1lbW1vdmVfRlVOQyk7Ci0JaWYgKGFyZzApIGlmICgobHBhcmcwID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCAmX2FyZzApKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JbWVtbW92ZShscGFyZzAsIGFyZzEsIGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMCAmJiBscGFyZzApIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMCwgbHBhcmcwKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBtZW1tb3ZlX0ZVTkMpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyOWVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotI2luY2x1ZGUgPEdML2dseC5oPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFkMTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50ID0gMjE7Ci1pbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzIxXTsKLWNoYXIgKiBHTFhfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbFhDaG9vc2VWaXN1YWwiLAotCSJnbFhDb3B5Q29udGV4dCIsCi0JImdsWENyZWF0ZUNvbnRleHQiLAotCSJnbFhDcmVhdGVHTFhQaXhtYXAiLAotCSJnbFhEZXN0cm95Q29udGV4dCIsCi0JImdsWERlc3Ryb3lHTFhQaXhtYXAiLAotCSJnbFhHZXRDbGllbnRTdHJpbmciLAotCSJnbFhHZXRDb25maWciLAotCSJnbFhHZXRDdXJyZW50Q29udGV4dCIsCi0JImdsWEdldEN1cnJlbnREcmF3YWJsZSIsCi0JImdsWElzRGlyZWN0IiwKLQkiZ2xYTWFrZUN1cnJlbnQiLAotCSJnbFhRdWVyeUV4dGVuc2lvbiIsCi0JImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyIsCi0JImdsWFF1ZXJ5U2VydmVyU3RyaW5nIiwKLQkiZ2xYUXVlcnlWZXJzaW9uIiwKLQkiZ2xYU3dhcEJ1ZmZlcnMiLAotCSJnbFhVc2VYRm9udCIsCi0JImdsWFdhaXRHTCIsCi0JImdsWFdhaXRYIiwKLQkibWVtbW92ZSIsCi19OwotCi0jZGVmaW5lIFNUQVRTX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF90b29sc19pbnRlcm5hbF9OYXRpdmVTdGF0c18jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xYXzFHZXRGdW5jdGlvbkNvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JcmV0dXJuIEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTFhfMUdldEZ1bmN0aW9uTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW2luZGV4XSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMWF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2luZGV4XTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzE2OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLWV4dGVybiBpbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci1leHRlcm4gaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW107Ci0jZGVmaW5lIEdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSBHTFhfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZnVuYykgCi0jZWxzZQotI2RlZmluZSBHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgCi0jZGVmaW5lIEdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMsCi0JZ2xYQ29weUNvbnRleHRfRlVOQywKLQlnbFhDcmVhdGVDb250ZXh0X0ZVTkMsCi0JZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMsCi0JZ2xYRGVzdHJveUNvbnRleHRfRlVOQywKLQlnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMsCi0JZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMsCi0JZ2xYR2V0Q29uZmlnX0ZVTkMsCi0JZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQywKLQlnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQywKLQlnbFhJc0RpcmVjdF9GVU5DLAotCWdsWE1ha2VDdXJyZW50X0ZVTkMsCi0JZ2xYUXVlcnlFeHRlbnNpb25fRlVOQywKLQlnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQywKLQlnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DLAotCWdsWFF1ZXJ5VmVyc2lvbl9GVU5DLAotCWdsWFN3YXBCdWZmZXJzX0ZVTkMsCi0JZ2xYVXNlWEZvbnRfRlVOQywKLQlnbFhXYWl0R0xfRlVOQywKLQlnbFhXYWl0WF9GVU5DLAotCW1lbW1vdmVfRlVOQywKLX0gR0xYX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3M2MxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLQotI2lmbmRlZiBOT19YVmlzdWFsSW5mbwotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotCi1YVmlzdWFsSW5mb19GSURfQ0FDSEUgWFZpc3VhbEluZm9GYzsKLQotdm9pZCBjYWNoZVhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0KQotewotCWlmIChYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgcmV0dXJuOwotCVhWaXN1YWxJbmZvRmMuY2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCVhWaXN1YWxJbmZvRmMudmlzdWFsID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJ2aXN1YWxpZCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmRlcHRoID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjY2xhc3MiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMucmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuZ3JlZW5fbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJibHVlX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JaWYgKCFYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGxwT2JqZWN0KTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCk7Ci0JbHBTdHJ1Y3QtPnZpc3VhbGlkID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmRlcHRoKTsKLQlscFN0cnVjdC0+Y2NsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmNjbGFzcyk7Ci0JbHBTdHJ1Y3QtPnJlZF9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayk7Ci0JbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCWlmICghWFZpc3VhbEluZm9GYy5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoZW52LCBscE9iamVjdCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkLCAoamludClscFN0cnVjdC0+dmlzdWFsaWQpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY2NsYXNzLCAoamludClscFN0cnVjdC0+Y2NsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMucmVkX21hc2ssIChqaW50KWxwU3RydWN0LT5yZWRfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuYmx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSwgKGppbnQpbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGYwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdseC5oIgotCi0jaWZuZGVmIE5PX1hWaXN1YWxJbmZvCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpOwotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLSNkZWZpbmUgWFZpc3VhbEluZm9fc2l6ZW9mKCkgc2l6ZW9mKFhWaXN1YWxJbmZvKQotI2Vsc2UKLSNkZWZpbmUgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhhLGIpCi0jZGVmaW5lIGdldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKSBOVUxMCi0jZGVmaW5lIHNldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKQotI2RlZmluZSBYVmlzdWFsSW5mb19zaXplb2YoKSAwCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU5NTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9tYWtlX2xpbnV4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi1DQz1nY2MKLUxEPWdjYwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1XU19QUkVGSVggICA9IGd0awotR0xfUFJFRklYICAgPSBnbAotR0xfRExMICAgICAgPSBsaWIkKEdMX1BSRUZJWCktJChXU19QUkVGSVgpLnNvCi1HTF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1HTF9MSUIgICAgICA9IC1zaGFyZWQgLUwvdXNyL1gxMVI2L2xpYiAtbEdMIC1sR0xVIC1sbQotCi1DRkxBR1MgPSAtTzIgLVdhbGwgLUkuCi0KLWFsbDogbWFrZV9nbAotCi1tYWtlX2dsOiAkKEdMX0RMTCkKLQkkKExEKSAkKEdMX0xJQikgLW8gJChHTF9ETEwpICQoR0xfT0JKKQotCi0kKEdMX0RMTCk6ICQoR0xfT0JKKQotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBnbHguYwotCi1jbGVhbjoKLQlybSAtZiAqLnNvICoubwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgInN0cnVjdHMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotdHlwZWRlZiBYVmlzdWFsSW5mb19GSURfQ0FDSEUgKlBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci0KLVhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBYVmlzdWFsSW5mb0ZjOwotCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT52aXN1YWwgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JbHBDYWNoZS0+dmlzdWFsaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbGlkIiwgIkkiKTsKLQlscENhY2hlLT5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInNjcmVlbiIsICJJIik7Ci0JbHBDYWNoZS0+ZGVwdGggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlscENhY2hlLT5jY2xhc3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNjbGFzcyIsICJJIik7Ci0JbHBDYWNoZS0+cmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInJlZF9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ibHVlX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJsdWVfbWFzayIsICJJIik7Ci0JbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY29sb3JtYXBfc2l6ZSIsICJJIik7Ci0JbHBDYWNoZS0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLVhWaXN1YWxJbmZvICpnZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKFZpc3VhbCAqKSgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsKTsKLQlscFN0cnVjdC0+dmlzdWFsaWQgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4pOwotCWxwU3RydWN0LT5kZXB0aCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgpOwotCWxwU3RydWN0LT5jbGFzcyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y2NsYXNzKTsKLQlscFN0cnVjdC0+cmVkX21hc2sgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzayk7Ci0JbHBTdHJ1Y3QtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrKTsKLQlscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Yml0c19wZXJfcmdiKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCkKLXsKLQlQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUgPSAmWFZpc3VhbEluZm9GYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwsIChqaW50KWxwU3RydWN0LT52aXN1YWwpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQsIChqaW50KWxwU3RydWN0LT52aXN1YWxpZCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgsIChqaW50KWxwU3RydWN0LT5kZXB0aCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MsIChqaW50KWxwU3RydWN0LT5jbGFzcyk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5yZWRfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPnJlZF9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJsdWVfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmJsdWVfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplLCAoamludClscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9ndGsvR0xYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1MDc5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBHTFggewotCQotc3RhdGljIHsKLQlMaWJyYXJ5LmxvYWRMaWJyYXJ5KCJnbCIpOwotfQotCi0vKgotKiogVmlzdWFsIENvbmZpZyBBdHRyaWJ1dGVzIChnbFhHZXRDb25maWcsIGdsWEdldEZCQ29uZmlnQXR0cmliKQotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9VU0VfR0wJCQkJPSAxOwkvKiBzdXBwb3J0IEdMWCByZW5kZXJpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CVUZGRVJfU0laRQkJCT0gMjsJLyogZGVwdGggb2YgdGhlIGNvbG9yIGJ1ZmZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0xFVkVMCQkJCT0gMzsJLyogbGV2ZWwgaW4gcGxhbmUgc3RhY2tpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBCQkJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJCT0gNTsJLyogZG91YmxlIGJ1ZmZlcmluZyBzdXBwb3J0ZWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVSRU8JCQkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQkJPSA3OwkvKiBudW1iZXIgb2YgYXV4IGJ1ZmZlcnMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRURfU0laRQkJCT0gODsJLyogbnVtYmVyIG9mIHJlZCBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0dSRUVOX1NJWkUJCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJCT0gMTA7CS8qIG51bWJlciBvZiBibHVlIGNvbXBvbmVudCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUxQSEFfU0laRQkJCT0gMTE7CS8qIG51bWJlciBvZiBhbHBoYSBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX1NJWkUJCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQkJPSAxMzsJLyogbnVtYmVyIG9mIHN0ZW5jaWwgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX1JFRF9TSVpFCQk9IDE0OwkvKiBudW1iZXIgb2YgcmVkIGFjY3VtIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9HUkVFTl9TSVpFCT0gMTU7CS8qIG51bWJlciBvZiBncmVlbiBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQkxVRV9TSVpFCQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJPSAweDIzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCT0gMHgyNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJPSAweDI1OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCT0gMHgyNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCT0gMHgyNzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRQk9IDB4Mjg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRFJBV0FCTEVfVFlQRQkJPSAweDgwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUkVOREVSX1RZUEUJCQk9IDB4ODAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9YX1JFTkRFUkFCTEUJCT0gMHg4MDEyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkJPSAweDgwMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfV0lEVEgJPSAweDgwMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfSEVJR0hUCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwk9IDB4ODAxODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSUQJCQk9IDB4ODAwQjsKLQotLyoKLSoqIEVycm9yIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBTdWNjZXNzIGlzIGluZGljYXRlZCBieQotKiogYSB2YWx1ZSBvZiAwLgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfU0NSRUVOCQk9IDE7CS8qIHNjcmVlbiAjIGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9BVFRSSUJVVEUJPSAyOwkvKiBhdHRyaWJ1dGUgdG8gZ2V0IGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PX0VYVEVOU0lPTgk9IDM7CS8qIG5vIGdseCBleHRlbnNpb24gb24gc2VydmVyICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZJU1VBTAkJPSA0OwkvKiB2aXN1YWwgIyBub3Qga25vd24gYnkgR0xYICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX0NPTlRFWFQJCT0gNTsJLyogcmV0dXJuZWQgb25seSBieSBpbXBvcnRfY29udGV4dCBFWFQ/ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZBTFVFCQk9IDY7CS8qIHJldHVybmVkIG9ubHkgYnkgZ2xYU3dhcEludGVydmFsU0dJPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9FTlVNCQk9IDc7CS8qIHVudXNlZD8gKi8KLQotLyogRkJDb25maWcgYXR0cmlidXRlIHZhbHVlcyAqLwotCi0vKgotKiogR2VuZXJpYyAiZG9uJ3QgY2FyZSIgdmFsdWUgZm9yIGdsWCBDaG9vc2VGQkNvbmZpZyBhdHRyaWJ1dGVzIChleGNlcHQKLSoqIEdMWF9MRVZFTCkKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRE9OVF9DQVJFCQkJPSAweEZGRkZGRkZGOwotCi0vKiBHTFhfUkVOREVSX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkFfQklUCQkJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTE9SX0lOREVYX0JJVAkJPSAweDAwMDAwMDAyOwotCi0vKiBHTFhfRFJBV0FCTEVfVFlQRSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QSVhNQVBfQklUCQkJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfQklUCQkJPSAweDAwMDAwMDA0OwotCi0vKiBHTFhfQ09ORklHX0NBVkVBVCBhdHRyaWJ1dGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORQkJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCT0gMHg4MDA5OwotCi0vKiBnbFhDcmVhdGVHTFhQYnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QUkVTRVJWRURfQ09OVEVOVFMJPSAweDgwMUI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTEFSR0VTVF9QQlVGRkVSCQk9IDB4ODAxQzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0hFSUdIVAkJPSAweDgwNDA7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfV0lEVEgJCT0gMHg4MDQxOwkvKiBOZXcgZm9yIEdMWCAxLjMgKi8KLQotLyogZ2xYUXVlcnlHTFhQQnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9XSURUSAkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQk9IDB4ODAxRTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FVkVOVF9NQVNLCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCT0gMHg4MDE1OwotCi0vKiBnbFhRdWVyeUNvbnRleHQgYXR0cmlidXRlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkgIDB4ODAxMyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkgIDB4ODAxMSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NDUkVFTgkJCT0gMHg4MDBDOwotCi0vKiBnbFhTZWxlY3RFdmVudCBldmVudCBtYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0NMT0JCRVJfTUFTSwk9IDB4MDgwMDAwMDA7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZXZlbnRfdHlwZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9EQU1BR0VECQkJPSAweDgwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0FWRUQJCQk9IDB4ODAyMTsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBkcmF3X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XCQkJPSAweDgwMjI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUgkJCT0gMHg4MDIzOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGJ1ZmZlcl9tYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9MRUZUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTX0JJVAkJPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDA0MDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9CVUZGRVJfQklUCQk9IDB4MDAwMDAwODA7Ci0KLS8qCi0qKiBFeHRlbnNpb24gcmV0dXJuIHZhbHVlcyBmcm9tIGdsWEdldENvbmZpZy4gIFRoZXNlIGFyZSBhbHNvCi0qKiBhY2NlcHRlZCBhcyBwYXJhbWV0ZXIgdmFsdWVzIGZvciBnbFhDaG9vc2VWaXN1YWwuCi0qLwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRV9FWFQgPSAweDIyOwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEVfRVhUID0gMHgyMzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfRVhUID0gMHgyNDsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFX0VYVAk9IDB4MjU7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0VYVCA9IDB4MjY7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfRVhUCT0gMHgyNzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfRVhUID0gMHgyODsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdmlzdWFsX3R5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUlVFX0NPTE9SX0VYVAk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1JfRVhUCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUl9FWFQJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SX0VYVAk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFX0VYVAk9IDB4ODAwNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEFUSUNfR1JBWV9FWFQJPSAweDgwMDc7Ci0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdHJhbnNwYXJlbnQgcGl4ZWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT05FX0VYVAkJPSAweDgwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkdCX0VYVAkJPSAweDgwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfRVhUCT0gMHg4MDA5OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF9yYXRpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfQ0FWRUFUX0VYVAkJPSAweDIwOyAgLyogdmlzdWFsX3JhdGluZyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NMT1dfVklTVUFMX0VYVAkJPSAweDgwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9OX0NPTkZPUk1BTlRfVklTVUFMX0VYVAk9IDB4ODAwRDsKLQotLyoKLSoqIE5hbWVzIGZvciBhdHRyaWJ1dGVzIHRvIGdsWEdldENsaWVudFN0cmluZy4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVORE9SCQk9IDB4MTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OCQk9IDB4MjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRFTlNJT05TCT0gMHgzOwotCi0vKgotKiogTmFtZXMgZm9yIGF0dHJpYnV0ZXMgdG8gZ2xYUXVlcnlDb250ZXh0SW5mb0VYVC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0hBUkVfQ09OVEVYVF9FWFQgPSAweDgwMEE7CS8qIGlkIG9mIHNoYXJlIGNvbnRleHQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSURfRVhUID0gMHg4MDBCOwkvKiBpZCBvZiBjb250ZXh0J3MgdmlzdWFsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0NSRUVOX0VYVCA9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKgotKiBHTFggMS40IAotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVfQlVGRkVSUyA9IDEwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVTID0gMTAwMDAxOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ2hvb3NlVmlzdWFsKGludCBkcHksIGludCBzY3JlZW4sIGludFtdIGF0dHJpYkxpc3QpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhDb3B5Q29udGV4dChpbnQgZHB5LCBpbnQgc3JjLCBpbnQgZHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMzk2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9YVmlzdWFsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ3RrOwotCi0gCi1wdWJsaWMgY2xhc3MgWFZpc3VhbEluZm8gewotCXB1YmxpYyBpbnQgdmlzdWFsOwotCXB1YmxpYyBpbnQgdmlzdWFsaWQ7Ci0JcHVibGljIGludCBzY3JlZW47Ci0JcHVibGljIGludCBkZXB0aDsKLQlwdWJsaWMgaW50IGNjbGFzczsKLQlwdWJsaWMgaW50IHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2s7Ci0JcHVibGljIGludCBjb2xvcm1hcF9zaXplOwotCXB1YmxpYyBpbnQgYml0c19wZXJfcmdiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDQwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzZjNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmd0ay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotCi0vKioKLSAqIEdMQ2FudmFzIGlzIGEgd2lkZ2V0IGNhcGFibGUgb2YgZGlzcGxheWluZyBPcGVuR0wgY29udGVudC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgR0xDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCWludCAvKmxvbmcqLyB4ZGlzcGxheTsKLQlpbnQgLypsb25nKi8geGlkOwotCWludCAvKmxvbmcqLyBjb250ZXh0OwotCWludCAvKmxvbmcqLyBnbFdpbmRvdzsKLQlYVmlzdWFsSW5mbyB2aW5mbzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVRUUklCVVRFUyA9IDMyOwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsJCi0JaWYgKGRhdGEgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaW50IGdseEF0dHJpYiBbXSA9IG5ldyBpbnQgW01BWF9BVFRSSUJVVEVTXTsKLQlpbnQgcG9zID0gMDsKLQotCU9TLmd0a193aWRnZXRfcmVhbGl6ZSAoaGFuZGxlKTsKLQlpbnQgLypsb25nKi8gd2luZG93ID0gT1MuR1RLX1dJREdFVF9XSU5ET1cgKGhhbmRsZSk7Ci0JeGRpc3BsYXkgPSBPUy5nZGtfeDExX2RyYXdhYmxlX2dldF94ZGlzcGxheSAod2luZG93KTsKLQlpbnQgeHNjcmVlbiA9IE9TLlhEZWZhdWx0U2NyZWVuICh4ZGlzcGxheSk7Ci0KLQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfUkdCQTsKLQlpZiAoZGF0YS5kb3VibGVCdWZmZXIpIGdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFUkVPOwotCWlmIChkYXRhLnJlZFNpemUgPiAwKSB7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9SRURfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnJlZFNpemU7Ci0JfQotCWlmIChkYXRhLmdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5ncmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmJsdWVTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQkxVRV9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFscGhhU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FMUEhBX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hbHBoYVNpemU7Ci0JfQotCWlmIChkYXRhLmRlcHRoU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0RFUFRIX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5kZXB0aFNpemU7Ci0JfQotCWlmIChkYXRhLnN0ZW5jaWxTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFTkNJTF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuc3RlbmNpbFNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtUmVkU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1SZWRTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUdyZWVuU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1CbHVlU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0JMVUVfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQWxwaGFTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQUNDVU1fQUxQSEFfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFX0JVRkZFUlM7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5zYW1wbGVCdWZmZXJzOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFUzsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWdseEF0dHJpYiBbcG9zKytdID0gMDsKLQlpbnQgaW5mb1B0ciA9IEdMWC5nbFhDaG9vc2VWaXN1YWwgKHhkaXNwbGF5LCB4c2NyZWVuLCBnbHhBdHRyaWIpOwotCWlmIChpbmZvUHRyID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLQl2aW5mbyA9IG5ldyBYVmlzdWFsSW5mbyAoKTsKLQlHTFgubWVtbW92ZSAodmluZm8sIGluZm9QdHIsIFhWaXN1YWxJbmZvLnNpemVvZik7Ci0JT1MuWEZyZWUgKGluZm9QdHIpOwotCWludCAvKmxvbmcqLyBzY3JlZW4gPSBPUy5nZGtfc2NyZWVuX2dldF9kZWZhdWx0ICgpOwotCWludCAvKmxvbmcqLyBnZGt2aXN1YWwgPSBPUy5nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsIChzY3JlZW4sIHZpbmZvLnZpc3VhbGlkKTsKLQkvL2NvbnRleHQgPSBHTFguZ2xYQ3JlYXRlQ29udGV4dCAoeGRpc3BsYXksIGluZm8sIHNoYXJlID09IG51bGwgPyAwIDogc2hhcmUuY29udGV4dCwgdHJ1ZSk7Ci0JY29udGV4dCA9IEdMWC5nbFhDcmVhdGVDb250ZXh0ICh4ZGlzcGxheSwgdmluZm8sIDAsIHRydWUpOwotCWlmIChjb250ZXh0ID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX05PX0hBTkRMRVMpOwotCUdka1dpbmRvd0F0dHIgYXR0cnMgPSBuZXcgR2RrV2luZG93QXR0ciAoKTsKLQlhdHRycy53aWR0aCA9IDE7Ci0JYXR0cnMuaGVpZ2h0ID0gMTsKLQlhdHRycy5ldmVudF9tYXNrID0gT1MuR0RLX0tFWV9QUkVTU19NQVNLIHwgT1MuR0RLX0tFWV9SRUxFQVNFX01BU0sgfAotCQlPUy5HREtfRk9DVVNfQ0hBTkdFX01BU0sgfCBPUy5HREtfUE9JTlRFUl9NT1RJT05fTUFTSyB8Ci0JCU9TLkdES19CVVRUT05fUFJFU1NfTUFTSyB8IE9TLkdES19CVVRUT05fUkVMRUFTRV9NQVNLIHwKLQkJT1MuR0RLX0VOVEVSX05PVElGWV9NQVNLIHwgT1MuR0RLX0xFQVZFX05PVElGWV9NQVNLIHwKLQkJT1MuR0RLX0VYUE9TVVJFX01BU0sgfCBPUy5HREtfVklTSUJJTElUWV9OT1RJRllfTUFTSzsKLQlhdHRycy53aW5kb3dfdHlwZSA9IE9TLkdES19XSU5ET1dfQ0hJTEQ7Ci0JYXR0cnMudmlzdWFsID0gZ2RrdmlzdWFsOwotCWdsV2luZG93ID0gT1MuZ2RrX3dpbmRvd19uZXcgKHdpbmRvdywgYXR0cnMsIE9TLkdES19XQV9WSVNVQUwpOwotCU9TLmdka193aW5kb3dfc2V0X3VzZXJfZGF0YSAoZ2xXaW5kb3csIGhhbmRsZSk7Ci0JeGlkID0gT1MuZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGlkIChnbFdpbmRvdyk7Ci0JT1MuZ2RrX3dpbmRvd19zaG93IChnbFdpbmRvdyk7Ci0KLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5QYWludDoKLQkJCQkvKioKLQkJCQkqIEJ1ZyBpbiBNRVNBLiAgTUVTQSBkb2VzIHNvbWUgbmFzdHkgc29ydCBvZiBwb2xsaW5nIHRvIHRyeQotCQkJCSogYW5kIGVuc3VyZSB0aGF0IHRoZWlyIGJ1ZmZlciBzaXplcyBtYXRjaCB0aGUgY3VycmVudCBYIHN0YXRlLgotCQkJCSogVGhpcyBzdGF0ZSBjYW4gYmUgdXBkYXRlZCB1c2luZyBnbFZpZXdwb3J0KCkuCi0JCQkJKiBGSVhNRTogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSBvZiBkb2luZyB0aGlzLgotCQkJCSovCi0JCQkJaW50IFtdIHZpZXdwb3J0ID0gbmV3IGludCBbNF07Ci0JCQkJR0wuZ2xHZXRJbnRlZ2VydiAoR0wuR0xfVklFV1BPUlQsIHZpZXdwb3J0KTsKLQkJCQlHTC5nbFZpZXdwb3J0ICh2aWV3cG9ydCBbMF0sdmlld3BvcnQgWzFdLHZpZXdwb3J0IFsyXSx2aWV3cG9ydCBbM10pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJCU9TLmdka193aW5kb3dfbW92ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQkJCQlPUy5nZGtfd2luZG93X3Jlc2l6ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJaWYgKGNvbnRleHQgIT0gMCkgewotCQkJCQlpZiAoR0xYLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQpIHsKLQkJCQkJCUdMWC5nbFhNYWtlQ3VycmVudCh4ZGlzcGxheSwgMCwgMCk7Ci0JCQkJCX0KLQkJCQkJR0xYLmdsWERlc3Ryb3lDb250ZXh0ICh4ZGlzcGxheSwgY29udGV4dCk7Ci0JCQkJCWNvbnRleHQgPSAwOwotCQkJCX0KLQkJCQlpZiAoZ2xXaW5kb3cgIT0gMCkgewotCQkJCQlPUy5nZGtfd2luZG93X2Rlc3Ryb3kgKGdsV2luZG93KTsKLQkJCQkJZ2xXaW5kb3cgPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lciAoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9TQU1QTEVfQlVGRkVSUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlQnVmZmVycyA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU0FNUExFUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlcyA9IHZhbHVlIFswXTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIEdMWC5nbFhHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBjb250ZXh0OwotfQotCi0vKioKLSAqIFNldHMgdGhlIE9wZW5HTCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdMQ2FudmFzIHRvIGJlIHRoZQotICogY3VycmVudCBHTCBjb250ZXh0LgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChHTFguZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gY29udGV4dCkgcmV0dXJuOwotCUdMWC5nbFhNYWtlQ3VycmVudCAoeGRpc3BsYXksIHhpZCwgY29udGV4dCk7Ci19Ci0KLS8qKgotICogU3dhcHMgdGhlIGZyb250IGFuZCBiYWNrIGNvbG9yIGJ1ZmZlcnMuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc3dhcEJ1ZmZlcnMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMWC5nbFhTd2FwQnVmZmVycyAoeGRpc3BsYXksIHhpZCk7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9idWlsZC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVjMTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEvYmluL3NoCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMgICAgIFRvbSBUcm9tZXkgKFJlZCBIYXQsIEluYy4pCi0jICAgICBTcmlkaGFyIEJpZGlnYWx1IChJQ1MpCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1jZCBgZGlybmFtZSAkMGAKLQotIyBEZXRlcm1pbmUgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYmVpbmcgYnVpbHQKLW1ha2VmaWxlPSIiCi1PUz1gdW5hbWUgLXNgCi1NT0RFTD1gdW5hbWUgLW1gCi0KLWNhc2UgJE9TIGluCi0JIkFJWCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvYWl4ajkKLQkJTU9USUZfSE9NRT0vdXNyCi0JCUNERV9IT01FPS91c3IvZHQKLQkJbWFrZWZpbGU9Im1ha2VfYWl4Lm1hayIKLQkJZWNobyAiQnVpbGRpbmcgQUlYIHZlcnNpb24gb2YgU1dUIgotCQk7OwotCSJMaW51eCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvSUJNSmF2YTItMTQxCi0JCU1PVElGX0hPTUU9L2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL21vdGlmMjEKLQkJUVRfSE9NRT0kUVRESVIKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiU3VuT1MiKQotCQlKQVZBX0hPTUU9L3Vzci9qYXZhCi0JCU1PVElGX0hPTUU9L3Vzci9kdAotCQlDREVfSE9NRT0vdXNyL2R0Ci0JCVBBVEg9L29wdC9TVU5Xc3Byby9iaW46JFBBVEgKLQkJZXhwb3J0IFBBVEgJCQotCQltYWtlZmlsZT0ibWFrZV9zb2xhcmlzLm1hayIKLQkJZWNobyAiQnVpbGRpbmcgU29sYXJpcyB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiSFAtVVgiKQotCQlKQVZBX0hPTUU9L29wdC9qZGsxNDEwMQotCQlNT1RJRl9IT01FPS91c3IKLQkJQ0RFX0hPTUU9L3Vzci9kdAotCQljYXNlICRNT0RFTCBpbgotCQkJImlhNjQiKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfaWE2NC5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCBpYTY0IHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCQkqKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfUEFfUklTQy5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCByaXNjIHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQotCSopCi0JCWVjaG8gIlVua25vd24gT1MgLS0gYnVpbGQgYWJvcnRlZCIKLQkJOzsKLWVzYWMKLQotZXhwb3J0IEpBVkFfSE9NRSBNT1RJRl9IT01FIENERV9IT01FIFFUX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJDEgJDIgJDMgJDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9nbHguYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhlMTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8R0wvZ2x4Lmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFhHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENob29zZVZpc3VhbFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqaW50KWdsWENob29zZVZpc3VhbCgoRGlzcGxheSAqKWFyZzAsIGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYQ29weUNvbnRleHRcbiIpCi0KLQlnbFhDb3B5Q29udGV4dCgoRGlzcGxheSAqKWFyZzAsIChHTFhDb250ZXh0KWFyZzEsIChHTFhDb250ZXh0KWFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqYm9vbGVhbiBhcmczKQotewotCVhWaXN1YWxJbmZvIF9hcmcxLCAqbHBhcmcxPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENyZWF0ZUNvbnRleHRcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlQ29udGV4dCgoRGlzcGxheSAqKWFyZzAsIGxwYXJnMSwgKEdMWENvbnRleHQpYXJnMiwgYXJnMyk7Ci0JaWYgKGFyZzEpIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhDcmVhdGVHTFhQaXhtYXBcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlR0xYUGl4bWFwKChEaXNwbGF5ICopYXJnMCwgbHBhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMSkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCBscGFyZzEpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWERlc3Ryb3lDb250ZXh0XG4iKQotCi0JZ2xYRGVzdHJveUNvbnRleHQoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYRGVzdHJveUdMWFBpeG1hcFxuIikKLQotCWdsWERlc3Ryb3lHTFhQaXhtYXAoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldENsaWVudFN0cmluZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhHZXRDbGllbnRTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q2xpZW50U3RyaW5nKChEaXNwbGF5ICopYXJnMCwgYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhHZXRDb25maWcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiZ2xYR2V0Q29uZmlnXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9IGdldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgJl9hcmcxKTsKLQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JcmMgPSAoamludClnbFhHZXRDb25maWcoKERpc3BsYXkgKilhcmcwLCBscGFyZzEsIGFyZzIsIChpbnQgKilscGFyZzMpOwotCWlmIChhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYR2V0Q3VycmVudENvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWEdldEN1cnJlbnREcmF3YWJsZVxuIikKLQotCXJldHVybiAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhJc0RpcmVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhJc0RpcmVjdFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pZ2xYSXNEaXJlY3QoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoImdsWE1ha2VDdXJyZW50XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbilnbFhNYWtlQ3VycmVudCgoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxLCAoR0xYQ29udGV4dClhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeUV4dGVuc2lvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnRBcnJheSBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeUV4dGVuc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZ1xuIikKLQotCXJldHVybiAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFF1ZXJ5U2VydmVyU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxLCBhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeVZlcnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhRdWVyeVZlcnNpb25cbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCXJjID0gKGpib29sZWFuKWdsWFF1ZXJ5VmVyc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYU3dhcEJ1ZmZlcnNcbiIpCi0KLQlnbFhTd2FwQnVmZmVycygoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFVzZVhGb250KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlERUJVR19DQUxMKCJnbFhVc2VYRm9udFxuIikKLQotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYV2FpdEdMXG4iKQotCi0JZ2xYV2FpdEdMKCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhXYWl0WCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWFdhaXRYXG4iKQotCi0JZ2xYV2FpdFgoKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKG1lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hWaXN1YWxJbmZvXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJtZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF9tb3RpZl9YVmlzdWFsSW5mb18ySUlcbiIpCi0KLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCW1lbW1vdmUoKHZvaWQgKilscGFyZzAsIChjb25zdCB2b2lkICopYXJnMSwgKHNpemVfdClhcmcyKTsKLQlpZiAoYXJnMCkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI3YjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfYWl4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi0jICAgIEpBVkFfSE9NRSAgLSBUaGUgSkRLID4gMS4zCi1KQVZBX0hPTUUgICA9IC91c3IvamF2YTEzMQotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBzd3QKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ibm9lbnRyeSAtbGNfciAtbENfciAtbG0gLWJleHBhbGwgLWxNcm0gLWxYMTEgLWxYZXh0IC1saWNvbnYgLWxHTCAtbEdMVQotCi0jCi0jIFRoZSBmb2xsb3dpbmcgQ0ZMQUdTIGFyZSBmb3IgY29tcGlsaW5nIHRoZSBTV1QgT3BlbkdMIGxpYnJhcnkuCi0jCi1DRkxBR1MgPSAtTyAtcyBcCi0JLURBSVggXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLXEgbWJjcyAtcWxhbmdsdmw9ZXh0ZW5kZWQgLXFtYXhtZW09ODE5MiBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAkKFNXVF9MSUIpIC1vICQoU1dUX0RMTCkgJChTV1RfT0JKKQotCi1jbGVhbjoKLQlybSAtZiAqLm8gKi5zbyAqLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX2hwdXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFmYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICA9IC9vcHQvamF2YTEuMwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBnbAotV1NfUFJFRklYICAgID0gbW90aWYKLVNXVF9ETEwgICAgICA9IGxpYiQoU1dUX1BSRUZJWCktJChXU19QUkVGSVgpLnNsCi1TV1RfT0JKICAgICAgPSBzd3QubyBnbC5vIGdsdS5vIHN0cnVjdHMubyBnbHgubwotU1dUX0xJQiAgICAgID0gLUwvdXNyL2xpYiAtTC9vcHQvZ3JhcGhpY3MvT3BlbkdML2xpYiAtRyAtbEdMIC1sR0xVIC1sYyAtbGRsZCAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLiBJZiB0aGlzIGZsYWcgaXMgbm90Ci0jCi1DRkxBR1MgPSAtQWUgK3ogXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLURfSFBVWCAtRF9QT1NJWF9DX1NPVVJDRT0xOTk1MDZMIFwKLQktSS4vIFwKLQktSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvaHAtdXggXAotCS1JL29wdC9ncmFwaGljcy9PcGVuR0wvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtYiAteiAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbCAqLm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTk1YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICAgPSAvYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvaXZlL2JpbgotCi0KLSMgRGVmaW5lIHRoZSB2YXJpb3VzIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgbWFkZS4KLVNXVF9QUkVGSVggICA9IGdsCi1XU19QUkVGSVggICAgPSBtb3RpZgotU1dUX0RMTCAgICAgID0gbGliJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuc28KLVNXVF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1TV1RfTElCICAgICAgPSAtc2hhcmVkIC1ML3Vzci9YMTFSNi9saWIgLWxHTCAtbEdMVSAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS1JLi8gXAotCS1JJChKQVZBX0hPTUUpL2luY2x1ZGUKLQotYWxsOiBtYWtlX3N3dAotCi1tYWtlX3N3dDogJChTV1RfRExMKQotCi0kKFNXVF9ETEwpOiAkKFNXVF9PQkopCi0JbGQgLW8gJEAgJChTV1RfT0JKKSAkKFNXVF9MSUIpCi0KLWNsZWFuOgotCXJtIC1mICouc28gKi5vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9zb2xhcmlzLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MTBiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBEZWZpbmUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBmb3IgdmFyaW91cyBwcm9kdWN0cy4KLUpBVkFfSE9NRSAgID0gL2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL2l2ZS9iaW4KLQotIyBEZWZpbmUgdGhlIHZhcmlvdXMgc2hhcmVkIGxpYnJhcmllcyB0byBiZSBtYWRlLgotU1dUX1BSRUZJWCAgID0gZ2wKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ML3Vzci9saWIgLWxtIC1sR0wgLWxHTFUKLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS14YXJjaD1nZW5lcmljIFwKLQktS1BJQyBcCi0JLUkuLyBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbyAqLm8KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi10eXBlZGVmIHN0cnVjdCBYVmlzdWFsSW5mb19GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHZpc3VhbCwgdmlzdWFsaWQsIHNjcmVlbiwgZGVwdGgsIGNjbGFzcywgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzaywgY29sb3JtYXBfc2l6ZSwgYml0c19wZXJfcmdiOwotfSBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci10eXBlZGVmIFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSAqUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRTsKLQotWFZpc3VhbEluZm9fRklEX0NBQ0hFIFhWaXN1YWxJbmZvRmM7Ci0KLXZvaWQgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSkKLXsKLQlpZiAobHBDYWNoZS0+Y2FjaGVkKSByZXR1cm47Ci0JbHBDYWNoZS0+Y2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCWxwQ2FjaGUtPnZpc3VhbCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsIiwgIkkiKTsKLQlscENhY2hlLT52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsaWQiLCAiSSIpOwotCWxwQ2FjaGUtPnNjcmVlbiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlscENhY2hlLT5kZXB0aCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZGVwdGgiLCAiSSIpOwotCWxwQ2FjaGUtPmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY2NsYXNzIiwgIkkiKTsKLQlscENhY2hlLT5yZWRfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmdyZWVuX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdyZWVuX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiYmx1ZV9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlscENhY2hlLT5iaXRzX3Blcl9yZ2IgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJpdHNfcGVyX3JnYiIsICJJIik7Ci0JbHBDYWNoZS0+Y2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBscENhY2hlID0gJlhWaXN1YWxJbmZvRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCWxwU3RydWN0LT52aXN1YWwgPSAoVmlzdWFsICopKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwpOwotCWxwU3RydWN0LT52aXN1YWxpZCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQpOwotCWxwU3RydWN0LT5zY3JlZW4gPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCk7Ci0JbHBTdHJ1Y3QtPmNsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MpOwotCWxwU3RydWN0LT5yZWRfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+cmVkX21hc2spOwotCWxwU3RydWN0LT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ibHVlX21hc2spOwotCWxwU3RydWN0LT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplKTsKLQlscFN0cnVjdC0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWxpZCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbGlkKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbiwgKGppbnQpbHBTdHJ1Y3QtPnNjcmVlbik7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNjbGFzcywgKGppbnQpbHBTdHJ1Y3QtPmNsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrLCAoamludClscFN0cnVjdC0+cmVkX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmdyZWVuX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNvbG9ybWFwX3NpemUsIChqaW50KWxwU3RydWN0LT5jb2xvcm1hcF9zaXplKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJpdHNfcGVyX3JnYiwgKGppbnQpbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotCi1YVmlzdWFsSW5mbyAqZ2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCk7Ci12b2lkIHNldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRmNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLm1vdGlmLio7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gYXJlIHVzZWQgdG8gZHJhdyBvbiBzd3QgPGNvZGU+RHJhd2FibGU8L2NvZGU+cyAKLSAqIHRocm91Z2ggaW52b2NhdGlvbnMgb2YgcHJvdmlkZWQgT3BlbkdMIGZ1bmN0aW9ucy4KLSAqIDxwPgotICogQXBwbGljYXRpb24gY29kZSBtdXN0IGV4cGxpY2l0bHkgaW52b2tlIHRoZSA8Y29kZT5HTENvbnRleHQuZGlzcG9zZSAoKTwvY29kZT4gCi0gKiBtZXRob2QgdG8gcmVsZWFzZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgbWFuYWdlZCBieSBlYWNoIGluc3RhbmNlCi0gKiB3aGVuIHRob3NlIGluc3RhbmNlcyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGlzIGlzIDxlbT5wYXJ0aWN1bGFybHk8L2VtPgotICogaW1wb3J0YW50IG9uIFdpbmRvd3M5NSBhbmQgV2luZG93czk4IHdoZXJlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGhhcyBhIGxpbWl0ZWQKLSAqIG51bWJlciBvZiBkZXZpY2UgY29udGV4dHMgYXZhaWxhYmxlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgR0xDb250ZXh0IHsKLQlpbnQgaGFuZGxlOwotCWludCBnYzsKLQlHQ0RhdGEgZGF0YTsKLQlEcmF3YWJsZSBkcmF3YWJsZTsKLQlpbnQgc2VsZWN0QnVmZmVyUHRyID0gMDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTVNCX0ZJUlNUID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2hpY2ggaGFzIGJlZW4KLQkgKiBjb25maWd1cmVkIHRvIGRyYXcgb24gdGhlIHNwZWNpZmllZCBkcmF3YWJsZS4KLQkgKiA8cD4KLQkgKiBZb3UgbXVzdCBkaXNwb3NlIHRoZSA8Y29kZT5HTENvbnRleHQ8L2NvZGU+IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRyYXdhYmxlIHRoZSBkcmF3YWJsZSB0byBkcmF3IG9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGRyYXdhYmxlIGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05PX0hBTkRMRVMgaWYgYSBoYW5kbGUgY291bGQgbm90IGJlIG9idGFpbmVkIGZvciBnYyBjcmVhdGlvbjwvbGk+Ci0JICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGN1cnJlbnQgZGlzcGxheSBkZXB0aCBpcyBub3Qgc3VwcG9ydGVkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBHTENvbnRleHQgKERyYXdhYmxlIGRyYXdhYmxlKSB7Ci0JCWlmIChkcmF3YWJsZSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQkJdGhpcy5kcmF3YWJsZSA9IGRyYXdhYmxlOwotCQl0aGlzLmRhdGEgPSBuZXcgR0NEYXRhICgpOwotCQlnYyA9IGRyYXdhYmxlLmludGVybmFsX25ld19HQyAoZGF0YSk7Ci0JCWlmIChnYyA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQkJaW50IHhEaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwotCQlpbnQgc2NyZWVuID0gT1MuWERlZmF1bHRTY3JlZW4gKHhEaXNwbGF5KTsKLQkJaW50IGRlcHRoID0gT1MuWERlZmF1bHREZXB0aE9mU2NyZWVuIChPUy5YRGVmYXVsdFNjcmVlbk9mRGlzcGxheSAoeERpc3BsYXkpKTsKLQkJaW50IGF0dHJpYiBbXSA9IHsKLQkJCVhHTC5HTFhfTEVWRUwsCi0JCQkwLAotCQkJWEdMLkdMWF9SR0JBLAotCQkJWEdMLkdMWF9ET1VCTEVCVUZGRVIsCi0vLwkJCVhHTC5HTFhfREVQVEhfU0laRSwKLS8vCQkJZGVwdGgsCi0JCQkwCi0JCX07Ci0JCWludCBpbmZvUHRyID0gWEdMLmdsWENob29zZVZpc3VhbCAoeERpc3BsYXksIHNjcmVlbiwgYXR0cmliKTsKLQkJaWYgKGluZm9QdHIgPT0gMCkgU1dULmVycm9yIChTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotCQlYVmlzdWFsSW5mbyBpbmZvID0gbmV3IFhWaXN1YWxJbmZvICgpOwotCQlYR0wubWVtbW92ZSAoaW5mbywgaW5mb1B0ciwgWFZpc3VhbEluZm8uc2l6ZW9mKTsKLQkJT1MuWEZyZWUgKGluZm9QdHIpOwotCQloYW5kbGUgPSBYR0wuZ2xYQ3JlYXRlQ29udGV4dCAoeERpc3BsYXksIGluZm8sIDAsIGZhbHNlKTsKLQkJaWYgKGhhbmRsZSA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0JCUltYWdlRGF0YVV0aWwuYmxpdCAoCi0JCQkxLAotCQkJc291cmNlLmRhdGEsCi0JCQlzb3VyY2UuZGVwdGgsCi0JCQlzb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKHNvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCXNvdXJjZS53aWR0aCwKLQkJCXNvdXJjZS5oZWlnaHQsCi0JCQlzb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJc291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJc291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQkyNTUsCi0JCQludWxsLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLmRhdGEsCi0JCQluZXdTb3VyY2UuZGVwdGgsCi0JCQluZXdTb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKG5ld1NvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCW5ld1NvdXJjZS53aWR0aCwKLQkJCW5ld1NvdXJjZS5oZWlnaHQsCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQlmYWxzZSwKLQkJCXRydWUpOwotCi0JCXJldHVybiBuZXdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSByZWNlaXZlci4gQXBwbGljYXRpb25zIG11c3QgZGlzcG9zZSBvZiBhbGwgPGNvZGU+R0xDb250ZXh0PC9jb2RlPnMKLQkgKiB0aGF0IHRoZXkgYWxsb2NhdGUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSAoKSB7Ci0JCWlmIChoYW5kbGUgPT0gMCkgcmV0dXJuOwotCQlpbnQgeERpc3BsYXkgPSBkYXRhLmRpc3BsYXk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSB7Ci0JCQlYR0wuZ2xYTWFrZUN1cnJlbnQgKHhEaXNwbGF5LCAwLCAwKTsKLQkJfQotCQlpZiAoc2VsZWN0QnVmZmVyUHRyICE9IDApIE9TLlh0RnJlZSAoc2VsZWN0QnVmZmVyUHRyKTsKLQkJWEdMLmdsWERlc3Ryb3lDb250ZXh0ICh4RGlzcGxheSwgaGFuZGxlKTsKLQkJaGFuZGxlID0gMDsKLQkJLy8gZHJhd2FibGUgbWF5IGJlIGRpc3Bvc2VkCi0JCXRyeSB7Ci0JCQlkcmF3YWJsZS5pbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZ2MgPSAwOwotCQlkYXRhLmRpc3BsYXkgPSBkYXRhLmRyYXdhYmxlID0gZGF0YS5jb2xvcm1hcCA9IDA7Ci0JCS8qZGF0YS5mb250TGlzdCA9Ki8gZGF0YS5jbGlwUmduID0gZGF0YS5yZW5kZXJUYWJsZSA9IDA7Ci0JCWRyYXdhYmxlID0gbnVsbDsKLQkJZGF0YS5kZXZpY2UgPSBudWxsOwotCQlkYXRhLmltYWdlID0gbnVsbDsKLQkJLy9kYXRhLmNvZGVQYWdlID0gbnVsbDsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIGludFtdIGdldFNlbGVjdEJ1ZmZlciAoaW50IHNlbGVjdEJ1ZmZlclB0ciwgaW50W10gc2VsZWN0QnVmZmVyKSB7Ci0JCU9TLm1lbW1vdmUgKHNlbGVjdEJ1ZmZlciwgc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCXJldHVybiBzZWxlY3RCdWZmZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3RCdWZmZXJQdHIgKGludFtdIHNlbGVjdEJ1ZmZlcikgewotCQlpZiAoc2VsZWN0QnVmZmVyUHRyID09IDApIHsKLQkJCXNlbGVjdEJ1ZmZlclB0ciA9IE9TLlh0TWFsbG9jIChzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCX0KLQkJT1MubWVtbW92ZSAoc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIsIHNlbGVjdEJ1ZmZlci5sZW5ndGggKiA0KTsKLQkJcmV0dXJuIHNlbGVjdEJ1ZmZlclB0cjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIHRoZSBjdXJyZW50Ci0JICogPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgY3VycmVudCA8Y29kZT5HTENvbnRleHQ8L2NvZGU+LAotCSAqIGZhbHNlIG90aGVyd2lzZQotCSAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotCSAqICAgIDxsaT5FUlJPUl9HUkFQSElDX0RJU1BPU0VEIGlmIHRoZSByZWNlaXZlciBpcyBkaXNwb3NlZDwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgCVNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlyZXR1cm4gWEdMLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gaGFzIGJlZW4KLQkgKiBkaXNwb3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBnZXRzIHRoZSBkaXNwb3NlIHN0YXRlIGZvciB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiBXaGVuIGEgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgaXMgYW4gZXJyb3IgdG8KLQkgKiBpbnZva2UgYW55IG90aGVyIG1ldGhvZCB1c2luZyB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBpcyBkaXNwb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCAoKSB7Ci0JCXJldHVybiBoYW5kbGUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGJpdG1hcCBmb250LgotCSAqIAotCSAqIEBwYXJhbSBmZGF0YQotCSAqIEBwYXJhbSBkZXZpY2UKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSBmaXJzdAotCSAqIEBwYXJhbSBjb3VudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRCaXRtYXBGb250IChGb250RGF0YSBmZGF0YSwgRGV2aWNlIGRldmljZSwgaW50IGJhc2UsIGludCBzdGFydEluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCS8qIFRlbXBvcmFyeSBjb2RlLCBkdWUgc29tZSBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gVVRGLTggbG9hZEJpdG1hcEZvbnQgKCkKLQkJICogaXMgcmVzdHJpY3QgdG8gd29ya3Mgb25seSBmb3IgYXNjaWkuIAotCQkgKiBOb3RlOiBlbl9VUy5JU084ODU5LTEgYWxzbyBjb2RlIGJlIHVzZWQuCi0JCSAqLwotCQlmZGF0YS5zZXRMb2NhbGUgKCJDIik7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250IChkZXZpY2UsIGZkYXRhKTsKLQkJaW50IGZvbnRMaXN0ID0gZm9udC5oYW5kbGU7Ci0JCWludFtdIGJ1ZmZlciA9IG5ldyBpbnQgWzFdOwotCQlpZiAoIU9TLlhtRm9udExpc3RJbml0Rm9udENvbnRleHQgKGJ1ZmZlciwgZm9udExpc3QpKSByZXR1cm47Ci0JCWludCBjb250ZXh0ID0gYnVmZmVyIFswXTsKLQkJWEZvbnRTdHJ1Y3QgZm9udFN0cnVjdCA9IG5ldyBYRm9udFN0cnVjdCAoKTsKLQkJaW50IGZvbnRMaXN0RW50cnk7Ci0JCWludFtdIGZvbnRTdHJ1Y3RQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50W10gZm9udE5hbWVQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50IHhmb250ID0gMDsKLQkJLy8gZ28gdGhyb3VnaCBlYWNoIGVudHJ5IGluIHRoZSBmb250IGxpc3QKLQkJd2hpbGUgKChmb250TGlzdEVudHJ5ID0gT1MuWG1Gb250TGlzdE5leHRFbnRyeSAoY29udGV4dCkpICE9IDApIHsKLQkJCWludCBmb250UHRyID0gT1MuWG1Gb250TGlzdEVudHJ5R2V0Rm9udCAoZm9udExpc3RFbnRyeSwgYnVmZmVyKTsKLQkJCWlmIChidWZmZXIgWzBdID09IE9TLlhtRk9OVF9JU19GT05UKSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBzaW5nbGUgZm9udAotCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRQdHIsIDIwICogNCk7Ci0JCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBmb250U2V0Ci0JCQkJaW50IG5Gb250cyA9IE9TLlhGb250c09mRm9udFNldCAoZm9udFB0ciwgZm9udFN0cnVjdFB0ciwgZm9udE5hbWVQdHIpOwotCQkJCWludFtdIGZvbnRTdHJ1Y3RzID0gbmV3IGludCBbbkZvbnRzXTsKLQkJCQlPUy5tZW1tb3ZlIChmb250U3RydWN0cywgZm9udFN0cnVjdFB0ciBbMF0sIG5Gb250cyAqIDQpOwotCQkJCS8vIEdvIHRocm91Z2ggZWFjaCBmb250U3RydWN0IGluIHRoZSBmb250IHNldC4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5Gb250czsgaSsrKSB7Ci0JCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRTdHJ1Y3RzIFtpXSwgWEZvbnRTdHJ1Y3Quc2l6ZW9mKTsKLQkJCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHhmb250ICE9IDApIHsKLQkJCVhHTC5nbFhVc2VYRm9udCAoeGZvbnQsIHN0YXJ0SW5kZXgsIGxlbmd0aCwgYmFzZSk7Ci0JCX0KLQkJZm9udC5kaXNwb3NlICgpOwotCQlPUy5YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0IChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIG91dGxpbmUgZm9udC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRhdGEKLQkgKiBAcGFyYW0gZGV2aWNlCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZmlyc3QKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAcGFyYW0gZGV2aWF0aW9uCi0JICogQHBhcmFtIGV4dHJ1c2lvbgotCSAqIEBwYXJhbSBmb3JtYXQKLQkgKiBAcGFyYW0gbHBnbWYKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3V0bGluZUZvbnQgKEZvbnREYXRhIGZkYXRhLCBEZXZpY2UgZGV2aWNlLCBpbnQgYmFzZSwgaW50IGZpcnN0LAotCWludCBjb3VudCwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIEdMWVBITUVUUklDU0ZMT0FUW10gbHBnbWYpIHsKLQkJLy8gc3R1YgotCX0KLQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB4Ci0JICogQHBhcmFtIHkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzaXplIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IDE7Ci0JCUdMLmdsVmlld3BvcnQgKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX1BST0pFQ1RJT04pOwotCQlHTC5nbExvYWRJZGVudGl0eSAoKTsKLQkJR0xVLmdsdVBlcnNwZWN0aXZlICg0NS4wZiwgKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0LCAwLjFmLCAxMDAuMGYpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX01PREVMVklFVyk7Ci0JCUdMLmdsTG9hZElkZW50aXR5ICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlY2VpdmVyIHRvIGJlIHRoZSBjdXJyZW50IDxjb2RlPkdMQ29udGV4dDwvY29kZT4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgU1dULmVycm9yIChTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSByZXR1cm47Ci0JCVhHTC5nbFhNYWtlQ3VycmVudCAoZGF0YS5kaXNwbGF5LCBkYXRhLmRyYXdhYmxlLCBoYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSByZWNlaXZlcidzIGJ1ZmZlcnMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQkJaWYgKGlzRGlzcG9zZWQgKCkpIFNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlYR0wuZ2xYU3dhcEJ1ZmZlcnMgKGRhdGEuZGlzcGxheSwgZGF0YS5kcmF3YWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvbW90aWYvWEdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhM2U1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuTGlicmFyeTsKLQotcHVibGljIGNsYXNzIFhHTCB7Ci0JCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OXzFfMSA9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTl8xXzIgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFUlNJT05fMV8zID0gMTsKLQotLyoKLSoqIFZpc3VhbCBDb25maWcgQXR0cmlidXRlcyAoZ2xYR2V0Q29uZmlnLCBnbFhHZXRGQkNvbmZpZ0F0dHJpYikKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVVNFX0dMCQk9IDE7CS8qIHN1cHBvcnQgR0xYIHJlbmRlcmluZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JVRkZFUl9TSVpFCQk9IDI7CS8qIGRlcHRoIG9mIHRoZSBjb2xvciBidWZmZXIgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MRVZFTAkJPSAzOwkvKiBsZXZlbCBpbiBwbGFuZSBzdGFja2luZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkEJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJPSA1OwkvKiBkb3VibGUgYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURVJFTwkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQk9IDc7CS8qIG51bWJlciBvZiBhdXggYnVmZmVycyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFRF9TSVpFCQk9IDg7CS8qIG51bWJlciBvZiByZWQgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkVFTl9TSVpFCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJPSAxMDsJLyogbnVtYmVyIG9mIGJsdWUgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BTFBIQV9TSVpFCQk9IDExOwkvKiBudW1iZXIgb2YgYWxwaGEgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9TSVpFCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQk9IDEzOwkvKiBudW1iZXIgb2Ygc3RlbmNpbCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fUkVEX1NJWkUJPSAxNDsJLyogbnVtYmVyIG9mIHJlZCBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fR1JFRU5fU0laRQk9IDE1OwkvKiBudW1iZXIgb2YgZ3JlZW4gYWNjdW0gYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX0JMVUVfU0laRQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJCT0gMHgyMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRQk9IDB4MjQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCT0gMHgyNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRQk9IDB4MjY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQk9IDB4Mjc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUUJPSAweDI4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RSQVdBQkxFX1RZUEUJCT0gMHg4MDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkJPSAweDgwMTE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9SRU5ERVJBQkxFCQk9IDB4ODAxMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJCT0gMHg4MDEzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1dJRFRICQk9IDB4ODAxNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQJCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwkJPSAweDgwMTg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0lECQkJPSAweDgwMEI7Ci0KLS8qCi0qKiBFcnJvciByZXR1cm4gdmFsdWVzIGZyb20gZ2xYR2V0Q29uZmlnLiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkKLSoqIGEgdmFsdWUgb2YgMC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1NDUkVFTgkJPSAxOwkvKiBzY3JlZW4gIyBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfQVRUUklCVVRFCT0gMjsJLyogYXR0cmlidXRlIHRvIGdldCBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT19FWFRFTlNJT04JPSAzOwkvKiBubyBnbHggZXh0ZW5zaW9uIG9uIHNlcnZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WSVNVQUwJCT0gNDsJLyogdmlzdWFsICMgbm90IGtub3duIGJ5IEdMWCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9DT05URVhUCQk9IDU7CS8qIHJldHVybmVkIG9ubHkgYnkgaW1wb3J0X2NvbnRleHQgRVhUPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WQUxVRQkJPSA2OwkvKiByZXR1cm5lZCBvbmx5IGJ5IGdsWFN3YXBJbnRlcnZhbFNHST8gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfRU5VTQkJPSA3OwkvKiB1bnVzZWQ/ICovCi0KLS8qIEZCQ29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLQotLyoKLSoqIEdlbmVyaWMgImRvbid0IGNhcmUiIHZhbHVlIGZvciBnbFggQ2hvb3NlRkJDb25maWcgYXR0cmlidXRlcyAoZXhjZXB0Ci0qKiBHTFhfTEVWRUwpCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RPTlRfQ0FSRQkJCT0gMHhGRkZGRkZGRjsKLQotLyogR0xYX1JFTkRFUl9UWVBFIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9CSVQJCT0gMHgwMDAwMDAwMjsKLQotLyogR0xYX0RSQVdBQkxFX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPV19CSVQJCQk9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUElYTUFQX0JJVAkJCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0JJVAkJCT0gMHgwMDAwMDAwNDsKLQotLyogR0xYX0NPTkZJR19DQVZFQVQgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCQk9IDB4ODAwOTsKLQotLyogZ2xYQ3JlYXRlR0xYUGJ1ZmZlciBhdHRyaWJ1dGVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTCQk9IDB4ODAxQjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MQVJHRVNUX1BCVUZGRVIJCT0gMHg4MDFDOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfSEVJR0hUCQk9IDB4ODA0MDsJLyogTmV3IGZvciBHTFggMS4zICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9XSURUSAkJPSAweDgwNDE7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotCi0vKiBnbFhRdWVyeUdMWFBCdWZmZXIgYXR0cmlidXRlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJRFRICQkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQkJPSAweDgwMUU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVZFTlRfTUFTSwkJCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCQk9IDB4ODAxNTsKLQotLyogZ2xYUXVlcnlDb250ZXh0IGF0dHJpYnV0ZXMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJICAweDgwMTMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRU5ERVJfVFlQRQkJICAweDgwMTEgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU4JCQk9IDB4ODAwQzsKLQotLyogZ2xYU2VsZWN0RXZlbnQgZXZlbnQgbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9DTE9CQkVSX01BU0sJPSAweDA4MDAwMDAwOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGV2ZW50X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfREFNQUdFRAkJCT0gMHg4MDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NBVkVECQkJPSAweDgwMjE7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZHJhd190eXBlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPVwkJCT0gMHg4MDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVIJCQk9IDB4ODAyMzsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBidWZmZXJfbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX0xFRlRfQlVGRkVSX0JJVAk9IDB4MDAwMDAwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BVVhfQlVGRkVSU19CSVQJCT0gMHgwMDAwMDAxMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RFTkNJTF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQlVGRkVSX0JJVAkJPSAweDAwMDAwMDgwOwotCi0vKgotKiogRXh0ZW5zaW9uIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBUaGVzZSBhcmUgYWxzbwotKiogYWNjZXB0ZWQgYXMgcGFyYW1ldGVyIHZhbHVlcyBmb3IgZ2xYQ2hvb3NlVmlzdWFsLgotKi8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1hfVklTVUFMX1RZUEVfRVhUCT0gMHgyMjsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9UWVBFX0VYVCA9IDB4MjM7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFX0VYVCA9IDB4MjQ7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRV9FWFQJPSAweDI1OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRV9FWFQgPSAweDI2OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFX0VYVAk9IDB4Mjc7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFX0VYVCA9IDB4Mjg7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF90eXBlICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJVRV9DT0xPUl9FWFQJPSAweDgwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRElSRUNUX0NPTE9SX0VYVAk9IDB4ODAwMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QU0VVRE9fQ09MT1JfRVhUCT0gMHg4MDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NUQVRJQ19DT0xPUl9FWFQJPSAweDgwMDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfR1JBWV9TQ0FMRV9FWFQJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVlfRVhUCT0gMHg4MDA3OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHRyYW5zcGFyZW50IHBpeGVsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORV9FWFQJCT0gMHg4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JHQl9FWFQJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX0VYVAk9IDB4ODAwOTsKLQotLyogUHJvcGVydHkgdmFsdWVzIGZvciB2aXN1YWxfcmF0aW5nICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0NBVkVBVF9FWFQJCT0gMHgyMDsgIC8qIHZpc3VhbF9yYXRpbmcgZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX1ZJU1VBTF9FWFQJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX1ZJU1VBTF9FWFQJPSAweDgwMEQ7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhHZXRDbGllbnRTdHJpbmcuCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFTkRPUgkJPSAweDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTgkJPSAweDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhURU5TSU9OUwkJPSAweDM7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhRdWVyeUNvbnRleHRJbmZvRVhULgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TSEFSRV9DT05URVhUX0VYVAk9IDB4ODAwQTsJLyogaWQgb2Ygc2hhcmUgY29udGV4dCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZJU1VBTF9JRF9FWFQJPSAweDgwMEI7CS8qIGlkIG9mIGNvbnRleHQncyB2aXN1YWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU5fRVhUCQk9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKiBHTFggRXh0ZW5zaW9uIFN0cmluZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRfaW1wb3J0X2NvbnRleHQJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0VYVF92aXN1YWxfaW5mbwk9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzID0gMTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWENob29zZVZpc3VhbChpbnQgZHB5LCBpbnQgc2NyZWVuLCBpbnRbXSBhdHRyaWJMaXN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYQ29weUNvbnRleHQoaW50IGRweSwgaW50IHNyYywgaW50IGRzdCwgaW50IG1hc2spOwotLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBpbnQgdmlzLCBpbnQgc2hhcmVMaXN0LCBib29sZWFuIGRpcmVjdCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YVmlzdWFsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgwMzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotIAotcHVibGljIGNsYXNzIFhWaXN1YWxJbmZvIHsKLQlwdWJsaWMgaW50IHZpc3VhbDsKLQlwdWJsaWMgaW50IHZpc3VhbGlkOwotCXB1YmxpYyBpbnQgc2NyZWVuOwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0JcHVibGljIGludCBjY2xhc3M7Ci0JcHVibGljIGludCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOwotCXB1YmxpYyBpbnQgY29sb3JtYXBfc2l6ZTsKLQlwdWJsaWMgaW50IGJpdHNfcGVyX3JnYjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMDNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgT3BlbkdMIEJpbmRpbmdzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWY4NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iJHdzJC9zd3QuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2Q5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXJlbSAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotcmVtICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1yZW0gIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotcmVtICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLXJlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLXJlbSAgCi1yZW0gIENvbnRyaWJ1dG9yczoKLXJlbSAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQGVjaG8gb2ZmCi0KLUlGIE5PVCAiJUpBVkFfSE9NRSUiPT0iIiBHT1RPIE1BS0UKLQotcmVtICoqKioqCi1yZW0gSmF2YWgKLXJlbSAqKioqKgotc2V0IEpBVkFfSE9NRT1qOlx0ZWFtc3d0XHN3dC1idWlsZGRpclxpdmVcYmluCi1zZXQgcGF0aD0lSkFWQV9IT01FJTslcGF0aCUKLQotcmVtICoqKioqKioqCi1yZW0gTVNWQyA2LjAKLXJlbSAqKioqKioqKgotY2FsbCBrOlxkZXZccHJvZHVjdHNcbXN2YzYwXHZjOThcYmluXHZjdmFyczMyLmJhdAotCi1yZW0gKioqKioqIAotcmVtIE1TLVNESwotcmVtICoqKioqKgotc2V0IE1zc2RrPWo6XHRlYW1zd3Rcc3d0LWJ1aWxkZGlyXG1zc2RrCi1jYWxsICVtc3NkayVcc2V0ZW52LmJhdAotCi06TUFLRQotbm1ha2UgLWYgbWFrZV93aW4zMi5tYWsgJTEgJTIgJTMgJTQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L2dsdy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzhlZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luZ2RpLmg+Ci0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFdHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX1dHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxKQotewotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJDaG9vc2VQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcxKSBscGFyZzEgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpQ2hvb3NlUGl4ZWxGb3JtYXQoKEhEQylhcmcwLCAoQ09OU1QgUElYRUxGT1JNQVRERVNDUklQVE9SICopbHBhcmcxKTsKLQlpZiAoYXJnMSkgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRShEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGpvYmplY3QgYXJnMykKLXsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgX2FyZzMsICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiRGVzY3JpYmVQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmczKSBscGFyZzMgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCAmX2FyZzMpOwotCXJjID0gKGppbnQpRGVzY3JpYmVQaXhlbEZvcm1hdCgoSERDKWFyZzAsIGFyZzEsIGFyZzIsIChMUFBJWEVMRk9STUFUREVTQ1JJUFRPUilscGFyZzMpOwotCWlmIChhcmczKSBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCBscGFyZzMpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKEdldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJHZXRQaXhlbEZvcm1hdFxuIikKLQotCXJldHVybiAoamludClHZXRQaXhlbEZvcm1hdCgoSERDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFNldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqb2JqZWN0IGFyZzIpCi17Ci0JUElYRUxGT1JNQVRERVNDUklQVE9SIF9hcmcyLCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJTZXRQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcyLCAmX2FyZzIpOwotCXJjID0gKGpib29sZWFuKVNldFBpeGVsRm9ybWF0KChIREMpYXJnMCwgYXJnMSwgKENPTlNUIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqKWxwYXJnMik7Ci0JaWYgKGFyZzIpIHNldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzIsIGxwYXJnMik7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJTd2FwQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pU3dhcEJ1ZmZlcnMoKEhEQylhcmcwKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoIndnbENvcHlDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xDb3B5Q29udGV4dCgoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEsIChVSU5UKWFyZzIpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlQ29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xDcmVhdGVDb250ZXh0KChIREMpYXJnMCk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDcmVhdGVMYXllckNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlTGF5ZXJDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqaW50KXdnbENyZWF0ZUxheWVyQ29udGV4dCgoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlbGV0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCURFQlVHX0NBTEwoIndnbERlbGV0ZUNvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGpib29sZWFuKXdnbERlbGV0ZUNvbnRleHQoKEhHTFJDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlc2NyaWJlTGF5ZXJQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpvYmplY3QgYXJnNCkKLXsKLQlMQVlFUlBMQU5FREVTQ1JJUFRPUiBfYXJnNCwgKmxwYXJnND1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsRGVzY3JpYmVMYXllclBsYW5lXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9IGdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKGVudiwgYXJnNCwgJl9hcmc0KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xEZXNjcmliZUxheWVyUGxhbmUoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCAoTFBMQVlFUlBMQU5FREVTQ1JJUFRPUilscGFyZzQpOwotCWlmIChhcmc0KSBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzQsIGxwYXJnNCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlERUJVR19DQUxMKCJ3Z2xHZXRDdXJyZW50Q29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xHZXRDdXJyZW50Q29udGV4dCgpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudERDKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgid2dsR2V0Q3VycmVudERDXG4iKQotCi0JcmV0dXJuIChqaW50KXdnbEdldEN1cnJlbnREQygpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJ3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCXJjID0gKGppbnQpd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChDT0xPUlJFRiAqKWxwYXJnNCk7Ci0JaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbEdldFByb2NBZGRyZXNzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbEdldFByb2NBZGRyZXNzXG4iKQotCi0JaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQlyYyA9IChqaW50KXdnbEdldFByb2NBZGRyZXNzKChMUENTVFIpbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJ3Z2xNYWtlQ3VycmVudFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsTWFrZUN1cnJlbnQoKEhEQylhcmcwLCAoSEdMUkMpYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsUmVhbGl6ZUxheWVyUGFsZXR0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamJvb2xlYW4gYXJnMikKLXsKLQlERUJVR19DQUxMKCJ3Z2xSZWFsaXplTGF5ZXJQYWxldHRlXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKChIREMpYXJnMCwgYXJnMSwgKEJPT0wpYXJnMik7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludEFycmF5IGFyZzQpCi17Ci0JamludCAqbHBhcmc0PU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbFNldExheWVyUGFsZXR0ZUVudHJpZXNcbiIpCi0KLQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JcmMgPSAoamludCl3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKENPTlNUIENPTE9SUkVGICopbHBhcmc0KTsKLQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFNoYXJlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU2hhcmVMaXN0c1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU2hhcmVMaXN0cygoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFN3YXBMYXllckJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU3dhcExheWVyQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU3dhcExheWVyQnVmZmVycygoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRCaXRtYXBzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgid2dsVXNlRm9udEJpdG1hcHNBXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xVc2VGb250Qml0bWFwc0EoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xVc2VGb250Qml0bWFwc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRCaXRtYXBzV1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsVXNlRm9udEJpdG1hcHNXKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsVXNlRm9udE91dGxpbmVzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSwgamludCBhcmc2LCBqb2JqZWN0IGFyZzcpCi17Ci0vLwlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnNywgKmxwYXJnNz1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsVXNlRm9udE91dGxpbmVzQVxuIikKLQotLy8JaWYgKGFyZzcpIGxwYXJnNyA9IGdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKGVudiwgYXJnNywgJl9hcmc3KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xVc2VGb250T3V0bGluZXNBKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKEZMT0FUKWFyZzQsIChGTE9BVClhcmc1LCBhcmc2LCAoTFBHTFlQSE1FVFJJQ1NGTE9BVClhcmc3KTsKLS8vCWlmIChhcmc3KSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsIGxwYXJnNyk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRPdXRsaW5lc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGppbnQgYXJnNiwgam9iamVjdCBhcmc3KQotewotLy8JR0xZUEhNRVRSSUNTRkxPQVQgX2FyZzcsICpscGFyZzc9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRPdXRsaW5lc1dcbiIpCi0KLS8vCWlmIChhcmc3KSBscGFyZzcgPSBnZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsICZfYXJnNyk7Ci0JcmMgPSAoamJvb2xlYW4pd2dsVXNlRm9udE91dGxpbmVzVygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChGTE9BVClhcmc0LCAoRkxPQVQpYXJnNSwgYXJnNiwgKExQR0xZUEhNRVRSSUNTRkxPQVQpYXJnNyk7Ci0vLwlpZiAoYXJnNykgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmc3LCBscGFyZzcpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBXR0xfTkFUSVZFKE1vdmVNZW1vcnlXX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF93aW4zMl9HTFlQSE1FVFJJQ1NGTE9BVF8ySUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgam9iamVjdCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnMCwgKmxwYXJnMD1OVUxMOwotCi0JREVCVUdfQ0FMTCgiTW92ZU1lbW9yeVdfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSVxuIikKLQlERUJVR19DSEVDS19OVUxMKGVudiwgYXJnMSkKLQkKLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCU1vdmVNZW1vcnkoKFBWT0lEKWxwYXJnMCwgKENPTlNUIFZPSUQgKilhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMCkgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFdHTF9OQVRJVkUoTW92ZU1lbW9yeUFfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMWVBITUVUUklDU0ZMT0FUIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJNb3ZlTWVtb3J5QV9fTG9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfaW50ZXJuYWxfd2luMzJfR0xZUEhNRVRSSUNTRkxPQVRfMklJXG4iKQotCURFQlVHX0NIRUNLX05VTEwoZW52LCBhcmcxKQotCQotCWlmIChhcmcwKSBscGFyZzAgPSAmX2FyZzA7Ci0JTW92ZU1lbW9yeSgoUFZPSUQpbHBhcmcwLCAoQ09OU1QgVk9JRCAqKWFyZzEsIGFyZzIpOwotCWlmIChhcmcwKSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzAsIGxwYXJnMCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvbWFrZV93aW4zMi5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1haworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgYXNzdW1lcyBKQVZBX0hPTUUgaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBmcm9tIHdoaWNoIG5tYWtlIGlzIHJ1bgotCi1BUFBWRVI9NS4wCi0haW5jbHVkZSA8d2luMzIubWFrPgotCi1wZ21fdmVyX3N0cj0iU1dUICQobWFqX3ZlcikuJChtaW5fdmVyKSBmb3IgV2luZG93cyIKLXRpbWVzdGFtcF9zdHI9X19EQVRFX19cIiBcIl9fVElNRV9fXCIgKEVTVClcIgotY29weXJpZ2h0ID0gIkNvcHlyaWdodCAoQykgMTk5OSwgMjAwMyBJQk0gQ29ycC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIgotCi1TV1RfUFJFRklYPWdsCi1XU19QUkVGSVg9d2luMzIKLVNXVF9MSUIgICAgID0gJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuZGxsCi0KLUxJTktfTElCUyA9IG9wZW5nbDMyLmxpYiBnbHUzMi5saWIgZ2RpMzIubGliCi0KLSMgbm90ZTogdGhvcm91Z2hseSB0ZXN0IGFsbCBleGFtcGxlcyBhZnRlciBjaGFuZ2luZyBhbnkgb3B0aW1pemF0aW9uIGZsYWdzCi1TV1RfQ0RFQlVHID0gIy1aaSAtT2RpCi1TV1RfTERFQlVHID0gIy9ERUJVRyAvREVCVUdUWVBFOmJvdGgKLUNGTEFHUyA9IC1jIC1XMyAtRzYgLUdEIC1PMSAkKFNXVF9DREVCVUcpIC1ub2xvZ28gLURfWDg2Xz0xIC1EX1dJTjMyIC1EX1dJTjk1IC1EX1dJTjMyX1dJTkRPV1M9MHgwNDAwIC1EX01UIC1NVCAtRFdJTjMyIC1EX1dJTjMyX0RDT00gL0kkKEpBVkFfSE9NRSlcaW5jbHVkZSAvSS4KLVJDRkxBR1MgPSAtRFNXVF9DT01NQV9WRVJTSU9OPSQoY29tbWFfdmVyKQotTEZMQUdTID0gL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAvUkVMRUFTRSAvTk9MT0dPICQoU1dUX0xERUJVRykgLWVudHJ5Ol9EbGxNYWluQ1JUU3RhcnR1cEAxMiAtZGxsIC9CQVNFOjB4MTAwMDAwMDAgL2NvbW1lbnQ6JChwZ21fdmVyX3N0cikgL2NvbW1lbnQ6JChjb3B5cmlnaHQpIC9ETEwKLQotU1dUX09CSlMgPSBzd3Qub2JqIGdsLm9iaiBnbHUub2JqIGdsdy5vYmogc3RydWN0cy5vYmoKLQotYWxsOiAkKFNXVF9MSUIpCi0KLS5jLm9iajoKLQljbCAkKENGTEFHUykgJCouYwotCi0kKFNXVF9MSUIpOiAkKFNXVF9PQkpTKSBzd3QucmVzCi0JZWNobyAkKExGTEFHUykgPnRlbXBscmYKLQllY2hvICQoTElOS19MSUJTKSA+PnRlbXBscmYKLQllY2hvIC1tYWNoaW5lOklYODYgPj50ZW1wbHJmCi0JZWNobyAtc3Vic3lzdGVtOndpbmRvd3MgPj50ZW1wbHJmCi0JZWNobyAtb3V0OiQoU1dUX0xJQikgPj50ZW1wbHJmCi0JZWNobyAkKFNXVF9PQkpTKSA+PnRlbXBscmYKLQllY2hvIHN3dC5yZXMgPj50ZW1wbHJmCi0JbGluayBAdGVtcGxyZgotCWRlbCB0ZW1wbHJmCi0JCi1zd3QucmVzOgotCXJjICQoUkNGTEFHUykgLURTV1RfT1JHX0ZJTEVOQU1FPVwiJChTV1RfTElCKVwiIC1yIC1mbyBzd3QucmVzIHN3dC5yYwotCQotY2xlYW46Ci0gICAgZGVsICoub2JqICoucmVzICouZGxsICoubGliICouZXhwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODQzNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJzdHJ1Y3RzLmgiCi0KLXR5cGVkZWYgc3RydWN0IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSB7Ci0JaW50IGNhY2hlZDsKLQlqY2xhc3MgY2xheno7Ci0JamZpZWxkSUQgZ21mQ2VsbEluY1ksIGdtZkNlbGxJbmNYLCBnbWZwdEdseXBoT3JpZ2luX3ksIGdtZnB0R2x5cGhPcmlnaW5feCwgZ21mQmxhY2tCb3hZLCBnbWZCbGFja0JveFg7Ci19IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRTsKLXR5cGVkZWYgR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFICpQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFOwotCi1HTFlQSE1FVFJJQ1NGTE9BVF9GSURfQ0FDSEUgR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQotdm9pZCBjYWNoZUdMWVBITUVUUklDU0ZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Z21mQ2VsbEluY1kgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZkNlbGxJbmNZIiwgIkYiKTsKLQlscENhY2hlLT5nbWZDZWxsSW5jWCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQ2VsbEluY1giLCAiRiIpOwotCWxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mcHRHbHlwaE9yaWdpbl95IiwgIkYiKTsKLQlscENhY2hlLT5nbWZwdEdseXBoT3JpZ2luX3ggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZnB0R2x5cGhPcmlnaW5feCIsICJGIik7Ci0JbHBDYWNoZS0+Z21mQmxhY2tCb3hZID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJnbWZCbGFja0JveFkiLCAiRiIpOwotCWxwQ2FjaGUtPmdtZkJsYWNrQm94WCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQmxhY2tCb3hYIiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1HTFlQSE1FVFJJQ1NGTE9BVCAqZ2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmdtZkNlbGxJbmNZID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZKTsKLQlscFN0cnVjdC0+Z21mQ2VsbEluY1ggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQ2VsbEluY1gpOwotCWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl95KTsKLQlscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi54ID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feCk7Ci0JbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSA9ICgqZW52KS0+R2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFkpOwotCWxwU3RydWN0LT5nbWZCbGFja0JveFggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQmxhY2tCb3hYKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNYLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWCk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSwgKGpmbG9hdClscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi55KTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl94LCAoamZsb2F0KWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLngpOwotCSgqZW52KS0+U2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFksIChqZmxvYXQpbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkJsYWNrQm94WCwgKGpmbG9hdClscFN0cnVjdC0+Z21mQmxhY2tCb3hYKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBjclRyYW5zcGFyZW50LCBiUmVzZXJ2ZWQsIGlMYXllclBsYW5lLCBjQXV4QnVmZmVycywgY1N0ZW5jaWxCaXRzLCBjRGVwdGhCaXRzLCBjQWNjdW1BbHBoYUJpdHMsIGNBY2N1bUJsdWVCaXRzLCBjQWNjdW1HcmVlbkJpdHMsIGNBY2N1bVJlZEJpdHMsIGNBY2N1bUJpdHMsIGNBbHBoYVNoaWZ0LCBjQWxwaGFCaXRzLCBjQmx1ZVNoaWZ0LCBjQmx1ZUJpdHMsIGNHcmVlblNoaWZ0LCBjR3JlZW5CaXRzLCBjUmVkU2hpZnQsIGNSZWRCaXRzLCBjQ29sb3JCaXRzLCBpUGl4ZWxUeXBlLCBkd0ZsYWdzLCBuVmVyc2lvbiwgblNpemU7Ci19IExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFICpQTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFOwotCi1MQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgTEFZRVJQTEFORURFU0NSSVBUT1JGYzsKLQotdm9pZCBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY3JUcmFuc3BhcmVudCIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJpTGF5ZXJQbGFuZSIsICJCIik7Ci0JbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBdXhCdWZmZXJzIiwgIkIiKTsKLQlscENhY2hlLT5jU3RlbmNpbEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNTdGVuY2lsQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0RlcHRoQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1BbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CbHVlQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1HcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bVJlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWxwaGFTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjR3JlZW5TaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0dyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0NvbG9yQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0NvbG9yQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiaVBpeGVsVHlwZSIsICJCIik7Ci0JbHBDYWNoZS0+ZHdGbGFncyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZHdGbGFncyIsICJJIik7Ci0JbHBDYWNoZS0+blZlcnNpb24gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5WZXJzaW9uIiwgIlMiKTsKLQlscENhY2hlLT5uU2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiblNpemUiLCAiUyIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLUxBWUVSUExBTkVERVNDUklQVE9SICpnZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KQotewotCVBMQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZMQVlFUlBMQU5FREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aUxheWVyUGxhbmUpOwotCWxwU3RydWN0LT5jQXV4QnVmZmVycyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBdXhCdWZmZXJzKTsKLQlscFN0cnVjdC0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzKTsKLQlscFN0cnVjdC0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1BbHBoYUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhU2hpZnQpOwotCWxwU3RydWN0LT5jQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cyk7Ci0JbHBTdHJ1Y3QtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0dyZWVuU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5TaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0KTsKLQlscFN0cnVjdC0+Y1JlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jUmVkQml0cyk7Ci0JbHBTdHJ1Y3QtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzKTsKLQlscFN0cnVjdC0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUpOwotCWxwU3RydWN0LT5kd0ZsYWdzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzKTsKLQlscFN0cnVjdC0+blZlcnNpb24gPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24pOwotCWxwU3RydWN0LT5uU2l6ZSA9ICgqZW52KS0+R2V0U2hvcnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5uU2l6ZSk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJkxBWUVSUExBTkVERVNDUklQVE9SRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlTEFZRVJQTEFORURFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCwgKGppbnQpbHBTdHJ1Y3QtPmNyVHJhbnNwYXJlbnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclBsYW5lLCAoamJ5dGUpbHBTdHJ1Y3QtPmlMYXllclBsYW5lKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycywgKGpieXRlKWxwU3RydWN0LT5jQXV4QnVmZmVycyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0RlcHRoQml0cywgKGpieXRlKWxwU3RydWN0LT5jRGVwdGhCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtUmVkQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1SZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0JsdWVTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlbkJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y1JlZEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNDb2xvckJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0NvbG9yQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aVBpeGVsVHlwZSwgKGpieXRlKWxwU3RydWN0LT5pUGl4ZWxUeXBlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3RmxhZ3MsIChqaW50KWxwU3RydWN0LT5kd0ZsYWdzKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24sIChqc2hvcnQpbHBTdHJ1Y3QtPm5WZXJzaW9uKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUsIChqc2hvcnQpbHBTdHJ1Y3QtPm5TaXplKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgUE9JTlRGTE9BVF9GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHksIHg7Ci19IFBPSU5URkxPQVRfRklEX0NBQ0hFOwotdHlwZWRlZiBQT0lOVEZMT0FUX0ZJRF9DQUNIRSAqUFBPSU5URkxPQVRfRklEX0NBQ0hFOwotCi1QT0lOVEZMT0FUX0ZJRF9DQUNIRSBQT0lOVEZMT0FURmM7Ci0KLXZvaWQgY2FjaGVQT0lOVEZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUFBPSU5URkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT55ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ5IiwgIkYiKTsKLQlscENhY2hlLT54ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ4IiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QT0lOVEZMT0FUICpnZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCkKLXsKLQlQUE9JTlRGTE9BVF9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQT0lOVEZMT0FURmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlUE9JTlRGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSk7Ci0JbHBTdHJ1Y3QtPnggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eCk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldFBPSU5URkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBPSU5URkxPQVQgKmxwU3RydWN0KQotewotCVBQT0lOVEZMT0FUX0ZJRF9DQUNIRSBscENhY2hlID0gJlBPSU5URkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQT0lOVEZMT0FURmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSwgKGpmbG9hdClscFN0cnVjdC0+eSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPngsIChqZmxvYXQpbHBTdHJ1Y3QtPngpOwotfQotCi10eXBlZGVmIHN0cnVjdCBQSVhFTEZPUk1BVERFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBkd0RhbWFnZU1hc2ssIGR3VmlzaWJsZU1hc2ssIGR3TGF5ZXJNYXNrLCBiUmVzZXJ2ZWQsIGlMYXllclR5cGUsIGNBdXhCdWZmZXJzLCBjU3RlbmNpbEJpdHMsIGNEZXB0aEJpdHMsIGNBY2N1bUFscGhhQml0cywgY0FjY3VtQmx1ZUJpdHMsIGNBY2N1bUdyZWVuQml0cywgY0FjY3VtUmVkQml0cywgY0FjY3VtQml0cywgY0FscGhhU2hpZnQsIGNBbHBoYUJpdHMsIGNCbHVlU2hpZnQsIGNCbHVlQml0cywgY0dyZWVuU2hpZnQsIGNHcmVlbkJpdHMsIGNSZWRTaGlmdCwgY1JlZEJpdHMsIGNDb2xvckJpdHMsIGlQaXhlbFR5cGUsIGR3RmxhZ3MsIG5WZXJzaW9uLCBuU2l6ZTsKLX0gUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSAqUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEU7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgUElYRUxGT1JNQVRERVNDUklQVE9SRmM7Ci0KLXZvaWQgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0RhbWFnZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3VmlzaWJsZU1hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3VmlzaWJsZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0xheWVyTWFzayIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlMYXllclR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmNBdXhCdWZmZXJzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQXV4QnVmZmVycyIsICJCIik7Ci0JbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjU3RlbmNpbEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNEZXB0aEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUFscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQWxwaGFCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtR3JlZW5CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1SZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1SZWRCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNCbHVlU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jR3JlZW5TaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNHcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZFNoaWZ0IiwgIkIiKTsKLQlscENhY2hlLT5jUmVkQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNDb2xvckJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlQaXhlbFR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmR3RmxhZ3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3RmxhZ3MiLCAiSSIpOwotCWxwQ2FjaGUtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJuVmVyc2lvbiIsICJTIik7Ci0JbHBDYWNoZS0+blNpemUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5TaXplIiwgIlMiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QSVhFTEZPUk1BVERFU0NSSVBUT1IgKmdldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUElYRUxGT1JNQVRERVNDUklQVE9SICpscFN0cnVjdCkKLXsKLQlQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJlBJWEVMRk9STUFUREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmR3RGFtYWdlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrKTsKLQlscFN0cnVjdC0+ZHdWaXNpYmxlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdWaXNpYmxlTWFzayk7Ci0JbHBTdHJ1Y3QtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0xheWVyTWFzayk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pTGF5ZXJUeXBlKTsKLQlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycyk7Ci0JbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cyk7Ci0JbHBTdHJ1Y3QtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jRGVwdGhCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1SZWRCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJpdHMpOwotCWxwU3RydWN0LT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQmx1ZVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQpOwotCWxwU3RydWN0LT5jR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMpOwotCWxwU3RydWN0LT5jQ29sb3JCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0NvbG9yQml0cyk7Ci0JbHBTdHJ1Y3QtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pUGl4ZWxUeXBlKTsKLQlscFN0cnVjdC0+ZHdGbGFncyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdGbGFncyk7Ci0JbHBTdHJ1Y3QtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uKTsKLQlscFN0cnVjdC0+blNpemUgPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQSVhFTEZPUk1BVERFU0NSSVBUT1JGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrLCAoamludClscFN0cnVjdC0+ZHdEYW1hZ2VNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3VmlzaWJsZU1hc2ssIChqaW50KWxwU3RydWN0LT5kd1Zpc2libGVNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3TGF5ZXJNYXNrLCAoamludClscFN0cnVjdC0+ZHdMYXllck1hc2spOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aUxheWVyVHlwZSk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMsIChqYnl0ZSlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cywgKGpieXRlKWxwU3RydWN0LT5jU3RlbmNpbEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0RlcHRoQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUFscGhhQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQmx1ZUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1HcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlblNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jUmVkU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNDb2xvckJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aVBpeGVsVHlwZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzLCAoamludClscFN0cnVjdC0+ZHdGbGFncyk7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uLCAoanNob3J0KWxwU3RydWN0LT5uVmVyc2lvbik7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5TaXplLCAoanNob3J0KWxwU3RydWN0LT5uU2l6ZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNjJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotR0xZUEhNRVRSSUNTRkxPQVQgKmdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBHTFlQSE1FVFJJQ1NGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgR0xZUEhNRVRSSUNTRkxPQVQgKmxwU3RydWN0KTsKLQotTEFZRVJQTEFORURFU0NSSVBUT1IgKmdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQotUE9JTlRGTE9BVCAqZ2V0UE9JTlRGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUE9JTlRGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCk7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUiAqZ2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLXZvaWQgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIzNTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N3dC5yYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAid2luZG93cy5oIgotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLSBQUk9EVUNUVkVSU0lPTiAwLDAsMCwwCi0gRklMRUZMQUdTTUFTSyAweDNmTAotI2lmZGVmIF9ERUJVRwotIEZJTEVGTEFHUyAweDFMCi0jZWxzZQotIEZJTEVGTEFHUyAweDBMCi0jZW5kaWYKLSBGSUxFT1MgMHg0MDAwMEwKLSBGSUxFVFlQRSAweDJMCi0gRklMRVNVQlRZUEUgMHgwTAotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgotICAgICAgICBCRUdJTgotICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIklCTSBDb3Jwb3JhdGlvblwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdFwwIgotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJTV1RcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICKpIENvcHlyaWdodCAyMDAwLCAyMDAzIElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cMCIKLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgU1dUX09SR19GSUxFTkFNRQotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjAsMCwwLDBcMCIKLSAgICAgICAgRU5ECi0gICAgRU5ECi0gICAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICAgIEJFR0lOCi0gICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCi0gICAgRU5ECi1FTkQKLQotLyogU0hNRU5VQkFSIFBvY2tldCBQQyAKLSAqIElEX01FTlUgU0hNRU5VQkFSIERJU0NBUkRBQkxFCi0gKiBCRUdJTgotICogCUlEX01FTlUsIDEsCi0gKiAgSU1BR0VfTk9ORSwgSURfTUVOVV9JVEVNMSwgMCwgMCwKLSAqICAwLCAwLCAwLAotICogRU5ECi0gKiBJRF9NRU5VIE1FTlUgRElTQ0FSREFCTEUKLSAqIEJFR0lOCi0gKiAgTUVOVUlURU0gIiIsIElEX01FTlVfSVRFTTEKLSAqIEVORAotICovCi0xMDAgUkNEQVRBIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAxMDAsIDEsCi0gICAgLTIsIDEwMSwgMCwgMCwgCi0gICAgMCwgMCwgMCwKLUVORAotCi0xMDAgTUVOVSBESVNDQVJEQUJMRQotQkVHSU4KLQlNRU5VSVRFTSAiIiwgMTAxCi1FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7Ci0JaW50IGNvbnRleHQ7Ci0JaW50IHBpeGVsRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQlpZiAoZGF0YSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBwZmQgPSBuZXcgUElYRUxGT1JNQVRERVNDUklQVE9SICgpOwotCXBmZC5uU2l6ZSA9IChzaG9ydCkgUElYRUxGT1JNQVRERVNDUklQVE9SLnNpemVvZjsKLQlwZmQublZlcnNpb24gPSAxOwotCXBmZC5kd0ZsYWdzID0gV0dMLlBGRF9EUkFXX1RPX1dJTkRPVyB8IFdHTC5QRkRfU1VQUE9SVF9PUEVOR0w7Ci0JcGZkLmR3TGF5ZXJNYXNrID0gV0dMLlBGRF9NQUlOX1BMQU5FOwotCXBmZC5pUGl4ZWxUeXBlID0gKGJ5dGUpIFdHTC5QRkRfVFlQRV9SR0JBOwotCWlmIChkYXRhLmRvdWJsZUJ1ZmZlcikgcGZkLmR3RmxhZ3MgfD0gV0dMLlBGRF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBwZmQuZHdGbGFncyB8PSBXR0wuUEZEX1NURVJFTzsKLQlwZmQuY1JlZEJpdHMgPSAoYnl0ZSkgZGF0YS5yZWRTaXplOwotCXBmZC5jR3JlZW5CaXRzID0gKGJ5dGUpIGRhdGEuZ3JlZW5TaXplOwotCXBmZC5jQmx1ZUJpdHMgPSAoYnl0ZSkgZGF0YS5ibHVlU2l6ZTsKLQlwZmQuY0FscGhhQml0cyA9IChieXRlKSBkYXRhLmFscGhhU2l6ZTsKLQlwZmQuY0RlcHRoQml0cyA9IChieXRlKSBkYXRhLmRlcHRoU2l6ZTsKLQlwZmQuY1N0ZW5jaWxCaXRzID0gKGJ5dGUpIGRhdGEuc3RlbmNpbFNpemU7Ci0JcGZkLmNBY2N1bVJlZEJpdHMgPSAoYnl0ZSkgZGF0YS5hY2N1bVJlZFNpemU7Ci0JcGZkLmNBY2N1bUdyZWVuQml0cyA9IChieXRlKSBkYXRhLmFjY3VtR3JlZW5TaXplOwotCXBmZC5jQWNjdW1CbHVlQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JcGZkLmNBY2N1bUFscGhhQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCXBmZC5jQWNjdW1CaXRzID0gKGJ5dGUpIChwZmQuY0FjY3VtUmVkQml0cyArIHBmZC5jQWNjdW1HcmVlbkJpdHMgKyBwZmQuY0FjY3VtQmx1ZUJpdHMgKyBwZmQuY0FjY3VtQWxwaGFCaXRzKTsKLQkvL0ZJWE1FIC0gdXNlIHdnbENob29zZVBpeGVsRm9ybWF0QVJCCi0vLwlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVfQlVGRkVSU19BUkI7Ci0vLwkJd2dsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0vLwl9Ci0vLwlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVTX0FSQjsKLS8vCQl3Z2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuc2FtcGxlczsKLS8vCX0KLQotCWludCBoREMgPSBPUy5HZXREQyAoaGFuZGxlKTsKLQlwaXhlbEZvcm1hdCA9IFdHTC5DaG9vc2VQaXhlbEZvcm1hdCAoaERDLCBwZmQpOwotCWlmIChwaXhlbEZvcm1hdCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWlmICghV0dMLlNldFBpeGVsRm9ybWF0IChoREMsIHBpeGVsRm9ybWF0LCBwZmQpKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWNvbnRleHQgPSBXR0wud2dsQ3JlYXRlQ29udGV4dCAoaERDKTsKLQlpZiAoY29udGV4dCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0vLwlpZiAoc2hhcmUgIT0gbnVsbCkgewotLy8JCVdHTC53Z2xTaGFyZUxpc3RzIChjb250ZXh0LCBzaGFyZS5jb250ZXh0KTsKLS8vCX0KLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCVdHTC53Z2xEZWxldGVDb250ZXh0IChjb250ZXh0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgcGZkID0gbmV3IFBJWEVMRk9STUFUREVTQ1JJUFRPUiAoKTsKLQlwZmQublNpemUgPSAoc2hvcnQpIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2Y7Ci0JaW50IGhEQyA9IE9TLkdldERDIChoYW5kbGUpOwotCVdHTC5EZXNjcmliZVBpeGVsRm9ybWF0KGhEQywgcGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2YsIHBmZCk7Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSAocGZkLmR3RmxhZ3MgJiBXR0wuUEZEX0RPVUJMRUJVRkZFUikgIT0gMDsKLQlkYXRhLnN0ZXJlbyA9IChwZmQuZHdGbGFncyAmIFdHTC5QRkRfU1RFUkVPKSAhPSAwOwotCWRhdGEucmVkU2l6ZSA9IHBmZC5jUmVkQml0czsKLQlkYXRhLmdyZWVuU2l6ZSA9IHBmZC5jR3JlZW5CaXRzOwotCWRhdGEuYmx1ZVNpemUgPSBwZmQuY0JsdWVCaXRzOwotCWRhdGEuYWxwaGFTaXplID0gcGZkLmNBbHBoYUJpdHM7Ci0JZGF0YS5kZXB0aFNpemUgPSBwZmQuY0RlcHRoQml0czsKLQlkYXRhLnN0ZW5jaWxTaXplID0gcGZkLmNTdGVuY2lsQml0czsKLQlkYXRhLmFjY3VtUmVkU2l6ZSA9IHBmZC5jQWNjdW1SZWRCaXRzOwotCWRhdGEuYWNjdW1HcmVlblNpemUgPSBwZmQuY0FjY3VtR3JlZW5CaXRzOwotCWRhdGEuYWNjdW1CbHVlU2l6ZSA9IHBmZC5jQWNjdW1CbHVlQml0czsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gcGZkLmNBY2N1bUFscGhhQml0czsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGU7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGUpIHJldHVybjsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLndnbE1ha2VDdXJyZW50IChoREMsIGNvbnRleHQpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU4MGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJKTkkgR2VuZXJhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IlNsZWFrIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iTmF0aXZlU3RhdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJNb3ppbGxhIEdlbmVyYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJJY29uIEV4ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQ1MjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LnRvb2xzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUuYW50PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5zd3Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JY29uRXhlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSWNvbkV4ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIyNmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JY29uRXhlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBDdXN0b21pemUgdGhlIGljb24gb2YgYSBXaW5kb3dzIGV4ZQotICogCi0gKiBXQVJOSU5HISBUaGlzIGNsYXNzIGlzIG5vdCBwYXJ0IG9mIFNXVCBBUEkuIEl0IGlzIE5PVCBBUEkuIEl0IGlzIGFuIGludGVybmFsCi0gKiB0b29sIHRoYXQgbWF5IGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCBhdCBhbnl0aW1lLgotICogCi0gKiBCYXNlZCBvbiBNU0ROICJBbiBJbi1EZXB0aCBMb29rIGludG8gdGhlIFdpbjMyIFBvcnRhYmxlIEV4ZWN1dGFibGUgRmlsZSBGb3JtYXQiCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uRXhlIHsKLQkKLQkgLyoqCi0JICogUmVwbGFjZSB0aGUgRGVza3RvcCBpY29ucyBwcm92aWRlZCBpbiB0aGUgV2luZG93cyBleGVjdXRhYmxlIHByb2dyYW0KLQkgKiB3aXRoIG1hdGNoaW5nIGljb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgotCSAqCi0gCSAqIFRha2VzIDIgYXJndW1lbnRzCi0JICogYXJndW1lbnQgMDogdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBlLmcgYzovZWNsaXBzZS9lY2xpcHNlLmV4ZQotCSAqIGFyZ3VtZW50IDE6IFRoZSAuaWNvIGZpbGUgdG8gd3JpdGUgdG8gdGhlIGdpdmVuIGV4ZWN1dGFibGUgZS5nLiBjOi9teUFwcC5pY28KLQkgKgotCSAqIE5vdGUgMS4gV3JpdGUgYWNjZXNzIHRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gaXMgcmVxdWlyZWQuIEFzIGEgcmVzdWx0LCB0aGF0Ci0JICogcHJvZ3JhbSBtdXN0IG5vdCBiZSBjdXJyZW50bHkgcnVubmluZyBvciBlZGl0ZWQgZWxzZXdoZXJlLgotCSAqIAotCSAqIE5vdGUgMi4gIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXF1aXJlcyBhIC5pY28gZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMKLQkgKiAxLiAzMngzMiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMi4gMTZ4MTYsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDMuIDE2eDE2LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA0LiAzMngzMiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNS4gNDh4NDgsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDYuIDQ4eDQ4LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiBBIHVzZXIgaWNvbiBtYXRjaGluZyBleGFjdGx5IHRoZSB3aWR0aC9oZWlnaHQvZGVwdGggb2YgYW4gZXhlY3V0YWJsZSBpY29uIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBleGVjdXRhYmxlIGFuZCB3aWxsIHJlcGxhY2UgdGhhdCBleGVjdXRhYmxlIGljb24uIElmIGFuIGV4ZWN1dGFibGUgaWNvbgotCSAqIGRvZXMgbm90IG1hdGNoIGEgdXNlciBpY29uLCBpdCBpcyBzaWxlbnRseSBsZWZ0IGFzIGlzLgotCSAqIAotCSAqIE5vdGUgMy4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgY29udGVudCBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBtYXkgY2F1c2UKLQkgKiBpdHMgY29ycnVwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEljb25FeGUgPHdpbmRvd3MgZXhlY3V0YWJsZT4gPGljbyBmaWxlPiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQl0cnkgewotCQkJSW1hZ2VEYXRhW10gZGF0YSA9IG51bGw7Ci0JCQkKLQkJCWlmIChhcmdzLmxlbmd0aCA9PSAyKSB7Ci0JCQkJLyogSUNPIGNhc2UgKi8KLQkJCQlkYXRhID0gbG9hZGVyLmxvYWQoYXJnc1sxXSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEJNUCBjYXNlIC0gZWFjaCBmb2xsb3dpbmcgYXJndW1lbnQgaXMgYSBzaW5nbGUgQk1QIGZpbGUKLQkJCQkgKiBCTVAgaXMgaGFuZGxlZCBmb3IgdGVzdGluZyBwdXJwb3NlIG9ubHkuIFRoZSBJQ08gZmlsZSBpcyB0aGUKLQkJCQkgKiBvZmZpY2lhbCBNaWNyb3NvZnQgZm9ybWF0IGZvciBpbWFnZSByZXNvdXJjZXMuCi0JCQkJICovCi0JCQkJZGF0YSA9IG5ldyBJbWFnZURhdGFbYXJncy5sZW5ndGggLSAxXTsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJSW1hZ2VEYXRhW10gY3VycmVudCA9IGxvYWRlci5sb2FkKGFyZ3NbaV0pOwotCQkJCQlkYXRhW2kgLSAxXSA9IGN1cnJlbnRbMF07Ci0JCQkJfQotCQkJfQotCQkJaW50IG5NaXNzaW5nID0gdW5sb2FkSWNvbnMoYXJnc1swXSwgZGF0YSk7Ci0JCQlpZiAobk1pc3NpbmcgIT0gMCkgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciAtICIrbk1pc3NpbmcrIiBpY29uKHMpIG5vdCByZXBsYWNlZCBpbiAiK2FyZ3NbMF0rIiB1c2luZyAiK2FyZ3NbMV0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKiBJbXBsZW1lbnRhdGlvbiAqLwotCi0JLyoqIAotCSAqIFJldHJpZXZlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQkgKiBUaGVzZSBpY29ucyBhcmUgdHlwaWNhbGx5IHNob3duIGluIHZhcmlvdXMgcGxhY2VzIG9mIHRoZSBXaW5kb3dzIGRlc2t0b3AuCi0JICogCi0JICogTm90ZS4gIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXR1cm5zIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMKLQkgKiAxLiAzMngzMiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMi4gMTZ4MTYsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDMuIDE2eDE2LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA0LiAzMngzMiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNS4gNDh4NDgsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDYuIDQ4eDQ4LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICovCQotCXN0YXRpYyBJbWFnZURhdGFbXSBsb2FkSWNvbnMoU3RyaW5nIHByb2dyYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwcm9ncmFtLCAiciIpOwotCQlJY29uRXhlIGljb25FeGUgPSBuZXcgSWNvbkV4ZSgpOwotCQlJY29uUmVzSW5mb1tdIGljb25JbmZvID0gaWNvbkV4ZS5nZXRJY29ucyhyYWYpOwotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVtpY29uSW5mby5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIGRhdGFbaV0gPSBpY29uSW5mb1tpXS5kYXRhOwotCQlyYWYuY2xvc2UoKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCS8qKiAKLQkgKiBSZXBsYWNlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbQotCSAqIHdpdGggaWNvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JICogCi0JICogTm90ZSAxLiBXcml0ZSBhY2Nlc3MgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyByZXF1aXJlZC4gQXMgYSByZXN1bHQsIHRoYXQKLQkgKiBwcm9ncmFtIG11c3Qgbm90IGJlIGN1cnJlbnRseSBydW5uaW5nIG9yIGVkaXRlZCBlbHNld2hlcmUuCi0JICogCi0JICogTm90ZSAyLiBVc2UgbG9hZEljb25zIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgaWNvbnMgKHdpZHRoLCBoZWlnaHQsIGRlcHRoKQotCSAqIGlzIHJlcXVpcmVkIHRvIHJlcGxhY2UgdGhlIGljb25zIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0uIEEgdXNlciBpY29uCi0JICogbWF0Y2hpbmcgZXhhY3RseSB0aGUgd2lkdGgvaGVpZ2h0L2RlcHRoIG9mIGFuIGV4ZWN1dGFibGUgaWNvbiB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgZXhlY3V0YWJsZSBhbmQgd2lsbCByZXBsYWNlIHRoYXQgZXhlY3V0YWJsZSBpY29uLiBJZiBhbiBleGVjdXRhYmxlIGljb24KLQkgKiBkb2VzIG5vdCBtYXRjaCBhIHVzZXIgaWNvbiwgaXQgaXMgbGVmdCBhcyBpcy4gVmVyaWZ5IHRoZSByZXR1cm4gdmFsdWUgbWF0Y2hlcwotCSAqIHRoZSBudW1iZXIgb2YgaWNvbnMgdG8gd3JpdGUuIEZpbmFsbHksIHVzZSBsb2FkSWNvbnMgYWZ0ZXIgdGhpcyBvcGVyYXRpb24KLQkgKiB0byB2ZXJpZnkgdGhlIGljb25zIGhhdmUgY2hhbmdlZCBhcyBleHBlY3RlZC4KLQkgKiAKLQkgKiBOb3RlIDMuIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIDYgaW1hZ2VzIChpbiBhbnkgb3JkZXIpLgotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIAotCSAqIE5vdGUgNC4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgY29udGVudCBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBtYXkgY2F1c2UKLQkgKiBpdHMgY29ycnVwdGlvbi4gCi0JICogCi0JICogQHBhcmFtIHByb2dyYW0gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBlLmcgYzovZWNsaXBzZS9lY2xpcHNlLmV4ZQotCSAqIEBwYXJhbSBpY29ucyB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZQotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpY29ucyBmcm9tIHRoZSBvcmlnaW5hbCBwcm9ncmFtIHRoYXQgd2VyZSBub3Qgc3VjY2Vzc2Z1bGx5IHJlcGxhY2VkICgwIGlmIHN1Y2Nlc3MpCi0JICovCQotCXN0YXRpYyBpbnQgdW5sb2FkSWNvbnMoU3RyaW5nIHByb2dyYW0sIEltYWdlRGF0YVtdIGljb25zKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUocHJvZ3JhbSwgInJ3Iik7Ci0JCUljb25FeGUgaWNvbkV4ZSA9IG5ldyBJY29uRXhlKCk7Ci0JCUljb25SZXNJbmZvW10gaWNvbkluZm8gPSBpY29uRXhlLmdldEljb25zKHJhZik7Ci0JCWludCBjbnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGljb25JbmZvLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGljb25zLmxlbmd0aDsgaisrKQotCQkJaWYgKGljb25JbmZvW2ldLmRhdGEud2lkdGggPT0gaWNvbnNbal0ud2lkdGggJiYgCi0JCQkJaWNvbkluZm9baV0uZGF0YS5oZWlnaHQgPT0gaWNvbnNbal0uaGVpZ2h0ICYmIAotCQkJCWljb25JbmZvW2ldLmRhdGEuZGVwdGggPT0gaWNvbnNbal0uZGVwdGgpIHsKLQkJCQlyYWYuc2VlayhpY29uSW5mb1tpXS5vZmZzZXQpOwotCQkJCXVubG9hZEljb24ocmFmLCBpY29uc1tqXSk7Ci0JCQkJY250Kys7Ci0JCQl9Ci0JCX0KLQkJcmFmLmNsb3NlKCk7Ci0JCXJldHVybiBpY29uSW5mby5sZW5ndGggLSBjbnQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMjAwNTAxMjQiOwotCQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBJY29uUmVzSW5mbyB7Ci0JCUltYWdlRGF0YSBkYXRhOwotCQlpbnQgb2Zmc2V0OwotCQlpbnQgc2l6ZTsKLQl9Ci0JCi0JSWNvblJlc0luZm9bXSBpY29uSW5mbyA9IG51bGw7Ci0JaW50IGljb25DbnQ7Ci0JCi0JSWNvblJlc0luZm9bXSBnZXRJY29ucyhSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWNvbkluZm8gPSBuZXcgSWNvblJlc0luZm9bNF07Ci0JCWljb25DbnQgPSAwOwotCQlJTUFHRV9ET1NfSEVBREVSIGltYWdlRG9zSGVhZGVyID0gbmV3IElNQUdFX0RPU19IRUFERVIoKTsKLQkJcmVhZChyYWYsIGltYWdlRG9zSGVhZGVyKTsKLQkJaWYgKGltYWdlRG9zSGVhZGVyLmVfbWFnaWMgIT0gSU1BR0VfRE9TX1NJR05BVFVSRSkgcmV0dXJuIG51bGw7Ci0JCWludCBpbWFnZU50SGVhZGVyc09mZnNldCA9IGltYWdlRG9zSGVhZGVyLmVfbGZhbmV3OwotCQlyYWYuc2VlayhpbWFnZU50SGVhZGVyc09mZnNldCk7Ci0JCUlNQUdFX05UX0hFQURFUlMgaW1hZ2VOdEhlYWRlcnMgPSBuZXcgSU1BR0VfTlRfSEVBREVSUygpOwotCQlyZWFkKHJhZiwgaW1hZ2VOdEhlYWRlcnMpOwotCQlpZiAoaW1hZ2VOdEhlYWRlcnMuU2lnbmF0dXJlICE9IElNQUdFX05UX1NJR05BVFVSRSkgcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBEdW1wUmVzb3VyY2VzCi0JCWludCByZXNvdXJjZXNSVkEgPSBpbWFnZU50SGVhZGVycy5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRV0uVmlydHVhbEFkZHJlc3M7Ci0JCWlmIChyZXNvdXJjZXNSVkEgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCIqIFJlc291cmNlcyAoUlZBPSAiK3Jlc291cmNlc1JWQSsiKSIpOwotCQlJTUFHRV9TRUNUSU9OX0hFQURFUiBpbWFnZVNlY3Rpb25IZWFkZXIgPSBuZXcgSU1BR0VfU0VDVElPTl9IRUFERVIoKTsKLQkJaW50IGZpcnN0U2VjdGlvbk9mZnNldCA9IGltYWdlTnRIZWFkZXJzT2Zmc2V0ICsgSU1BR0VfTlRfSEVBREVSUy5GSUVMRF9PRkZTRVRfT3B0aW9uYWxIZWFkZXIgKyBpbWFnZU50SGVhZGVycy5GaWxlSGVhZGVyLlNpemVPZk9wdGlvbmFsSGVhZGVyOwotCQlyYWYuc2VlayhmaXJzdFNlY3Rpb25PZmZzZXQpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VOdEhlYWRlcnMuRmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zOyBpKyspIHsKLQkJCXJlYWQocmFmLCBpbWFnZVNlY3Rpb25IZWFkZXIpOwotCQkJaWYgKHJlc291cmNlc1JWQSA+PSBpbWFnZVNlY3Rpb25IZWFkZXIuVmlydHVhbEFkZHJlc3MgJiYgcmVzb3VyY2VzUlZBIDwgaW1hZ2VTZWN0aW9uSGVhZGVyLlZpcnR1YWxBZGRyZXNzICsgaW1hZ2VTZWN0aW9uSGVhZGVyLk1pc2NfVmlydHVhbFNpemUpIHsKLQkJCQkvLyBjb3VsZCBjaGVjayB0aGUgaW1hZ2VTZWN0aW9uSGVhZGVyIG5hbWUgaXMgLnJzcmMKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgcmV0dXJuIG51bGw7Ci0JCWludCBkZWx0YSA9IGltYWdlU2VjdGlvbkhlYWRlci5WaXJ0dWFsQWRkcmVzcyAtIGltYWdlU2VjdGlvbkhlYWRlci5Qb2ludGVyVG9SYXdEYXRhOwotCQlpbnQgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCA9IHJlc291cmNlc1JWQSAtIGRlbHRhOwotCQlkdW1wUmVzb3VyY2VEaXJlY3RvcnkocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0LCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0LCBkZWx0YSwgMCwgMCwgZmFsc2UpOwotCQlpZiAoaWNvbkNudCA8IGljb25JbmZvLmxlbmd0aCkgewotCQkJSWNvblJlc0luZm9bXSBuZXdBcnJheSA9IG5ldyBJY29uUmVzSW5mb1tpY29uQ250XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaWNvbkluZm8sIDAsIG5ld0FycmF5LCAwLCBpY29uQ250KTsKLQkJCWljb25JbmZvID0gbmV3QXJyYXk7Ci0JCX0KLQkJcmV0dXJuIGljb25JbmZvOwotCX0KLQotdm9pZCBkdW1wUmVzb3VyY2VEaXJlY3RvcnkoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0LCBpbnQgcmVzb3VyY2VCYXNlLCBpbnQgZGVsdGEsIGludCB0eXBlLCBpbnQgbGV2ZWwsIGJvb2xlYW4gcnRfaWNvbl9yb290KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCIqKiBMRVZFTCAiK2xldmVsKTsKLQotCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBpbWFnZVJlc291cmNlRGlyZWN0b3J5ID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSgpOwotCXJhZi5zZWVrKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQpOwotCXJlYWQocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5KTsKLQotCWlmIChERUJVRykgewotCQlTdHJpbmcgc1R5cGUgPSAiIit0eXBlOwotCQkvLyBsZXZlbCAxIHJlc291cmNlcyBhcmUgcmVzb3VyY2UgdHlwZXMKLQkJaWYgKGxldmVsID09IDEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiX19fX19fX19fX19fX19fX19fX19fX19fX19fIik7Ci0JCQlpZiAodHlwZSA9PSBSVF9JQ09OKSBzVHlwZSA9ICJSVF9JQ09OIjsKLQkJCWlmICh0eXBlID09IFJUX0dST1VQX0lDT04pIHNUeXBlID0gIlJUX0dST1VQX0lDT04iOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRGlyZWN0b3J5IFsiK3NUeXBlKyJdIisiIChOYW1lZCAiK2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZOYW1lZEVudHJpZXMrIiwgSUQgIitpbWFnZVJlc291cmNlRGlyZWN0b3J5Lk51bWJlck9mSWRFbnRyaWVzKyIpIik7Ci0JfQotCWludCBJUkRFX1N0YXJ0T2Zmc2V0ID0gaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCArIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWS5TSVpFT0Y7CQotCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWVtdIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWVtpbWFnZVJlc291cmNlRGlyZWN0b3J5Lk51bWJlck9mSWRFbnRyaWVzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSgpOwotCQlyZWFkKHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0pOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5EYXRhSXNEaXJlY3RvcnkpIHsKLQkJCWR1bXBSZXNvdXJjZURpcmVjdG9yeShyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLk9mZnNldFRvRGlyZWN0b3J5ICsgcmVzb3VyY2VCYXNlLCByZXNvdXJjZUJhc2UsIGRlbHRhLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5JZCwgbGV2ZWwgKyAxLCBydF9pY29uX3Jvb3QgPyB0cnVlIDogdHlwZSA9PSBSVF9JQ09OKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFJlc291cmNlIGZvdW5kCi0JCQkvLy8gcFJlc0RpckVudHJ5LT5OYW1lCi0JCQlJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgaXJkZSA9IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldOwotCQkJSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSBkYXRhID0gbmV3IElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkoKTsKLQkJCXJhZi5zZWVrKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLk9mZnNldFRvRGF0YSArIHJlc291cmNlQmFzZSk7Ci0JCQlyZWFkKHJhZiwgZGF0YSk7Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgSWQgIitpcmRlLklkKyIgRGF0YSBPZmZzZXQgUlZBICIrZGF0YS5PZmZzZXRUb0RhdGErIiwgU2l6ZSAiK2RhdGEuU2l6ZSk7Ci0JCQlpZiAocnRfaWNvbl9yb290KSB7Ci0JCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oImljb25jbnQgIitpY29uQ250KyIgfCIraWNvbkluZm8ubGVuZ3RoKTsKLQkJCQlpY29uSW5mb1tpY29uQ250XSA9IG5ldyBJY29uUmVzSW5mbygpOwotCQkJCWljb25JbmZvW2ljb25DbnRdLmRhdGEgPSBwYXJzZUljb24ocmFmLCBkYXRhLk9mZnNldFRvRGF0YSAtIGRlbHRhLCBkYXRhLlNpemUpOwotCQkJCWljb25JbmZvW2ljb25DbnRdLm9mZnNldCA9IGRhdGEuT2Zmc2V0VG9EYXRhIC0gZGVsdGE7Ci0JCQkJaWNvbkluZm9baWNvbkNudF0uc2l6ZSA9IGRhdGEuU2l6ZTsJCi0JCQkJaWNvbkNudCsrOwotCQkJCWlmIChpY29uQ250ID09IGljb25JbmZvLmxlbmd0aCkgewotCQkJCQlJY29uUmVzSW5mb1tdIG5ld0FycmF5ID0gbmV3IEljb25SZXNJbmZvW2ljb25JbmZvLmxlbmd0aCArIDRdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGljb25JbmZvLCAwLCBuZXdBcnJheSwgMCwgaWNvbkluZm8ubGVuZ3RoKTsKLQkJCQkJaWNvbkluZm8gPSBuZXdBcnJheTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAJfQotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIHBhcnNlSWNvbihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLnNlZWsob2Zmc2V0KTsKLQlCSVRNQVBJTkZPIGJpdG1hcEluZm8gPSBuZXcgQklUTUFQSU5GTygpOwotCXJlYWQocmFmLCBiaXRtYXBJbmZvKTsKLQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAvPSAyOwotCWludCB3aWR0aCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpV2lkdGg7Ci0JaW50IGhlaWdodCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0OwotCWludCBkZXB0aCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQ7Ci0KLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbG9hZFBhbGV0dGUoYml0bWFwSW5mby5ibWlIZWFkZXIsIHJhZik7Ci0JYnl0ZVtdIHNoYXBlRGF0YSA9IGxvYWREYXRhKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCWJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgPSAxOwotCWJ5dGVbXSBtYXNrRGF0YSA9IGxvYWREYXRhKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCW1hc2tEYXRhID0gY29udmVydFBhZChtYXNrRGF0YSwgd2lkdGgsIGhlaWdodCwgMSwgNCwgMik7Ci0JYml0SW52ZXJ0RGF0YShtYXNrRGF0YSwgMCwgbWFza0RhdGEubGVuZ3RoKTsKLQlyZXR1cm4gSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXBhbGV0dGUsCi0JCTQsCi0JCXNoYXBlRGF0YSwKLQkJMiwKLQkJbWFza0RhdGEsCi0JCW51bGwsCi0JCS0xLAotCQktMSwKLQkJU1dULklNQUdFX0lDTywKLQkJMCwKLQkJMCwKLQkJMCwKLQkJMCk7Ci19Ci0KLXN0YXRpYyBieXRlW10gYml0SW52ZXJ0RGF0YShieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCS8vIERlc3RydWN0aXZlbHkgYml0IGludmVydCBkYXRhIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgotCWZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewotCQlkYXRhW2ldID0gKGJ5dGUpKDI1NSAtIGRhdGFbaSAtIHN0YXJ0SW5kZXhdKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIG5ld0JwbCk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci1zdGF0aWMgUGFsZXR0ZURhdGEgbG9hZFBhbGV0dGUoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBkZXB0aCA9IGJpaC5iaUJpdENvdW50OwotCWlmIChkZXB0aCA8PSA4KSB7Ci0JCWludCBudW1Db2xvcnMgPSBiaWguYmlDbHJVc2VkOwotCQlpZiAobnVtQ29sb3JzID09IDApIHsKLQkJCW51bUNvbG9ycyA9IDEgPDwgZGVwdGg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobnVtQ29sb3JzID4gMjU2KQotCQkJCW51bUNvbG9ycyA9IDI1NjsKLQkJfQotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbnVtQ29sb3JzICogNF07Ci0JCXJhZi5yZWFkKGJ1Zik7Ci0JCXJldHVybiBwYWxldHRlRnJvbUJ5dGVzKGJ1ZiwgbnVtQ29sb3JzKTsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4N0MwMCwgMHgzRTAsIDB4MUYpOwotCWlmIChkZXB0aCA9PSAyNCkgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGLCAweEZGMDAsIDB4RkYwMDAwKTsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYwMCwgMHhGRjAwMDAsIDB4RkYwMDAwMDApOwotfQotc3RhdGljIFBhbGV0dGVEYXRhIHBhbGV0dGVGcm9tQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbnVtQ29sb3JzKSB7Ci0JaW50IGJ5dGVzT2Zmc2V0ID0gMDsKLQlSR0JbXSBjb2xvcnMgPSBuZXcgUkdCW251bUNvbG9yc107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvcnM7IGkrKykgewotCQljb2xvcnNbaV0gPSBuZXcgUkdCKGJ5dGVzW2J5dGVzT2Zmc2V0ICsgMl0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXQgKyAxXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldF0gJiAweEZGKTsKLQkJYnl0ZXNPZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YShjb2xvcnMpOwotfQotc3RhdGljIGJ5dGVbXSBsb2FkRGF0YShCSVRNQVBJTkZPSEVBREVSIGJpaCwgUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IHN0cmlkZSA9IChiaWguYmlXaWR0aCAqIGJpaC5iaUJpdENvdW50ICsgNykgLyA4OwotCXN0cmlkZSA9IChzdHJpZGUgKyAzKSAvIDQgKiA0OyAvLyBSb3VuZCB1cCB0byA0IGJ5dGUgbXVsdGlwbGUKLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGJpaCwgcmFmLCBzdHJpZGUpOwotCWZsaXBTY2FuTGluZXMoZGF0YSwgc3RyaWRlLCBiaWguYmlIZWlnaHQpOwotCXJldHVybiBkYXRhOwotfQotc3RhdGljIHZvaWQgZmxpcFNjYW5MaW5lcyhieXRlW10gZGF0YSwgaW50IHN0cmlkZSwgaW50IGhlaWdodCkgewotCWludCBpMSA9IDA7Ci0JaW50IGkyID0gKGhlaWdodCAtIDEpICogc3RyaWRlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgaSsrKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpZGU7IGluZGV4KyspIHsKLQkJCWJ5dGUgYiA9IGRhdGFbaW5kZXggKyBpMV07Ci0JCQlkYXRhW2luZGV4ICsgaTFdID0gZGF0YVtpbmRleCArIGkyXTsKLQkJCWRhdGFbaW5kZXggKyBpMl0gPSBiOwotCQl9Ci0JCWkxICs9IHN0cmlkZTsKLQkJaTIgLT0gc3RyaWRlOwotCX0KLX0KLXN0YXRpYyBieXRlW10gbG9hZERhdGEoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgc3RyaWRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBkYXRhU2l6ZSA9IGJpaC5iaUhlaWdodCAqIHN0cmlkZTsKLQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLQlpbnQgY21wID0gYmloLmJpQ29tcHJlc3Npb247Ci0JaWYgKGNtcCA9PSAwKSB7IC8vIEJNUF9OT19DT01QUkVTU0lPTgotCQlyYWYucmVhZChkYXRhKTsKLQl9IGVsc2UgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiSUNPIGNhbm5vdCBiZSBjb21wcmVzc2VkPyIpOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgdW5sb2FkSWNvbihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IHNpemVJbWFnZSA9ICgoKGljb24ud2lkdGggKiBpY29uLmRlcHRoICsgMzEpIC8gMzIgKiA0KSArCi0JCSgoaWNvbi53aWR0aCArIDMxKSAvIDMyICogNCkpICogaWNvbi5oZWlnaHQ7Ci0Jd3JpdGU0KHJhZiwgQk1QSGVhZGVyRml4ZWRTaXplKTsKLQl3cml0ZTQocmFmLCBpY29uLndpZHRoKTsKLQl3cml0ZTQocmFmLCBpY29uLmhlaWdodCAqIDIpOwotCXdyaXRlVTIocmFmLCAxKTsKLQl3cml0ZVUyKHJhZiwgaWNvbi5kZXB0aCk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0Jd3JpdGU0KHJhZiwgc2l6ZUltYWdlKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCBpY29uLnBhbGV0dGUuY29sb3JzICE9IG51bGwgPyBpY29uLnBhbGV0dGUuY29sb3JzLmxlbmd0aCA6IDApOwotCXdyaXRlNChyYWYsIDApOwotCQotCWJ5dGVbXSByZ2JzID0gcGFsZXR0ZVRvQnl0ZXMoaWNvbi5wYWxldHRlKTsKLQlyYWYud3JpdGUocmdicyk7Ci0JdW5sb2FkU2hhcGVEYXRhKHJhZiwgaWNvbik7Ci0JdW5sb2FkTWFza0RhdGEocmFmLCBpY29uKTsKLX0KLXN0YXRpYyBieXRlW10gcGFsZXR0ZVRvQnl0ZXMoUGFsZXR0ZURhdGEgcGFsKSB7Ci0JaW50IG4gPSBwYWwuY29sb3JzID09IG51bGwgPyAwIDogKHBhbC5jb2xvcnMubGVuZ3RoIDwgMjU2ID8gcGFsLmNvbG9ycy5sZW5ndGggOiAyNTYpOwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW24gKiA0XTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQlSR0IgY29sID0gcGFsLmNvbG9yc1tpXTsKLQkJYnl0ZXNbb2Zmc2V0XSA9IChieXRlKWNvbC5ibHVlOwotCQlieXRlc1tvZmZzZXQgKyAxXSA9IChieXRlKWNvbC5ncmVlbjsKLQkJYnl0ZXNbb2Zmc2V0ICsgMl0gPSAoYnl0ZSljb2wucmVkOwotCQlvZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotc3RhdGljIHZvaWQgdW5sb2FkTWFza0RhdGEoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEltYWdlRGF0YSBpY29uKSB7Ci0JSW1hZ2VEYXRhIG1hc2sgPSBpY29uLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQlpbnQgYnBsID0gKGljb24ud2lkdGggKyA3KSAvIDg7Ci0JaW50IHBhZCA9IG1hc2suc2NhbmxpbmVQYWQ7Ci0JaW50IHNyY0JwbCA9IChicGwgKyBwYWQgLSAxKSAvIHBhZCAqIHBhZDsKLQlpbnQgZGVzdEJwbCA9IChicGwgKyAzKSAvIDQgKiA0OwotCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtkZXN0QnBsXTsKLQlpbnQgb2Zmc2V0ID0gKGljb24uaGVpZ2h0IC0gMSkgKiBzcmNCcGw7Ci0JYnl0ZVtdIGRhdGEgPSBtYXNrLmRhdGE7Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29uLmhlaWdodDsgaSsrKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgYnVmLCAwLCBicGwpOwotCQkJYml0SW52ZXJ0RGF0YShidWYsIDAsIGJwbCk7Ci0JCQlyYWYud3JpdGUoYnVmLCAwLCBkZXN0QnBsKTsKLQkJCW9mZnNldCAtPSBzcmNCcGw7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLX0KLXN0YXRpYyB2b2lkIHVubG9hZFNoYXBlRGF0YShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHsKLQlpbnQgYnBsID0gKGljb24ud2lkdGggKiBpY29uLmRlcHRoICsgNykgLyA4OwotCWludCBwYWQgPSBpY29uLnNjYW5saW5lUGFkOwotCWludCBzcmNCcGwgPSAoYnBsICsgcGFkIC0gMSkgLyBwYWQgKiBwYWQ7Ci0JaW50IGRlc3RCcGwgPSAoYnBsICsgMykgLyA0ICogNDsKLQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZGVzdEJwbF07Ci0JaW50IG9mZnNldCA9IChpY29uLmhlaWdodCAtIDEpICogc3JjQnBsOwotCWJ5dGVbXSBkYXRhID0gaWNvbi5kYXRhOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbi5oZWlnaHQ7IGkrKykgewotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIGJ1ZiwgMCwgYnBsKTsKLQkJCXJhZi53cml0ZShidWYsIDAsIGRlc3RCcGwpOwotCQkJb2Zmc2V0IC09IHNyY0JwbDsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotfQotc3RhdGljIGJvb2xlYW4gcmVhZEljb25Hcm91cChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLnNlZWsob2Zmc2V0KTsKLQlORVdIRUFERVIgbmV3SGVhZGVyID0gbmV3IE5FV0hFQURFUigpOwotCXJlYWQocmFmLCBuZXdIZWFkZXIpOwotCWlmIChuZXdIZWFkZXIuUmVzVHlwZSAhPSBSRVNfSUNPTikgcmV0dXJuIGZhbHNlOwotCVJFU0RJUltdIHJlc0RpciA9IG5ldyBSRVNESVJbbmV3SGVhZGVyLlJlc0NvdW50XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0hlYWRlci5SZXNDb3VudDsgaSsrKSB7Ci0JCXJlc0RpcltpXSA9IG5ldyBSRVNESVIoKTsKLQkJcmVhZChyYWYsIHJlc0RpcltpXSk7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc3JjLCBTdHJpbmcgZHN0KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjKTsKLQlGaWxlIGRzdEZpbGUgPSBuZXcgRmlsZShkc3QpOwotCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRmlsZSk7Ci0JRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3RGaWxlKTsKLQlpbnQgYzsKLQl3aGlsZSAoKGMgPSBpbi5yZWFkKCkpICE9IC0xKSBvdXQud3JpdGUoYyk7IAotCWluLmNsb3NlKCk7Ci0Jb3V0LmNsb3NlKCk7Ci19Ci0KLS8qIElPIHV0aWxpdGllcyB0byBwYXJzZSBXaW5kb3dzIGV4ZWN1dGFibGUgKi8KLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfRE9TX1NJR05BVFVSRSA9IDB4NWE0ZDsKLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfTlRfU0lHTkFUVVJFID0gMHgwMDAwNDU1MDsKLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfRElSRUNUT1JZX0VOVFJZX1JFU09VUkNFID0gMjsKLXN0YXRpYyBmaW5hbCBpbnQgUkVTX0lDT04gPSAxOwotc3RhdGljIGZpbmFsIGludCBSVF9JQ09OID0gMzsKLXN0YXRpYyBmaW5hbCBpbnQgUlRfR1JPVVBfSUNPTiA9IDE0Owotc3RhdGljIGZpbmFsIGludCBCTVBIZWFkZXJGaXhlZFNpemUgPSA0MDsKLQkKLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfRE9TX0hFQURFUiB7Ci0JaW50IGVfbWFnaWM7IC8vIFdPUkQKLQlpbnQgZV9jYmxwOyAvLyBXT1JECi0JaW50IGVfY3A7IC8vIFdPUkQKLQlpbnQgZV9jcmxjOyAvLyBXT1JECi0JaW50IGVfY3BhcmhkcjsgLy8gV09SRAotCWludCBlX21pbmFsbG9jOyAvLyBXT1JECi0JaW50IGVfbWF4YWxsb2M7IC8vIFdPUkQKLQlpbnQgZV9zczsgLy8gV09SRAotCWludCBlX3NwOyAvLyBXT1JECi0JaW50IGVfY3N1bTsgLy8gV09SRAotCWludCBlX2lwOyAvLyBXT1JECi0JaW50IGVfY3M7IC8vIFdPUkQKLQlpbnQgZV9sZmFybGM7IC8vIFdPUkQKLQlpbnQgZV9vdm5vOyAvLyBXT1JECi0JaW50W10gZV9yZXMgPSBuZXcgaW50WzRdOyAvLyBXT1JEWzRdCi0JaW50IGVfb2VtaWQ7IC8vIFdPUkQKLQlpbnQgZV9vZW1pbmZvOyAvLyBXT1JECi0JaW50W10gZV9yZXMyID0gbmV3IGludFsxMF07IC8vIFdPUkRbMTBdCi0JaW50IGVfbGZhbmV3OyAvLyBMT05HCi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfRklMRV9IRUFERVIgewotCWludCBNYWNoaW5lOyAvLyBXT1JECi0JaW50IE51bWJlck9mU2VjdGlvbnM7IC8vIFdPUkQKLQlpbnQgVGltZURhdGVTdGFtcDsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvU3ltYm9sVGFibGU7IC8vIERXT1JECi0JaW50IE51bWJlck9mU3ltYm9sczsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7IC8vIFdPUkQKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBXT1JECi19OwotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0RBVEFfRElSRUNUT1JZIHsKLQlpbnQgVmlydHVhbEFkZHJlc3M7IC8vIERXT1JECi0JaW50IFNpemU7IC8vIERXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfT1BUSU9OQUxfSEVBREVSIHsKLQlpbnQgTWFnaWM7IC8vIFdPUkQKLQlpbnQgTWFqb3JMaW5rZXJWZXJzaW9uOyAvLyBCWVRFCi0JaW50IE1pbm9yTGlua2VyVmVyc2lvbjsgLy8gQllURQotCWludCBTaXplT2ZDb2RlOyAvLyBEV09SRAotCWludCBTaXplT2ZJbml0aWFsaXplZERhdGE7IC8vIERXT1JECi0JaW50IFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOyAvLyBEV09SRAotCWludCBBZGRyZXNzT2ZFbnRyeVBvaW50OyAvLyBEV09SRAotCWludCBCYXNlT2ZDb2RlOyAvLyBEV09SRAotCWludCBCYXNlT2ZEYXRhOyAvLyBEV09SRAotCWludCBJbWFnZUJhc2U7IC8vIERXT1JECi0JaW50IFNlY3Rpb25BbGlnbm1lbnQ7IC8vIERXT1JECi0JaW50IEZpbGVBbGlnbm1lbnQ7IC8vIERXT1JECi0JaW50IE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWFqb3JJbWFnZVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JJbWFnZVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBXaW4zMlZlcnNpb25WYWx1ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSW1hZ2U7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYWRlcnM7IC8vIERXT1JECi0JaW50IENoZWNrU3VtOyAvLyBEV09SRAotCWludCBTdWJzeXN0ZW07IC8vIFdPUkQKLQlpbnQgRGxsQ2hhcmFjdGVyaXN0aWNzOyAvLyBXT1JECi0JaW50IFNpemVPZlN0YWNrUmVzZXJ2ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mU3RhY2tDb21taXQ7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYXBSZXNlcnZlOyAvLyBEV09SRAotCWludCBTaXplT2ZIZWFwQ29tbWl0OyAvLyBEV09SRAotCWludCBMb2FkZXJGbGFnczsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZSdmFBbmRTaXplczsgLy8gRFdPUkQKLQlJTUFHRV9EQVRBX0RJUkVDVE9SWVtdIERhdGFEaXJlY3RvcnkgPSBuZXcgSU1BR0VfREFUQV9ESVJFQ1RPUllbMTZdOwotfQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9OVF9IRUFERVJTIHsKLQlpbnQgU2lnbmF0dXJlOyAvLyBEV09SRAotCUlNQUdFX0ZJTEVfSEVBREVSIEZpbGVIZWFkZXIgPSBuZXcgSU1BR0VfRklMRV9IRUFERVIoKTsKLQlJTUFHRV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXIgPSBuZXcgSU1BR0VfT1BUSU9OQUxfSEVBREVSKCk7Ci0JZmluYWwgc3RhdGljIGludCBGSUVMRF9PRkZTRVRfT3B0aW9uYWxIZWFkZXIgPSAyNDsgIAotfQotCQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9TRUNUSU9OX0hFQURFUiB7Ci0JaW50W10gTmFtZSA9IG5ldyBpbnRbOF07IC8vIEJZVEVbOF0KLQlpbnQgTWlzY19WaXJ0dWFsU2l6ZTsgLy8gRFdPUkQgKHVuaW9uIE1pc2MgeyBEV09SRCBQaHlzaWNhbEFkZHJlc3M7IERXT1JEIFZpcnR1YWxTaXplIH0KLQlpbnQgVmlydHVhbEFkZHJlc3M7IC8vIERXT1JECi0JaW50IFNpemVPZlJhd0RhdGE7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1Jhd0RhdGE7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1JlbG9jYXRpb25zOyAvLyBEV09SRAotCWludCBQb2ludGVyVG9MaW5lbnVtYmVyczsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZSZWxvY2F0aW9uczsgLy8gV09SRAotCWludCBOdW1iZXJPZkxpbmVudW1iZXJzOyAvLyBXT1JECi0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gRFdPUkQKLX07Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHsKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBEV09SRAotCWludCBUaW1lRGF0ZVN0YW1wOyAvLyBEV09SRAotCWludCBNYWpvclZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JWZXJzaW9uOyAvLyBXT1JECi0JaW50IE51bWJlck9mTmFtZWRFbnRyaWVzOyAvLyBXT1JEIC0gdXNlZAotCWludCBOdW1iZXJPZklkRW50cmllczsgLy8gV09SRCAtIHVzZWQKLQlmaW5hbCBzdGF0aWMgaW50IFNJWkVPRiA9IDE2OwotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSB7Ci0JLy8gdW5pb24KLQlpbnQgTmFtZU9mZnNldDsgLy8gRFdPUkQgMzEgYml0cwotCWJvb2xlYW4gTmFtZUlzU3RyaW5nOyAvLyBEV09SRCAxIGJpdAotCWludCBOYW1lOyAvLyBEV09SRAotCWludCBJZDsgLy8gV09SRAotCS8vIHVuaW9uCi0JaW50IE9mZnNldFRvRGF0YTsgLy8gRFdPUkQKLQlpbnQgT2Zmc2V0VG9EaXJlY3Rvcnk7IC8vIERXT1JEIDMxIGJpdHMKLQlib29sZWFuIERhdGFJc0RpcmVjdG9yeTsgLy8gRFdPUkQgMSBiaXQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZIHsKLQlpbnQgT2Zmc2V0VG9EYXRhOyAvLyBEV09SRAotCWludCBTaXplOyAvLyBEV09SRAotCWludCBDb2RlUGFnZTsgLy8gRFdPUkQKLQlpbnQgUmVzZXJ2ZWQ7IC8vIERXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgTkVXSEVBREVSIHsKLQlpbnQgUmVzZXJ2ZWQ7IC8vIFdPUkQKLQlpbnQgUmVzVHlwZTsgLy8gV09SRAotCWludCBSZXNDb3VudDsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElDT05SRVNESVIgewotCWludCBXaWR0aDsgLy8gQllURQotCWludCBIZWlnaHQ7IC8vIEJZVEUKLQlpbnQgQ29sb3JDb3VudDsgLy8gQllURQotCWludCByZXNlcnZlZDsgLy8gQllURQotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIENVUlNPUkRJUiB7Ci0JaW50IFdpZHRoOyAvLyBXT1JECi0JaW50IEhlaWdodDsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIFJFU0RJUiB7Ci0JLy8gdW5pb24KLQlJQ09OUkVTRElSIEljb24gPSBuZXcgSUNPTlJFU0RJUigpOwotCUNVUlNPUkRJUiBDdXJzb3IgPSBuZXcgQ1VSU09SRElSKCk7Ci0JaW50IFBsYW5lczsgLy8gV09SRAotCWludCBCaXRDb3VudDsgLy8gV09SRAotCWludCBCeXRlc0luUmVzOyAvLyBEV09SRAotCWludCBJY29uQ3Vyc29ySWQ7IC8vIFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBCSVRNQVBJTkZPSEVBREVSIHsKLQlpbnQgYmlTaXplOyAvLyBEV09SRAotCWludCBiaVdpZHRoOyAvLyBMT05HCi0JaW50IGJpSGVpZ2h0OyAvLyBMT05HCi0JaW50IGJpUGxhbmVzOyAvLyBXT1JECi0JaW50IGJpQml0Q291bnQ7IC8vIFdPUkQKLQlpbnQgYmlDb21wcmVzc2lvbjsgLy8gRFdPUkQKLQlpbnQgYmlTaXplSW1hZ2U7IC8vIERXT1JECi0JaW50IGJpWFBlbHNQZXJNZXRlcjsgLy8gTE9ORwotCWludCBiaVlQZWxzUGVyTWV0ZXI7IC8vIExPTkcKLQlpbnQgYmlDbHJVc2VkOyAvLyBEV09SRAotCWludCBiaUNsckltcG9ydGFudDsgLy8gRFdPUkQKLX0KLQotc3RhdGljIGNsYXNzIFJHQlFVQUQgewotCWludCByZ0JsdWU7IC8vIEJZVEUKLQlpbnQgcmdiR3JlZW47IC8vIEJZVEUKLQlpbnQgcmdiUmVkOyAvLyBCWVRFCi0JaW50IHJnYlJlc2VydmVkOyAvLyBCWVRFCi19Ci1zdGF0aWMgY2xhc3MgQklUTUFQSU5GTyB7Ci0JQklUTUFQSU5GT0hFQURFUiBibWlIZWFkZXIgPSBuZXcgQklUTUFQSU5GT0hFQURFUigpOwotCVJHQlFVQURbXSBibWlDb2xvcnMgPSBudWxsOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQklUTUFQSU5GT0hFQURFUiBiaWgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYmloLmJpU2l6ZSA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpV2lkdGggPSByZWFkNChyYWYpOwotCWJpaC5iaUhlaWdodCA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpUGxhbmVzID0gcmVhZFUyKHJhZik7Ci0JYmloLmJpQml0Q291bnQgPSByZWFkVTIocmFmKTsKLQliaWguYmlDb21wcmVzc2lvbiA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpU2l6ZUltYWdlID0gcmVhZDQocmFmKTsKLQliaWguYmlYUGVsc1Blck1ldGVyID0gcmVhZDQocmFmKTsKLQliaWguYmlZUGVsc1Blck1ldGVyID0gcmVhZDQocmFmKTsKLQliaWguYmlDbHJVc2VkID0gcmVhZDQocmFmKTsKLQliaWguYmlDbHJJbXBvcnRhbnQgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQklUTUFQSU5GTyBiaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZWFkKHJhZiwgYmkuYm1pSGVhZGVyKTsKLX0KLS8qIExpdHRsZSBFbmRpYW4gaGVscGVycyAqLwotc3RhdGljIGludCByZWFkVTIoUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IGIwID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCWludCBiMSA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjsKLQlyZXR1cm4gKGIxIDw8IDggfCBiMCk7Ci19Ci1zdGF0aWMgaW50IHJlYWQ0KFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBiMCA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjs7Ci0JaW50IGIxID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOzsKLQlpbnQgYjIgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7OwotCWludCBiMyA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjs7Ci0JcmV0dXJuIGIzIDw8IDI0IHwgYjIgPDwgMTYgfCBiMSA8PCA4IHwgYjA7Ci19Ci1zdGF0aWMgdm9pZCB3cml0ZTQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYud3JpdGUodmFsdWUgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDgpICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDI0KSAmIDB4RkYpOwotfQotc3RhdGljIHZvaWQgd3JpdGVVMihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi53cml0ZSh2YWx1ZSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gOCkgJiAweEZGKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0RPU19IRUFERVIgaWRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlkaC5lX21hZ2ljID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY2JscCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NwID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3JsYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NwYXJoZHIgPSByZWFkVTIocmFmKTsKLQlpZGguZV9taW5hbGxvYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX21heGFsbG9jID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfc3MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9zcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NzdW0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9pcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NzID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbGZhcmxjID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfb3ZubyA9IHJlYWRVMihyYWYpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWRoLmVfcmVzLmxlbmd0aDsgaSsrKSBpZGguZV9yZXNbaV0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9vZW1pZCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX29lbWluZm8gPSByZWFkVTIocmFmKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkaC5lX3JlczIubGVuZ3RoOyBpKyspIGlkaC5lX3JlczJbaV0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9sZmFuZXcgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfRklMRV9IRUFERVIgaWZoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlmaC5NYWNoaW5lID0gcmVhZFUyKHJhZik7Ci0JaWZoLk51bWJlck9mU2VjdGlvbnMgPSByZWFkVTIocmFmKTsKLQlpZmguVGltZURhdGVTdGFtcCA9IHJlYWQ0KHJhZik7Ci0JaWZoLlBvaW50ZXJUb1N5bWJvbFRhYmxlID0gcmVhZDQocmFmKTsKLQlpZmguTnVtYmVyT2ZTeW1ib2xzID0gcmVhZDQocmFmKTsKLQlpZmguU2l6ZU9mT3B0aW9uYWxIZWFkZXIgPSByZWFkVTIocmFmKTsKLQlpZmguQ2hhcmFjdGVyaXN0aWNzICA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfREFUQV9ESVJFQ1RPUlkgaWRkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlkZC5WaXJ0dWFsQWRkcmVzcyA9IHJlYWQ0KHJhZik7Ci0JaWRkLlNpemUgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfT1BUSU9OQUxfSEVBREVSIGlvaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpb2guTWFnaWMgPSByZWFkVTIocmFmKTsKLQlpb2guTWFqb3JMaW5rZXJWZXJzaW9uID0gcmFmLnJlYWQoKTsKLQlpb2guTWlub3JMaW5rZXJWZXJzaW9uID0gcmFmLnJlYWQoKTsKLQlpb2guU2l6ZU9mQ29kZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZlVuaW5pdGlhbGl6ZWREYXRhID0gcmVhZDQocmFmKTsKLQlpb2guQWRkcmVzc09mRW50cnlQb2ludCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkJhc2VPZkNvZGUgPSByZWFkNChyYWYpOwotCWlvaC5CYXNlT2ZEYXRhID0gcmVhZDQocmFmKTsKLQlpb2guSW1hZ2VCYXNlID0gcmVhZDQocmFmKTsKLQlpb2guU2VjdGlvbkFsaWdubWVudCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkZpbGVBbGlnbm1lbnQgPSByZWFkNChyYWYpOwotCWlvaC5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9ySW1hZ2VWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1pbm9ySW1hZ2VWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9yU3Vic3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NaW5vclN1YnN5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guV2luMzJWZXJzaW9uVmFsdWUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZJbWFnZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYWRlcnMgPSByZWFkNChyYWYpOwotCWlvaC5DaGVja1N1bSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlN1YnN5c3RlbSA9IHJlYWRVMihyYWYpOwotCWlvaC5EbGxDaGFyYWN0ZXJpc3RpY3MgPSByZWFkVTIocmFmKTsKLQlpb2guU2l6ZU9mU3RhY2tSZXNlcnZlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mU3RhY2tDb21taXQgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFwUmVzZXJ2ZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYXBDb21taXQgPSByZWFkNChyYWYpOwotCWlvaC5Mb2FkZXJGbGFncyA9IHJlYWQ0KHJhZik7Ci0JaW9oLk51bWJlck9mUnZhQW5kU2l6ZXMgPSByZWFkNChyYWYpOwotCWZvciAoaW50IGkgPSAwIDsgaSA8IGlvaC5EYXRhRGlyZWN0b3J5Lmxlbmd0aDsgaSsrKSB7Ci0JCWlvaC5EYXRhRGlyZWN0b3J5W2ldID0gbmV3IElNQUdFX0RBVEFfRElSRUNUT1JZKCk7Ci0JCXJlYWQocmFmLCBpb2guRGF0YURpcmVjdG9yeVtpXSk7Ci0JfQotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfTlRfSEVBREVSUyBpbmgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW5oLlNpZ25hdHVyZSA9IHJlYWQ0KHJhZik7Ci0JcmVhZChyYWYsIGluaC5GaWxlSGVhZGVyKTsKLQlyZWFkKHJhZiwgaW5oLk9wdGlvbmFsSGVhZGVyKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1NFQ1RJT05fSEVBREVSIGlzaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmb3IgKGludCBpID0gMCA7IGkgPCBpc2guTmFtZS5sZW5ndGg7IGkrKykgaXNoLk5hbWVbaV0gPSByYWYucmVhZCgpOwotCWlzaC5NaXNjX1ZpcnR1YWxTaXplID0gcmVhZDQocmFmKTsKLQlpc2guVmlydHVhbEFkZHJlc3MgPSByZWFkNChyYWYpOwotCWlzaC5TaXplT2ZSYXdEYXRhID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvUmF3RGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb1JlbG9jYXRpb25zID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvTGluZW51bWJlcnMgPSByZWFkNChyYWYpOwotCWlzaC5OdW1iZXJPZlJlbG9jYXRpb25zID0gcmVhZFUyKHJhZik7Ci0JaXNoLk51bWJlck9mTGluZW51bWJlcnMgPSByZWFkVTIocmFmKTsKLQlpc2guQ2hhcmFjdGVyaXN0aWNzID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBpcmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkLkNoYXJhY3RlcmlzdGljcyA9IHJlYWQ0KHJhZik7Ci0JaXJkLlRpbWVEYXRlU3RhbXAgPSByZWFkNChyYWYpOwotCWlyZC5NYWpvclZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpcmQuTWlub3JWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaXJkLk51bWJlck9mTmFtZWRFbnRyaWVzID0gcmVhZFUyKHJhZik7Ci0JaXJkLk51bWJlck9mSWRFbnRyaWVzID0gcmVhZFUyKHJhZik7Ci19Owotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIGlyZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkZS5OYW1lID0gcmVhZDQocmFmKTsKLQlpcmRlLk9mZnNldFRvRGF0YSA9IHJlYWQ0KHJhZik7Ci0JLy8gY29uc3RydWN0IG90aGVyIHVuaW9uIG1lbWJlcnMKLQlpcmRlLk5hbWVPZmZzZXQgPSBpcmRlLk5hbWUgJiB+ICgxIDw8IDMxKTsKLQlpcmRlLk5hbWVJc1N0cmluZyA9IChpcmRlLk5hbWUgJiAoMSA8PCAzMSkpICE9IDA7Ci0JaXJkZS5JZCA9IGlyZGUuTmFtZSAmIDB4RkZGRjsKLQlpcmRlLk9mZnNldFRvRGlyZWN0b3J5ID0gaXJkZS5PZmZzZXRUb0RhdGEgJiB+ICgxIDw8IDMxKTsKLQlpcmRlLkRhdGFJc0RpcmVjdG9yeSA9IChpcmRlLk9mZnNldFRvRGF0YSAmICgxIDw8IDMxKSkgIT0gMDsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkgaXJkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpcmRlLk9mZnNldFRvRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXJkZS5TaXplID0gcmVhZDQocmFmKTsKLQlpcmRlLkNvZGVQYWdlID0gcmVhZDQocmFmKTsKLQlpcmRlLlJlc2VydmVkID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIE5FV0hFQURFUiBuaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQluaC5SZXNlcnZlZCA9IHJlYWRVMihyYWYpOwotCW5oLlJlc1R5cGUgPSByZWFkVTIocmFmKTsKLQluaC5SZXNDb3VudCA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSUNPTlJFU0RJUiBpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWkuV2lkdGggPSByYWYucmVhZCgpOwotCWkuSGVpZ2h0ID0gcmFmLnJlYWQoKTsKLQlpLkNvbG9yQ291bnQgPSByYWYucmVhZCgpOwotCWkucmVzZXJ2ZWQgPSByYWYucmVhZCgpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgQ1VSU09SRElSIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYy5XaWR0aCA9IHJlYWRVMihyYWYpOwotCWMuSGVpZ2h0ID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBSRVNESVIgcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JbG9uZyBzdGFydCA9IHJhZi5nZXRGaWxlUG9pbnRlcigpOwotCXJlYWQocmFmLCBycy5JY29uKTsKLQlyYWYuc2VlayhzdGFydCk7Ci0JcmVhZChyYWYsIHJzLkN1cnNvcik7Ci0JcnMuUGxhbmVzID0gcmVhZFUyKHJhZik7Ci0JcnMuQml0Q291bnQgPSByZWFkVTIocmFmKTsKLQlycy5CeXRlc0luUmVzID0gcmVhZDQocmFmKTsKLQlycy5JY29uQ3Vyc29ySWQgPSByZWFkVTIocmFmKTsKLX0KLQotLyogSW1hZ2VEYXRhIGFuZCBJbWFnZSBEZWNvZGVyIGlubGluaW5nIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gU1dUIAotICogVGhlIGZvbGxvd2luZyBzZWN0aW9uIGNhbiBiZSBlbnRpcmVseSByZW1vdmVkIGlmIFNXVCBjYW4gYmUgdXNlZC4KLSAqLwotCi1zdGF0aWMgY2xhc3MgUkdCIHsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCByZWQ7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCBncmVlbjsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIFJHQgotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZTsKLQkKLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxNTAyMzQ2MTI0OTA3NEw7Ci0JCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBnaXZlbgotICogcmVkLCBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHJlZCB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKiBAcGFyYW0gZ3JlZW4gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKiBAcGFyYW0gYmx1ZSB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBpbnN0YW5jZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFJHQihpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKSB7Ci0JaWYgKChyZWQgPiAyNTUpIHx8IChyZWQgPCAwKSB8fAotCQkoZ3JlZW4gPiAyNTUpIHx8IChncmVlbiA8IDApIHx8Ci0JCShibHVlID4gMjU1KSB8fCAoYmx1ZSA8IDApKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl0aGlzLnJlZCA9IHJlZDsKLQl0aGlzLmdyZWVuID0gZ3JlZW47Ci0JdGhpcy5ibHVlID0gYmx1ZTsKLX0KLQotLyoqCi0gKiBDb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyLCBhbmQgcmV0dXJucyB0cnVlCi0gKiBpZiB0aGV5IHJlcHJlc2VudCB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QgdXNpbmcgYSBjbGFzcwotICogc3BlY2lmaWMgY29tcGFyaXNvbi4KLSAqCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoIHRoaXMgb2JqZWN0Ci0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhpcyBvYmplY3QgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAqCi0gKiBAc2VlICNoYXNoQ29kZSgpCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyAoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUkdCKSkgcmV0dXJuIGZhbHNlOwotCVJHQiByZ2IgPSAoUkdCKW9iamVjdDsKLQlyZXR1cm4gKHJnYi5yZWQgPT0gdGhpcy5yZWQpICYmIChyZ2IuZ3JlZW4gPT0gdGhpcy5ncmVlbikgJiYgKHJnYi5ibHVlID09IHRoaXMuYmx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIHJlY2VpdmVyLiBBbnkgdHdvIAotICogb2JqZWN0cyB3aGljaCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdG8gCi0gKiA8Y29kZT5lcXVhbHM8L2NvZGU+IG11c3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzCi0gKiBtZXRob2QuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBoYXNoCi0gKgotICogQHNlZSAjZXF1YWxzKE9iamVjdCkKLSAqLwotcHVibGljIGludCBoYXNoQ29kZSAoKSB7Ci0JcmV0dXJuIChibHVlIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IHJlZDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPlJHQjwvY29kZT4KLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZyAoKSB7Ci0JcmV0dXJuICJSR0IgeyIgKyByZWQgKyAiLCAiICsgZ3JlZW4gKyAiLCAiICsgYmx1ZSArICJ9IjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQotLy8kTk9OLU5MUy00JAotfQotCi19Ci1zdGF0aWMgY2xhc3MgUGFsZXR0ZURhdGEgewotCQotCS8qKgotCSAqIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgZGlyZWN0IHBhbGV0dGUsIAotCSAqIGFuZCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdDsKLQkKLQkvKioKLQkgKiB0aGUgUkdCIHZhbHVlcyBmb3IgYW4gaW5kZXhlZCBwYWxldHRlLCB3aGVyZSB0aGUKLQkgKiBpbmRpY2VzIG9mIHRoZSBhcnJheSBjb3JyZXNwb25kIHRvIHBpeGVsIHZhbHVlcwotCSAqLwotCXB1YmxpYyBSR0JbXSBjb2xvcnM7Ci0JCi0JLyoqCi0JICogdGhlIHJlZCBtYXNrIGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCByZWRNYXNrOwotCQotCS8qKgotCSAqIHRoZSBncmVlbiBtYXNrIGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBncmVlbk1hc2s7Ci0JCi0JLyoqCi0JICogdGhlIGJsdWUgbWFzayBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZU1hc2s7Ci0JCi0JLyoqCi0JICogdGhlIHJlZCBzaGlmdCBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgcmVkU2hpZnQ7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIHNoaWZ0IGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBncmVlblNoaWZ0OwotCQotCS8qKgotCSAqIHRoZSBibHVlIHNoaWZ0IGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBibHVlU2hpZnQ7Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldyBpbmRleGVkIHBhbGV0dGUgZ2l2ZW4gYW4gYXJyYXkgb2YgUkdCIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gY29sb3JzIHRoZSBhcnJheSBvZiA8Y29kZT5SR0I8L2NvZGU+cyBmb3IgdGhlIHBhbGV0dGUKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBQYWxldHRlRGF0YShSR0JbXSBjb2xvcnMpIHsKLQlpZiAoY29sb3JzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JdGhpcy5jb2xvcnMgPSBjb2xvcnM7Ci0JdGhpcy5pc0RpcmVjdCA9IGZhbHNlOwotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0IHBhbGV0dGUgZ2l2ZW4gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgbWFza3MuCi0gKgotICogQHBhcmFtIHJlZE1hc2sgdGhlIHJlZCBtYXNrCi0gKiBAcGFyYW0gZ3JlZW5NYXNrIHRoZSBncmVlbiBtYXNrCi0gKiBAcGFyYW0gYmx1ZU1hc2sgdGhlIGJsdWUgbWFzawotICovCi1wdWJsaWMgUGFsZXR0ZURhdGEoaW50IHJlZE1hc2ssIGludCBncmVlbk1hc2ssIGludCBibHVlTWFzaykgewotCXRoaXMucmVkTWFzayA9IHJlZE1hc2s7Ci0JdGhpcy5ncmVlbk1hc2sgPSBncmVlbk1hc2s7Ci0JdGhpcy5ibHVlTWFzayA9IGJsdWVNYXNrOwotCXRoaXMuaXNEaXJlY3QgPSB0cnVlOwotCXRoaXMucmVkU2hpZnQgPSBzaGlmdEZvck1hc2socmVkTWFzayk7Ci0JdGhpcy5ncmVlblNoaWZ0ID0gc2hpZnRGb3JNYXNrKGdyZWVuTWFzayk7Ci0JdGhpcy5ibHVlU2hpZnQgPSBzaGlmdEZvck1hc2soYmx1ZU1hc2spOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHBpeGVsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIDxjb2RlPlJCRzwvY29kZT4uCi0gKgotICogQHBhcmFtIHJnYiB0aGUgUkdCIHRvIGdldCB0aGUgcGl4ZWwgdmFsdWUgZm9yCi0gKiBAcmV0dXJuIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIFJHQgotICogCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIFJHQiBpcyBub3QgZm91bmQgaW4gdGhlIHBhbGV0dGU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRQaXhlbChSR0IgcmdiKSB7Ci0JaWYgKHJnYiA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChpc0RpcmVjdCkgewotCQlpbnQgcGl4ZWwgPSAwOwotCQlwaXhlbCB8PSAocmVkU2hpZnQgPCAwID8gcmdiLnJlZCA8PCAtcmVkU2hpZnQgOiByZ2IucmVkID4+PiByZWRTaGlmdCkgJiByZWRNYXNrOwotCQlwaXhlbCB8PSAoZ3JlZW5TaGlmdCA8IDAgPyByZ2IuZ3JlZW4gPDwgLWdyZWVuU2hpZnQgOiByZ2IuZ3JlZW4gPj4+IGdyZWVuU2hpZnQpICYgZ3JlZW5NYXNrOwotCQlwaXhlbCB8PSAoYmx1ZVNoaWZ0IDwgMCA/IHJnYi5ibHVlIDw8IC1ibHVlU2hpZnQgOiByZ2IuYmx1ZSA+Pj4gYmx1ZVNoaWZ0KSAmIGJsdWVNYXNrOwotCQlyZXR1cm4gcGl4ZWw7Ci0JfSBlbHNlIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xvcnNbaV0uZXF1YWxzKHJnYikpIHJldHVybiBpOwotCQl9Ci0JCS8qIFRoZSBSR0IgZGlkIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZSAqLwotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiA8Y29kZT5SR0I8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBpeGVsIHZhbHVlLgotICoKLSAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgdG8gZ2V0IHRoZSBSR0IgdmFsdWUgZm9yCi0gKiBAcmV0dXJuIHRoZSBSR0IgdmFsdWUgZm9yIHRoZSBnaXZlbiBwaXhlbAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgcGl4ZWwgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFJHQiBnZXRSR0IoaW50IHBpeGVsKSB7Ci0JaWYgKGlzRGlyZWN0KSB7Ci0JCWludCByID0gcGl4ZWwgJiByZWRNYXNrOwotCQlyID0gKHJlZFNoaWZ0IDwgMCkgPyByID4+PiAtcmVkU2hpZnQgOiByIDw8IHJlZFNoaWZ0OwotCQlpbnQgZyA9IHBpeGVsICYgZ3JlZW5NYXNrOwotCQlnID0gKGdyZWVuU2hpZnQgPCAwKSA/IGcgPj4+IC1ncmVlblNoaWZ0IDogZyA8PCBncmVlblNoaWZ0OwotCQlpbnQgYiA9IHBpeGVsICYgYmx1ZU1hc2s7Ci0JCWIgPSAoYmx1ZVNoaWZ0IDwgMCkgPyBiID4+PiAtYmx1ZVNoaWZ0IDogYiA8PCBibHVlU2hpZnQ7Ci0JCXJldHVybiBuZXcgUkdCKHIsIGcsIGIpOwotCX0gZWxzZSB7Ci0JCWlmIChwaXhlbCA8IDAgfHwgcGl4ZWwgPj0gY29sb3JzLmxlbmd0aCkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQkJfQotCQlyZXR1cm4gY29sb3JzW3BpeGVsXTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbGwgdGhlIFJHQiB2YWx1ZXMgaW4gdGhlIHJlY2VpdmVyIGlmIGl0IGlzIGFuCi0gKiBpbmRleGVkIHBhbGV0dGUsIG9yIG51bGwgaWYgaXQgaXMgYSBkaXJlY3QgcGFsZXR0ZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSA8Y29kZT5SR0I8L2NvZGU+cyBmb3IgdGhlIHJlY2VpdmVyIG9yIG51bGwKLSAqLwotcHVibGljIFJHQltdIGdldFJHQnMoKSB7Ci0JcmV0dXJuIGNvbG9yczsKLX0KLQotLyoqCi0gKiBDb21wdXRlcyB0aGUgc2hpZnQgdmFsdWUgZm9yIGEgZ2l2ZW4gbWFzay4KLSAqCi0gKiBAcGFyYW0gbWFzayB0aGUgbWFzayB0byBjb21wdXRlIHRoZSBzaGlmdCBmb3IKLSAqIEByZXR1cm4gdGhlIHNoaWZ0IGFtb3VudAotICoKLSAqIEBzZWUgUGFsZXR0ZURhdGEKLSAqLwotaW50IHNoaWZ0Rm9yTWFzayhpbnQgbWFzaykgewotCWZvciAoaW50IGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsgCi0JCWlmICgoKG1hc2sgPj4gaSkgJiAweDEpICE9IDApIHJldHVybiA3IC0gaTsKLQl9Ci0JcmV0dXJuIDMyOwotfQotCi19Ci1zdGF0aWMgY2xhc3MgSW1hZ2VMb2FkZXIgewotCQotCS8qKgotCSAqIHRoZSBhcnJheSBvZiBJbWFnZURhdGEgb2JqZWN0cyBpbiB0aGlzIEltYWdlTG9hZGVyLgotCSAqIFRoaXMgYXJyYXkgaXMgcmVhZCBpbiB3aGVuIHRoZSBsb2FkIG1ldGhvZCBpcyBjYWxsZWQsCi0JICogYW5kIGl0IGlzIHdyaXR0ZW4gb3V0IHdoZW4gdGhlIHNhdmUgbWV0aG9kIGlzIGNhbGxlZAotCSAqLwotCXB1YmxpYyBJbWFnZURhdGFbXSBkYXRhOwotCQotCS8qKgotCSAqIHRoZSB3aWR0aCBvZiB0aGUgbG9naWNhbCBzY3JlZW4gb24gd2hpY2ggdGhlIGltYWdlcwotCSAqIHJlc2lkZSwgaW4gcGl4ZWxzICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBMb2dpY2FsIFNjcmVlbiBXaWR0aCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGxvZ2ljYWxTY3JlZW5XaWR0aDsKLQotCS8qKgotCSAqIHRoZSBoZWlnaHQgb2YgdGhlIGxvZ2ljYWwgc2NyZWVuIG9uIHdoaWNoIHRoZSBpbWFnZXMKLQkgKiByZXNpZGUsIGluIHBpeGVscyAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhCi0JICogTG9naWNhbCBTY3JlZW4gSGVpZ2h0IHZhbHVlKQotCSAqLwotCXB1YmxpYyBpbnQgbG9naWNhbFNjcmVlbkhlaWdodDsKLQotCS8qKgotCSAqIHRoZSBiYWNrZ3JvdW5kIHBpeGVsIGZvciB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgCi0JICogY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YSBCYWNrZ3JvdW5kIENvbG9yIEluZGV4IHZhbHVlKS4KLQkgKiBUaGUgZGVmYXVsdCBpcyAtMSB3aGljaCBtZWFucyAndW5zcGVjaWZpZWQgYmFja2dyb3VuZCcKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGJhY2tncm91bmRQaXhlbDsKLQotCS8qKgotCSAqIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBkaXNwbGF5IG9mIGEgc2VxdWVuY2UKLQkgKiBvZiBhbmltYXRlZCBpbWFnZXMgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGNvbW1vbmx5LXVzZWQKLQkgKiBHSUYgYXBwbGljYXRpb24gZXh0ZW5zaW9uIGZvciAiTkVUU0NBUEUgMi4wIDAxIikKLQkgKi8KLQlwdWJsaWMgaW50IHJlcGVhdENvdW50OwotCQkKLQkvKgotCSAqIHRoZSBzZXQgb2YgSW1hZ2VMb2FkZXIgZXZlbnQgbGlzdGVuZXJzLCBjcmVhdGVkIG9uIGRlbWFuZAotCSAqLwotCVZlY3RvciBpbWFnZUxvYWRlckxpc3RlbmVyczsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgSW1hZ2VMb2FkZXIuCi0gKi8KLXB1YmxpYyBJbWFnZUxvYWRlcigpIHsKLQlyZXNldCgpOwotfQotCi0vKioKLSAqIFJlc2V0cyB0aGUgZmllbGRzIG9mIHRoZSBJbWFnZUxvYWRlciwgZXhjZXB0IGZvciB0aGUKLSAqIDxjb2RlPmltYWdlTG9hZGVyTGlzdGVuZXJzPC9jb2RlPiBmaWVsZC4KLSAqLwotdm9pZCByZXNldCgpIHsKLQlkYXRhID0gbnVsbDsKLQlsb2dpY2FsU2NyZWVuV2lkdGggPSAwOwotCWxvZ2ljYWxTY3JlZW5IZWlnaHQgPSAwOwotCWJhY2tncm91bmRQaXhlbCA9IC0xOwotCXJlcGVhdENvdW50ID0gMTsKLX0KLQotLyoqCi0gKiBMb2FkcyBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgZnJvbSB0aGUKLSAqIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uIFRocm93cyBhbiBlcnJvciBpZiBlaXRoZXIgYW4gZXJyb3IKLSAqIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBpbWFnZXMsIG9yIGlmIHRoZSBpbWFnZXMgYXJlIG5vdAotICogb2YgYSBzdXBwb3J0ZWQgdHlwZS4gUmV0dXJucyB0aGUgbG9hZGVkIGltYWdlIGRhdGEgYXJyYXkuCi0gKgotICogQHBhcmFtIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtIHRvIGxvYWQgdGhlIGltYWdlcyBmcm9tCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmVhbSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9JTUFHRSAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU8gLSBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhW10gbG9hZChJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQlpZiAoc3RyZWFtID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmVzZXQoKTsKLQlkYXRhID0gRmlsZUZvcm1hdC5sb2FkKHN0cmVhbSwgdGhpcyk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogTG9hZHMgYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGZyb20gdGhlCi0gKiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaHJvd3MgYW4gZXJyb3IgaWYgZWl0aGVyCi0gKiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgaW1hZ2VzLCBvciBpZiB0aGUgaW1hZ2VzIGFyZQotICogbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUuIFJldHVybnMgdGhlIGxvYWRlZCBpbWFnZSBkYXRhIGFycmF5LgotICoKLSAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIHRoZSBpbWFnZXMgZnJvbQotICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgZmlsZSBuYW1lIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyAtIGlmIGFuIElPIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGFuIHVucmVjb2duaXplZCBmb3JtYXQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YVtdIGxvYWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JaWYgKGZpbGVuYW1lID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQlzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJcmV0dXJuIGxvYWQoc3RyZWFtKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgZXJyb3IKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLX0KLXN0YXRpYyBjbGFzcyBJbWFnZURhdGEgewotCQotCS8qKgotCSAqIFRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4KLQkgKi8KLQlwdWJsaWMgaW50IHdpZHRoOwotCi0JLyoqCi0JICogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4KLQkgKi8KLQlwdWJsaWMgaW50IGhlaWdodDsKLQotCS8qKgotCSAqIFRoZSBjb2xvciBkZXB0aCBvZiB0aGUgaW1hZ2UsIGluIGJpdHMgcGVyIHBpeGVsLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBhIGRlcHRoIG9mIDggb3IgbGVzcyBkb2VzIG5vdCBuZWNlc3NhcmlseQotCSAqIG1lYW4gdGhhdCB0aGUgaW1hZ2UgaXMgcGFsZXR0ZSBpbmRleGVkLCBvcgotCSAqIGNvbnZlcnNlbHkgdGhhdCBhIGRlcHRoIGdyZWF0ZXIgdGhhbiA4IG1lYW5zIHRoYXQKLQkgKiB0aGUgaW1hZ2UgaXMgZGlyZWN0IGNvbG9yLiAgQ2hlY2sgdGhlIGFzc29jaWF0ZWQKLQkgKiBQYWxldHRlRGF0YSdzIGlzRGlyZWN0IGZpZWxkIGZvciBzdWNoIGRldGVybWluYXRpb25zLgotCSAqLwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0KLQkvKioKLQkgKiBUaGUgc2NhbmxpbmUgcGFkZGluZy4KLQkgKiA8cD4KLQkgKiBJZiBvbmUgc2NhbmxpbmUgb2YgdGhlIGltYWdlIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0JICogdGhpcyBudW1iZXIsIGl0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdW50aWwgaXQgaXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgc2NhbmxpbmVQYWQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHNjYW5saW5lIHBhZGRpbmcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgYnl0ZXNQZXJMaW5lOwotCi0JLyoqCi0JICogVGhlIHBpeGVsIGRhdGEgb2YgdGhlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBmb3IgMTYgYml0IGRlcHRoIGltYWdlcyB0aGUgcGl4ZWwgZGF0YSBpcyBzdG9yZWQKLQkgKiBpbiBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9yZGVyOyBob3dldmVyLCBmb3IgMjRiaXQgYW5kCi0JICogMzJiaXQgZGVwdGggaW1hZ2VzIHRoZSBwaXhlbCBkYXRhIGlzIHN0b3JlZCBpbiBtb3N0Ci0JICogc2lnbmlmaWNhbnQgYnl0ZSBvcmRlci4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBkYXRhOwotCi0JLyoqCi0JICogVGhlIGNvbG9yIHRhYmxlIGZvciB0aGUgaW1hZ2UuCi0JICovCi0JcHVibGljIFBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0KLQkvKioKLQkgKiBUaGUgdHJhbnNwYXJlbnQgcGl4ZWwuCi0JICogPHA+Ci0JICogUGl4ZWxzIHdpdGggdGhpcyB2YWx1ZSBhcmUgdHJhbnNwYXJlbnQuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICdubyB0cmFuc3BhcmVudCBwaXhlbCcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgdHJhbnNwYXJlbnRQaXhlbDsKLQotCS8qKgotCSAqIEFuIGljb24tc3BlY2lmaWMgZmllbGQgY29udGFpbmluZyB0aGUgZGF0YSBmcm9tIHRoZSBpY29uIG1hc2suCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIDEgYml0IGJpdG1hcCBzdG9yZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotCSAqIGJpdCBmaXJzdC4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lIGlzCi0JICogJygod2lkdGggKyA3KSAvIDggKyAobWFza1BhZCAtIDEpKSAvIG1hc2tQYWQgKiBtYXNrUGFkJy4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgbnVsbCB3aGljaCBtZWFucyAnbm8gdHJhbnNwYXJlbmN5IG1hc2snLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIG1hc2tEYXRhOwotCi0JLyoqCi0JICogQW4gaWNvbi1zcGVjaWZpYyBmaWVsZCBjb250YWluaW5nIHRoZSBzY2FubGluZSBwYWQgb2YgdGhlIG1hc2suCi0JICogPHA+Ci0JICogSWYgb25lIHNjYW5saW5lIG9mIHRoZSB0cmFuc3BhcmVuY3kgbWFzayBpcyBub3QgYQotCSAqIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHVudGlsCi0JICogaXQgaXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgbWFza1BhZDsKLQkKLQkvKioKLQkgKiBUaGUgYWxwaGEgZGF0YSBvZiB0aGUgaW1hZ2UuCi0JICogPHA+Ci0JICogRXZlcnkgcGl4ZWwgY2FuIGhhdmUgYW4gPGVtPmFscGhhIGJsZW5kaW5nPC9lbT4gdmFsdWUgdGhhdAotCSAqIHZhcmllcyBmcm9tIDAsIG1lYW5pbmcgZnVsbHkgdHJhbnNwYXJlbnQsIHRvIDI1NSBtZWFuaW5nCi0JICogZnVsbHkgb3BhcXVlLiAgVGhlIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUgaXMKLQkgKiAnd2lkdGgnLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGFscGhhRGF0YTsKLQkKLQkvKioKLQkgKiBUaGUgZ2xvYmFsIGFscGhhIHZhbHVlIHRvIGJlIHVzZWQgZm9yIGV2ZXJ5IHBpeGVsLgotCSAqIDxwPgotCSAqIElmIHRoaXMgdmFsdWUgaXMgc2V0LCB0aGUgPGNvZGU+YWxwaGFEYXRhPC9jb2RlPiBmaWVsZAotCSAqIGlzIGlnbm9yZWQgYW5kIHdoZW4gdGhlIGltYWdlIGlzIHJlbmRlcmVkIGVhY2ggcGl4ZWwKLQkgKiB3aWxsIGJlIGJsZW5kZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBhbiBhbW91bnQKLQkgKiBwcm9wb3J0aW9uYWwgdG8gdGhpcyB2YWx1ZS4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgLTEgd2hpY2ggbWVhbnMgJ25vIGdsb2JhbCBhbHBoYSB2YWx1ZScKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBhbHBoYTsKLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGZpbGUgZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzIHJlYWQuCi0JICogCi0JICogSXQgaXMgZXhwcmVzc2VkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQkgKiA8ZGw+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0JNUDwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIEJNUCBmaWxlIGZvcm1hdCwgbm8gY29tcHJlc3Npb248L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9CTVBfUkxFPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgQk1QIGZpbGUgZm9ybWF0LCBSTEUgY29tcHJlc3Npb24gaWYgYXBwcm9wcmlhdGU8L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9HSUY8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+R0lGIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfSUNPPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgSUNPIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfSlBFRzwvY29kZT48L2R0PgotCSAqIDxkZD5KUEVHIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfUE5HPC9jb2RlPjwvZHQ+Ci0JICogPGRkPlBORyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPC9kbD4KLQkgKi8KLQlwdWJsaWMgaW50IHR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlCi0JICogd2l0aGluIHRoZSBsb2dpY2FsIHNjcmVlbiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0bwotCSAqIHRoZSBHSUY4OWEgSW1hZ2UgTGVmdCBQb3NpdGlvbiB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCB4OwotCi0JLyoqCi0JICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQotCSAqIHdpdGhpbiB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8KLQkgKiB0aGUgR0lGODlhIEltYWdlIFRvcCBQb3NpdGlvbiB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCB5OwotCi0JLyoqCi0JICogQSBkZXNjcmlwdGlvbiBvZiBob3cgdG8gZGlzcG9zZSBvZiB0aGUgY3VycmVudCBpbWFnZQotCSAqIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBuZXh0LgotCSAqIAotCSAqIEl0IGlzIGV4cHJlc3NlZCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0JICogPGRsPgotCSAqIDxkdD48Y29kZT5ETV9VTlNQRUNJRklFRDwvY29kZT48L2R0PgotCSAqIDxkZD5kaXNwb3NhbCBtZXRob2Qgbm90IHNwZWNpZmllZDwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfTk9ORTwvY29kZT48L2R0PgotCSAqIDxkZD5kbyBub3RoaW5nIC0gbGVhdmUgdGhlIGltYWdlIGluIHBsYWNlPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+RE1fRklMTF9CQUNLR1JPVU5EPC9jb2RlPjwvZHQ+Ci0JICogPGRkPmZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvcjwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfUFJFVklPVVM8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+cmVzdG9yZSB0aGUgcHJldmlvdXMgcGljdHVyZTwvZGQ+Ci0JICogPC9kbD4KLQkgKiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhIERpc3Bvc2FsIE1ldGhvZCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGRpc3Bvc2FsTWV0aG9kOwotCi0JLyoqCi0JICogVGhlIHRpbWUgdG8gZGVsYXkgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIG5leHQgaW1hZ2UKLQkgKiBpbiBhbiBhbmltYXRpb24gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YQotCSAqIERlbGF5IFRpbWUgdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgZGVsYXlUaW1lOwotCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQlzdGF0aWMgZmluYWwgYnl0ZVtdIE9ORV9UT19PTkVfTUFQUElORyA9IEFOWV9UT19FSUdIVFs4XTsKLQotCS8qKgotCSAqIFNjYWxlZCA4eDggQmF5ZXIgZGl0aGVyIG1hdHJpeC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50W11bXSBESVRIRVJfTUFUUklYID0gewotCQl7IDB4ZmMwMDAwLCAweDdjMDAwMCwgMHhkYzAwMDAsIDB4NWMwMDAwLCAweGY0MDAwMCwgMHg3NDAwMDAsIDB4ZDQwMDAwLCAweDU0MDAwMCB9LAotCQl7IDB4M2MwMDAwLCAweGJjMDAwMCwgMHgxYzAwMDAsIDB4OWMwMDAwLCAweDM0MDAwMCwgMHhiNDAwMDAsIDB4MTQwMDAwLCAweDk0MDAwMCB9LAotCQl7IDB4Y2MwMDAwLCAweDRjMDAwMCwgMHhlYzAwMDAsIDB4NmMwMDAwLCAweGM0MDAwMCwgMHg0NDAwMDAsIDB4ZTQwMDAwLCAweDY0MDAwMCB9LAotCQl7IDB4MGMwMDAwLCAweDhjMDAwMCwgMHgyYzAwMDAsIDB4YWMwMDAwLCAweDA0MDAwMCwgMHg4NDAwMDAsIDB4MjQwMDAwLCAweGE0MDAwMCB9LAotCQl7IDB4ZjAwMDAwLCAweDcwMDAwMCwgMHhkMDAwMDAsIDB4NTAwMDAwLCAweGY4MDAwMCwgMHg3ODAwMDAsIDB4ZDgwMDAwLCAweDU4MDAwMCB9LAotCQl7IDB4MzAwMDAwLCAweGIwMDAwMCwgMHgxMDAwMDAsIDB4OTAwMDAwLCAweDM4MDAwMCwgMHhiODAwMDAsIDB4MTgwMDAwLCAweDk4MDAwMCB9LAotCQl7IDB4YzAwMDAwLCAweDQwMDAwMCwgMHhlMDAwMDAsIDB4NjAwMDAwLCAweGM4MDAwMCwgMHg0ODAwMDAsIDB4ZTgwMDAwLCAweDY4MDAwMCB9LAotCQl7IDB4MDAwMDAwLCAweDgwMDAwMCwgMHgyMDAwMDAsIDB4YTAwMDAwLCAweDA4MDAwMCwgMHg4ODAwMDAsIDB4MjgwMDAwLCAweGE4MDAwMCB9Ci0JfTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBJbWFnZURhdGEgd2l0aCB0aGUgZ2l2ZW4gd2lkdGgsIGhlaWdodCwKLSAqIGRlcHRoIGFuZCBwYWxldHRlLiBUaGUgZGF0YSB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFuIChhbGwgemVybykKLSAqIGFycmF5IG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLgotICoKLSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gZGVwdGggdGhlIGRlcHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHBhbGV0dGUgdGhlIHBhbGV0dGUgb2YgdGhlIGltYWdlIChtdXN0IG5vdCBiZSBudWxsKQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGRlcHRoIGlzIG5vdAotICogICAgICAgIAlvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhbGV0dGUgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlKSB7Ci0JdGhpcyh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwKLQkJNCwgbnVsbCwgMCwgbnVsbCwKLQkJbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBJbWFnZURhdGEgd2l0aCB0aGUgZ2l2ZW4gd2lkdGgsIGhlaWdodCwKLSAqIGRlcHRoLCBwYWxldHRlLCBzY2FubGluZVBhZCBhbmQgZGF0YS4KLSAqCi0gKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGRlcHRoIHRoZSBkZXB0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBwYWxldHRlIHRoZSBwYWxldHRlIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHNjYW5saW5lUGFkIHRoZSBwYWRkaW5nIG9mIGVhY2ggbGluZSwgaW4gYnl0ZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBpbWFnZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGRlcHRoIGlzIG5vdAotICogICAgICAgIAlvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhbGV0dGUgb3IgZGF0YSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfQkVfWkVSTyAtIGlmIHRoZSBzY2FubGluZVBhZCBpcyB6ZXJvPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsIGludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEpIHsKLQl0aGlzKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlLAotCQlzY2FubGluZVBhZCwgY2hlY2tEYXRhKGRhdGEpLCAwLCBudWxsLAotCQludWxsLCAtMSwgLTEsIFNXVC5JTUFHRV9VTkRFRklORUQsCi0JCTAsIDAsIDAsIDApOwotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBsb2FkZWQgZnJvbSBhIGZpbGUgd2l0aCB0aGUKLSAqIHNwZWNpZmllZCBuYW1lLiBUaHJvd3MgYW4gZXJyb3IgaWYgYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgdGhlCi0gKiBpbWFnZSwgb3IgaWYgdGhlIGltYWdlIGhhcyBhbiB1bnN1cHBvcnRlZCB0eXBlLgotICogPHA+Ci0gKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSB3aGVuIGxvYWRpbmcgYSBzaW5nbGUKLSAqIGltYWdlIG9ubHkuIElmIHRoZSBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIGltYWdlcywgb25seSB0aGUgZmlyc3QKLSAqIG9uZSB3aWxsIGJlIGxvYWRlZC4gVG8gbG9hZCBtdWx0aXBsZSBpbWFnZXMsIHVzZSAKLSAqIDxjb2RlPkltYWdlTG9hZGVyLmxvYWQoKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvYWQgdGhlIGltYWdlIGZyb20gKG11c3Qgbm90IGJlIG51bGwpCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgZmlsZSBuYW1lIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyBpZiBhbiBJTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBhbiB1bnJlY29nbml6ZWQgZm9ybWF0PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JSW1hZ2VEYXRhW10gZGF0YSA9IG5ldyBJbWFnZUxvYWRlcigpLmxvYWQoZmlsZW5hbWUpOwotCWlmIChkYXRhLmxlbmd0aCA8IDEpIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JSW1hZ2VEYXRhIGkgPSBkYXRhWzBdOwotCXNldEFsbEZpZWxkcygKLQkJaS53aWR0aCwKLQkJaS5oZWlnaHQsCi0JCWkuZGVwdGgsCi0JCWkuc2NhbmxpbmVQYWQsCi0JCWkuYnl0ZXNQZXJMaW5lLAotCQlpLmRhdGEsCi0JCWkucGFsZXR0ZSwKLQkJaS50cmFuc3BhcmVudFBpeGVsLAotCQlpLm1hc2tEYXRhLAotCQlpLm1hc2tQYWQsCi0JCWkuYWxwaGFEYXRhLAotCQlpLmFscGhhLAotCQlpLnR5cGUsCi0JCWkueCwKLQkJaS55LAotCQlpLmRpc3Bvc2FsTWV0aG9kLAotCQlpLmRlbGF5VGltZSk7Ci19Ci0KLS8qKgotICogUHJldmVudHMgdW5pbml0aWFsaXplZCBpbnN0YW5jZXMgZnJvbSBiZWluZyBjcmVhdGVkIG91dHNpZGUgdGhlIHBhY2thZ2UuCi0gKi8KLUltYWdlRGF0YSgpIHsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIGltYWdlIGRhdGEgYnkgZ2l2aW5nIHZhbHVlcyBmb3IgYWxsIG5vbi1jb21wdXRhYmxlIGZpZWxkcy4KLSAqIDxwPgotICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSwgYW5kIGlzIG5vdCBkZXNjcmliZWQgZnVydGhlci4KLSAqIDwvcD4KLSAqLwotSW1hZ2VEYXRhKAotCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlLAotCWludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEsIGludCBtYXNrUGFkLCBieXRlW10gbWFza0RhdGEsCi0JYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhLCBpbnQgdHJhbnNwYXJlbnRQaXhlbCwgaW50IHR5cGUsCi0JaW50IHgsIGludCB5LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpCi17Ci0KLQlpZiAocGFsZXR0ZSA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmICghKGRlcHRoID09IDEgfHwgZGVwdGggPT0gMiB8fCBkZXB0aCA9PSA0IHx8IGRlcHRoID09IDgKLQkJfHwgZGVwdGggPT0gMTYgfHwgZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCWlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCWlmIChzY2FubGluZVBhZCA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci0KLQlpbnQgYnl0ZXNQZXJMaW5lID0gKCgod2lkdGggKiBkZXB0aCArIDcpIC8gOCkgKyAoc2NhbmxpbmVQYWQgLSAxKSkKLQkJLyBzY2FubGluZVBhZCAqIHNjYW5saW5lUGFkOwotCXNldEFsbEZpZWxkcygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXNjYW5saW5lUGFkLAotCQlieXRlc1BlckxpbmUsCi0JCWRhdGEgIT0gbnVsbCA/IGRhdGEgOiBuZXcgYnl0ZVtieXRlc1BlckxpbmUgKiBoZWlnaHRdLAotCQlwYWxldHRlLAotCQl0cmFuc3BhcmVudFBpeGVsLAotCQltYXNrRGF0YSwKLQkJbWFza1BhZCwKLQkJYWxwaGFEYXRhLAotCQlhbHBoYSwKLQkJdHlwZSwKLQkJeCwKLQkJeSwKLQkJZGlzcG9zYWxNZXRob2QsCi0JCWRlbGF5VGltZSk7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZXMgYWxsIGZpZWxkcyBpbiB0aGUgcmVjZWl2ZXIuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkCi0gKiBieSBhbGwgcHVibGljIGNvbnN0cnVjdG9ycyB0byBlbnN1cmUgdGhhdCBhbGwgZmllbGRzIGFyZSBpbml0aWFsaXplZAotICogZm9yIGEgbmV3IEltYWdlRGF0YSBvYmplY3QuIElmIGEgbmV3IGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcywKLSAqIHRoZW4gaXQgbXVzdCBiZSBhZGRlZCB0byB0aGlzIG1ldGhvZC4KLSAqIDxwPgotICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSwgYW5kIGlzIG5vdCBkZXNjcmliZWQgZnVydGhlci4KLSAqIDwvcD4KLSAqLwotdm9pZCBzZXRBbGxGaWVsZHMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBzY2FubGluZVBhZCwKLQlpbnQgYnl0ZXNQZXJMaW5lLCBieXRlW10gZGF0YSwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwgaW50IHRyYW5zcGFyZW50UGl4ZWwsCi0JYnl0ZVtdIG1hc2tEYXRhLCBpbnQgbWFza1BhZCwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhLAotCWludCB0eXBlLCBpbnQgeCwgaW50IHksIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkgewotCi0JdGhpcy53aWR0aCA9IHdpZHRoOwotCXRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotCXRoaXMuZGVwdGggPSBkZXB0aDsKLQl0aGlzLnNjYW5saW5lUGFkID0gc2NhbmxpbmVQYWQ7Ci0JdGhpcy5ieXRlc1BlckxpbmUgPSBieXRlc1BlckxpbmU7Ci0JdGhpcy5kYXRhID0gZGF0YTsKLQl0aGlzLnBhbGV0dGUgPSBwYWxldHRlOwotCXRoaXMudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JdGhpcy5tYXNrRGF0YSA9IG1hc2tEYXRhOwotCXRoaXMubWFza1BhZCA9IG1hc2tQYWQ7Ci0JdGhpcy5hbHBoYURhdGEgPSBhbHBoYURhdGE7Ci0JdGhpcy5hbHBoYSA9IGFscGhhOwotCXRoaXMudHlwZSA9IHR5cGU7Ci0JdGhpcy54ID0geDsKLQl0aGlzLnkgPSB5OwotCXRoaXMuZGlzcG9zYWxNZXRob2QgPSBkaXNwb3NhbE1ldGhvZDsKLQl0aGlzLmRlbGF5VGltZSA9IGRlbGF5VGltZTsKLX0KLQotLyoqCSAKLSAqIEludm9rZXMgaW50ZXJuYWwgU1dUIGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mCi0gKiB0aGlzIGNsYXNzLgotICogPHA+Ci0gKiA8Yj5JTVBPUlRBTlQ6PC9iPiBUaGlzIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgcHVibGljCi0gKiBBUEkgZm9yIDxjb2RlPkltYWdlRGF0YTwvY29kZT4uIEl0IGlzIG1hcmtlZCBwdWJsaWMgb25seSBzbyB0aGF0IGl0Ci0gKiBjYW4gYmUgc2hhcmVkIHdpdGhpbiB0aGUgcGFja2FnZXMgcHJvdmlkZWQgYnkgU1dULiBJdCBpcyBzdWJqZWN0Ci0gKiB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZyb20KLSAqIGFwcGxpY2F0aW9uIGNvZGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UsIGFuZCBpcyBub3QgZGVzY3JpYmVkIGZ1cnRoZXIuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEYXRhIGludGVybmFsX25ldygKLQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwKLQlpbnQgc2NhbmxpbmVQYWQsIGJ5dGVbXSBkYXRhLCBpbnQgbWFza1BhZCwgYnl0ZVtdIG1hc2tEYXRhLAotCWJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYSwgaW50IHRyYW5zcGFyZW50UGl4ZWwsIGludCB0eXBlLAotCWludCB4LCBpbnQgeSwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKQotewotCXJldHVybiBuZXcgSW1hZ2VEYXRhKAotCQl3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwgc2NhbmxpbmVQYWQsIGRhdGEsIG1hc2tQYWQsIG1hc2tEYXRhLAotCQlhbHBoYURhdGEsIGFscGhhLCB0cmFuc3BhcmVudFBpeGVsLCB0eXBlLCB4LCB5LCBkaXNwb3NhbE1ldGhvZCwgZGVsYXlUaW1lKTsKLX0KLQotSW1hZ2VEYXRhIGNvbG9yTWFza0ltYWdlKGludCBwaXhlbCkgewotCUltYWdlRGF0YSBtYXNrID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAxLCBid1BhbGV0dGUoKSwKLQkJMiwgbnVsbCwgMCwgbnVsbCwgbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLQlpbnRbXSByb3cgPSBuZXcgaW50W3dpZHRoXTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWdldFBpeGVscygwLCB5LCB3aWR0aCwgcm93LCAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0JCQlpZiAocGl4ZWwgIT0gLTEgJiYgcm93W2ldID09IHBpeGVsKSB7Ci0JCQkJcm93W2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcm93W2ldID0gMTsKLQkJCX0KLQkJfQotCQltYXNrLnNldFBpeGVscygwLCB5LCB3aWR0aCwgcm93LCAwKTsKLQl9Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBieXRlW10gY2hlY2tEYXRhKGJ5dGUgW10gZGF0YSkgewotCWlmIChkYXRhID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT5nZXRXaWR0aDwvY29kZT4gcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldAotICogPGNvZGU+eDwvY29kZT4gaW4gc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MKLSAqIGRhdGEgc3RhcnRpbmcgYXQgPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIGdldFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGF0YSB0byBnZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIGJ1ZmZlciBpbiB3aGljaCB0byBwdXQgdGhlIHBpeGVscwotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIG9mZnNldCBpbnRvIHRoZSBieXRlIGFycmF5IHRvIGJlZ2luIHN0b3JpbmcgcGl4ZWxzCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGdldFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZ2V0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCAtIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQgb3IgOAotICogICAgICAgIChGb3IgaGlnaGVyIGRlcHRocywgdXNlIHRoZSBpbnRbXSB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLik8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IGdldFdpZHRoLCBieXRlW10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcgotCi0oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrID0gMDsKLQlpbnQgbiA9IGdldFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKCh0aGVCeXRlICYgbWFzaykgPT0gMCkgewotCQkJCXBpeGVsc1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IDE7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQlpbnQgb2Zmc2V0OwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW9mZnNldCA9IDMgLSAoc3JjWCAlIDQpOwotCQkJbWFzayA9IDMgPDwgKG9mZnNldCAqIDIpOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKCh0aGVCeXRlICYgbWFzaykgPj4gKG9mZnNldCAqIDIpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWlmICgoeCAmIDB4MSkgPT0gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlICYgMHgwRik7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKG4gPiAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgPj4gNCk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlICYgMHgwRik7Ci0JCQkJaSsrOwotCQkJCW4tLTsKLQkJCQlzcmNYKys7Ci0JCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQkJc3JjWSsrOwotCQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJCXNyY1ggPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlID4+IDQpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9IGRhdGFbaW5kZXhdOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT5nZXRXaWR0aDwvY29kZT4gcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldAotICogPGNvZGU+eDwvY29kZT4gaW4gc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MKLSAqIGRhdGEgc3RhcnRpbmcgYXQgPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGdldAotICogQHBhcmFtIGdldFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGF0YSB0byBnZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIGJ1ZmZlciBpbiB3aGljaCB0byBwdXQgdGhlIHBpeGVscwotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgdG8gYmVnaW4gc3RvcmluZyBwaXhlbHMKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZ2V0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBnZXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBnZXRXaWR0aCwgaW50W10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcgotCi0oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrOwotCWludCBuID0gZ2V0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHRoZUJ5dGUgJiBtYXNrKSA9PSAwKSB7Ci0JCQkJcGl4ZWxzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gMTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQkJCi0JaWYgKGRlcHRoID09IDIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJaW50IG9mZnNldDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQlvZmZzZXQgPSAzIC0gKHNyY1ggJSA0KTsKLQkJCW1hc2sgPSAzIDw8IChvZmZzZXQgKiAyKTsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSgodGhlQnl0ZSAmIG1hc2spID4+IChvZmZzZXQgKiAyKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlpZiAoKHggJiAweDEpID09IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSB0aGVCeXRlICYgMHgwRjsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQl3aGlsZSAobiA+IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSB0aGVCeXRlID4+IDQ7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgJiAweDBGOwotCQkJCWkrKzsKLQkJCQluLS07Ci0JCQkJc3JjWCsrOwotCQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJCXNyY1krKzsKLQkJCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCQlzcmNYID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSB0aGVCeXRlID4+IDQ7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAyKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSAoKGRhdGFbaW5kZXgrMV0gJiAweEZGKSA8PCA4KSArIChkYXRhW2luZGV4XSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAyOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDI0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAzKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSAoKGRhdGFbaW5kZXhdICYgMHhGRikgPDwgMTYpIHwgKChkYXRhW2luZGV4KzFdICYgMHhGRikgPDwgOCkKLQkJCQl8IChkYXRhW2luZGV4KzJdICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMzIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDQpOwotCQlpID0gc3RhcnRJbmRleDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSAoKGRhdGFbaW5kZXhdICYgMHhGRikgPDwgMjQpIHwgKChkYXRhW2luZGV4KzFdICYgMHhGRikgPDwgMTYpCi0JCQkJfCAoKGRhdGFbaW5kZXgrMl0gJiAweEZGKSA8PCA4KSB8IChkYXRhW2luZGV4KzNdICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIGFycmF5IG9mIDxjb2RlPlJHQjwvY29kZT5zIHdoaWNoIGNvbXByaXNlIHRoZQotICogaW5kZXhlZCBjb2xvciB0YWJsZSBvZiB0aGUgcmVjZWl2ZXIsIG9yIG51bGwgaWYgdGhlIHJlY2VpdmVyCi0gKiBoYXMgYSBkaXJlY3QgY29sb3IgbW9kZWwuCi0gKgotICogQHJldHVybiB0aGUgUkdCIHZhbHVlcyBmb3IgdGhlIGltYWdlIG9yIG51bGwgaWYgZGlyZWN0IGNvbG9yCi0gKgotICogQHNlZSBQYWxldHRlRGF0YSNnZXRSR0JzKCkKLSAqLwotcHVibGljIFJHQltdIGdldFJHQnMoKSB7Ci0JcmV0dXJuIHBhbGV0dGUuZ2V0UkdCcygpOwotfQotCi0vKioKLSAqIFJldHVybnMgYW4gPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiB3aGljaCBzcGVjaWZpZXMgdGhlCi0gKiB0cmFuc3BhcmVuY3kgbWFzayBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlY2VpdmVyLCBvciBudWxsIGlmIHRoZQotICogcmVjZWl2ZXIgaGFzIG5vIHRyYW5zcGFyZW5jeSBhbmQgaXMgbm90IGFuIGljb24uCi0gKgotICogQHJldHVybiB0aGUgdHJhbnNwYXJlbmN5IG1hc2sgb3IgbnVsbCBpZiBub25lIGV4aXN0cwotICovCi1wdWJsaWMgSW1hZ2VEYXRhIGdldFRyYW5zcGFyZW5jeU1hc2soKSB7Ci0JaWYgKGdldFRyYW5zcGFyZW5jeVR5cGUoKSA9PSBTV1QuVFJBTlNQQVJFTkNZX01BU0spIHsKLQkJcmV0dXJuIG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgMSwgYndQYWxldHRlKCksIG1hc2tQYWQsIG1hc2tEYXRhKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gY29sb3JNYXNrSW1hZ2UodHJhbnNwYXJlbnRQaXhlbCk7Ci0JfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGltYWdlIHRyYW5zcGFyZW5jeSB0eXBlLgotICoKLSAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdHJhbnNwYXJlbmN5IHR5cGUKLSAqLwotcHVibGljIGludCBnZXRUcmFuc3BhcmVuY3lUeXBlKCkgewotCWlmIChtYXNrRGF0YSAhPSBudWxsKSByZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9NQVNLOwotCWlmICh0cmFuc3BhcmVudFBpeGVsICE9IC0xKSByZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9QSVhFTDsKLQlpZiAoYWxwaGFEYXRhICE9IG51bGwpIHJldHVybiBTV1QuVFJBTlNQQVJFTkNZX0FMUEhBOwotCXJldHVybiBTV1QuVFJBTlNQQVJFTkNZX05PTkU7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgcmVjZWl2ZXIuCi0gKiAKLSAqIEByZXR1cm4gTVNCX0ZJUlNUIG9yIExTQl9GSVJTVAotICovCi1pbnQgZ2V0Qnl0ZU9yZGVyKCkgewotCXJldHVybiBkZXB0aCAhPSAxNiA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVDsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPng8L2NvZGU+IGluCi0gKiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncyBkYXRhIHRvIHRoZQotICogdmFsdWVzIGZyb20gdGhlIGFycmF5IDxjb2RlPnBpeGVsczwvY29kZT4gc3RhcnRpbmcgYXQKLSAqIDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSBwdXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiBzZXR0aW5nCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHB1dFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgcHV0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0LCA4Ci0gKiAgICAgICAgKEZvciBoaWdoZXIgZGVwdGhzLCB1c2UgdGhlIGludFtdIHZlcnNpb24gb2YgdGhpcyBtZXRob2QuKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgcHV0V2lkdGgsIGJ5dGVbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzazsKLQlpbnQgbiA9IHB1dFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKChwaXhlbHNbaV0gJiAweDEpID09IDEpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSB8IG1hc2spOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSAmIChtYXNrIF4gLTEpKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWJ5dGUgW10gbWFza3MgPSB7IChieXRlKTB4RkMsIChieXRlKTB4RjMsIChieXRlKTB4Q0YsIChieXRlKTB4M0YgfTsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJaW50IG9mZnNldCA9IDMgLSAoeCAlIDQpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDM7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiBtYXNrc1tvZmZzZXRdKSB8ICh0aGVCeXRlIDw8IChvZmZzZXQgKiAyKSkpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCW9mZnNldCA9IDA7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQlvZmZzZXQgPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9mZnNldC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWJvb2xlYW4gaGlnaCA9ICh4ICYgMHgxKSA9PSAwOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDBGOwotCQkJaWYgKGhpZ2gpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweDBGKSB8ICh0aGVCeXRlIDw8IDQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGMCkgfCB0aGVCeXRlKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQloaWdoID0gdHJ1ZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFoaWdoKSBpbmRleCsrOwotCQkJCWhpZ2ggPSAhaGlnaDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKShwaXhlbHNbaV0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+eDwvY29kZT4gaW4KLSAqIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzIGRhdGEgdG8gdGhlCi0gKiB2YWx1ZXMgZnJvbSB0aGUgYXJyYXkgPGNvZGU+cGl4ZWxzPC9jb2RlPiBzdGFydGluZyBhdAotICogPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHB1dFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHNldHRpbmcKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcHV0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBwdXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgcHV0V2lkdGgsIGludFtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrOwotCWludCBuID0gcHV0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBwaXhlbDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKChwaXhlbHNbaV0gJiAweDEpID09IDEpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSB8IG1hc2spOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEZGKSAmIChtYXNrIF4gLTEpKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWJ5dGUgW10gbWFza3MgPSB7IChieXRlKTB4RkMsIChieXRlKTB4RjMsIChieXRlKTB4Q0YsIChieXRlKTB4M0YgfTsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJaW50IG9mZnNldCA9IDMgLSAoeCAlIDQpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDM7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiBtYXNrc1tvZmZzZXRdKSB8ICh0aGVCeXRlIDw8IChvZmZzZXQgKiAyKSkpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCW9mZnNldCA9IDM7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQlvZmZzZXQgPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9mZnNldC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWJvb2xlYW4gaGlnaCA9ICh4ICYgMHgxKSA9PSAwOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBwaXhlbHNbaV0gJiAweDBGOwotCQkJaWYgKGhpZ2gpIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweDBGKSB8ICh0aGVCeXRlIDw8IDQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGMCkgfCB0aGVCeXRlKTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQloaWdoID0gdHJ1ZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFoaWdoKSBpbmRleCsrOwotCQkJCWhpZ2ggPSAhaGlnaDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKShwaXhlbHNbaV0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0KLQl9Ci0JaWYgKGRlcHRoID09IDE2KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAyKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbCA9IHBpeGVsc1tpXTsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKHBpeGVsICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMV0gPSAoYnl0ZSkoKHBpeGVsID4+IDgpICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMjQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDMpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsID0gcGl4ZWxzW2ldOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKHBpeGVsID4+IDE2KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDFdID0gKGJ5dGUpKChwaXhlbCA+PiA4KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDJdID0gKGJ5dGUpKHBpeGVsICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMzIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDQpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsID0gcGl4ZWxzW2ldOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKHBpeGVsID4+IDI0KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDFdID0gKGJ5dGUpKChwaXhlbCA+PiAxNikgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAyXSA9IChieXRlKSgocGl4ZWwgPj4gOCkgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAzXSA9IChieXRlKShwaXhlbCAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSA0OwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIHBhbGV0dGUgd2l0aCAyIGNvbG9yczogYmxhY2sgJiB3aGl0ZS4KLSAqLwotc3RhdGljIFBhbGV0dGVEYXRhIGJ3UGFsZXR0ZSgpIHsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pOwotfQotCi0vKioKLSAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgZm9yCi0gKiB0aGUgZ2l2ZW4gbWFzay4KLSAqLwotc3RhdGljIGludCBnZXRNU0JPZmZzZXQoaW50IG1hc2spIHsKLQlmb3IgKGludCBpID0gMzE7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmICgoKG1hc2sgPj4gaSkgJiAweDEpICE9IDApIHJldHVybiBpICsgMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2guCi0gKi8KLXN0YXRpYyBpbnQgY2xvc2VzdE1hdGNoKGludCBkZXB0aCwgYnl0ZSByZWQsIGJ5dGUgZ3JlZW4sIGJ5dGUgYmx1ZSwgaW50IHJlZE1hc2ssIGludCBncmVlbk1hc2ssIGludCBibHVlTWFzaywgYnl0ZVtdIHJlZHMsIGJ5dGVbXSBncmVlbnMsIGJ5dGVbXSBibHVlcykgewotCWlmIChkZXB0aCA+IDgpIHsKLQkJaW50IHJzaGlmdCA9IDMyIC0gZ2V0TVNCT2Zmc2V0KHJlZE1hc2spOwotCQlpbnQgZ3NoaWZ0ID0gMzIgLSBnZXRNU0JPZmZzZXQoZ3JlZW5NYXNrKTsKLQkJaW50IGJzaGlmdCA9IDMyIC0gZ2V0TVNCT2Zmc2V0KGJsdWVNYXNrKTsKLQkJcmV0dXJuICgoKHJlZCA8PCAyNCkgPj4+IHJzaGlmdCkgJiByZWRNYXNrKSB8Ci0JCQkoKChncmVlbiA8PCAyNCkgPj4+IGdzaGlmdCkgJiBncmVlbk1hc2spIHwKLQkJCSgoKGJsdWUgPDwgMjQpID4+PiBic2hpZnQpICYgYmx1ZU1hc2spOwotCX0KLQlpbnQgciwgZywgYjsKLQlpbnQgbWluRGlzdGFuY2UgPSAweDdmZmZmZmZmOwotCWludCBuZWFyZXN0UGl4ZWwgPSAwOwotCWludCBuID0gcmVkcy5sZW5ndGg7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLQkJciA9IChyZWRzW2pdICYgMHhGRikgLSAocmVkICYgMHhGRik7Ci0JCWcgPSAoZ3JlZW5zW2pdICYgMHhGRikgLSAoZ3JlZW4gJiAweEZGKTsKLQkJYiA9IChibHVlc1tqXSAmIDB4RkYpIC0gKGJsdWUgJiAweEZGKTsKLQkJaW50IGRpc3RhbmNlID0gcipyICsgZypnICsgYipiOwotCQlpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkgewotCQkJbmVhcmVzdFBpeGVsID0gajsKLQkJCWlmIChkaXN0YW5jZSA9PSAwKSBicmVhazsKLQkJCW1pbkRpc3RhbmNlID0gZGlzdGFuY2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5lYXJlc3RQaXhlbDsKLX0KLQotc3RhdGljIGZpbmFsIEltYWdlRGF0YSBjb252ZXJ0TWFzayhJbWFnZURhdGEgbWFzaykgewotCWlmIChtYXNrLmRlcHRoID09IDEpIHJldHVybiBtYXNrOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwyNTUsMjU1KX0pOwotCUltYWdlRGF0YSBuZXdNYXNrID0gbmV3IEltYWdlRGF0YShtYXNrLndpZHRoLCBtYXNrLmhlaWdodCwgMSwgcGFsZXR0ZSk7Ci0JLyogRmluZCBpbmRleCBvZiBibGFjayBpbiBtYXNrIHBhbGV0dGUgKi8KLQlpbnQgYmxhY2tJbmRleCA9IDA7Ci0JUkdCW10gcmdicyA9IG1hc2suZ2V0UkdCcygpOwotCWlmIChyZ2JzICE9IG51bGwpIHsKLQkJd2hpbGUgKGJsYWNrSW5kZXggPCByZ2JzLmxlbmd0aCkgewotCQkJaWYgKHJnYnNbYmxhY2tJbmRleF0uZXF1YWxzKHBhbGV0dGUuY29sb3JzWzBdKSkgYnJlYWs7Ci0JCQlibGFja0luZGV4Kys7Ci0JCX0KLQl9Ci0JaW50W10gcGl4ZWxzID0gbmV3IGludFttYXNrLndpZHRoXTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IG1hc2suaGVpZ2h0OyB5KyspIHsKLQkJbWFzay5nZXRQaXhlbHMoMCwgeSwgbWFzay53aWR0aCwgcGl4ZWxzLCAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwaXhlbHNbaV0gPT0gYmxhY2tJbmRleCkgewotCQkJCXBpeGVsc1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IDE7Ci0JCQl9Ci0JCX0KLQkJbmV3TWFzay5zZXRQaXhlbHMoMCwgeSwgbWFzay53aWR0aCwgcGl4ZWxzLCAwKTsKLQl9Ci0JcmV0dXJuIG5ld01hc2s7Ci19Ci0KLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsJCi0JaW50IG5ld0JwbCA9IChzdHJpZGUgKyAobmV3UGFkIC0gMSkpIC8gbmV3UGFkICogbmV3UGFkOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbaGVpZ2h0ICogbmV3QnBsXTsKLQlpbnQgc3JjSW5kZXggPSAwLCBkZXN0SW5kZXggPSAwOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBzdHJpZGUpOwotCQlzcmNJbmRleCArPSBicGw7Ci0JCWRlc3RJbmRleCArPSBuZXdCcGw7Ci0JfQotCXJldHVybiBuZXdEYXRhOwotfQotCi0vKioKLSAqIEJsaXQgb3BlcmF0aW9uIGJpdHMgdG8gYmUgT1InZWQgdG9nZXRoZXIgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBmaW5hbCBpbnQKLQlCTElUX1NSQyA9IDEsICAgICAvLyBjb3B5IHNvdXJjZSBkaXJlY3RseSwgZWxzZSBhcHBsaWVzIGxvZ2ljIG9wZXJhdGlvbnMKLQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQlCTElUX0RJVEhFUiA9IDQ7ICAvLyBlbmFibGUgZGl0aGVyaW5nIGluIGxvdyBjb2xvciBtb2RlcwotCi0vKioKLSAqIEFscGhhIG1vZGUsIHZhbHVlcyAwIC0gMjU1IHNwZWNpZnkgZ2xvYmFsIGFscGhhIGxldmVsCi0gKi8KLXN0YXRpYyBmaW5hbCBpbnQKLQlBTFBIQV9PUEFRVUUgPSAyNTUsICAgICAgICAgICAvLyBGdWxseSBvcGFxdWUgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JQUxQSEFfQ0hBTk5FTF9TRVBBUkFURSA9IC0xLCAgLy8gVXNlIGFscGhhIGNoYW5uZWwgZnJvbSBzZXBhcmF0ZSBhbHBoYURhdGEKLQlBTFBIQV9DSEFOTkVMX1NPVVJDRSA9IC0yLCAgICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBlbWJlZGRlZCBpbiBzb3VyY2VEYXRhCi0JQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQlBTFBIQV9NQVNLX1BBQ0tFRCA9IC00LCAgICAgICAvLyBVc2UgdHJhbnNwYXJlbmN5IG1hc2sgZm9ybWVkIGJ5IHBhY2tlZCBiaXRzIGluIGFscGhhRGF0YQotCUFMUEhBX01BU0tfSU5ERVggPSAtNSwgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBwYWxldHRlIGluZGljZXMgdHJhbnNwYXJlbnQgaWYgaW4gYWxwaGFEYXRhIGFycmF5Ci0JQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQotLyoqCi0gKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotICovCi1zdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDA7Ci1zdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0KLS8qKgotICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0gKi8KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCVRZUEVfR0VORVJJQ184ID0gMCwKLQlUWVBFX0dFTkVSSUNfMTZfTVNCID0gMSwKLQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQlUWVBFX0dFTkVSSUNfMjQgPSAzLAotCVRZUEVfR0VORVJJQ18zMl9NU0IgPSA0LAotCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCS8vIHBhbGV0dGUgaW5kZXhlZCBjb2xvciBmb3JtYXRzCi0JVFlQRV9JTkRFWF84ID0gNiwKLQlUWVBFX0lOREVYXzQgPSA3LAotCVRZUEVfSU5ERVhfMiA9IDgsCi0JVFlQRV9JTkRFWF8xX01TQiA9IDksCi0JVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotCi0vKioKLSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHNoaWZ0IGZyb20gYSBtYXNrLgotICovCi1zdGF0aWMgaW50IGdldENoYW5uZWxTaGlmdChpbnQgbWFzaykgewotCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCWludCBpOwotCWZvciAoaSA9IDA7ICgobWFzayAmIDEpID09IDApICYmIChpIDwgMzIpOyArK2kpIHsKLQkJbWFzayA+Pj49IDE7Ci0JfQotCXJldHVybiBpOwotfQotCi0vKioKLSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHdpZHRoIChkZXB0aCkgZnJvbSBhIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFdpZHRoKGludCBtYXNrLCBpbnQgc2hpZnQpIHsKLQlpZiAobWFzayA9PSAwKSByZXR1cm4gMDsKLQlpbnQgaTsKLQltYXNrID4+Pj0gc2hpZnQ7Ci0JZm9yIChpID0gc2hpZnQ7ICgobWFzayAmIDEpICE9IDApICYmIChpIDwgMzIpOyArK2kpIHsKLQkJbWFzayA+Pj49IDE7Ci0JfQotCXJldHVybiBpIC0gc2hpZnQ7Ci19Ci0KLS8qKgotICogRXh0cmFjdHMgYSBmaWVsZCBmcm9tIHBhY2tlZCBSR0IgZGF0YSBnaXZlbiBhIG1hc2sgZm9yIHRoYXQgZmllbGQuCi0gKi8KLXN0YXRpYyBieXRlIGdldENoYW5uZWxGaWVsZChpbnQgZGF0YSwgaW50IG1hc2spIHsKLQlmaW5hbCBpbnQgc2hpZnQgPSBnZXRDaGFubmVsU2hpZnQobWFzayk7Ci0JcmV0dXJuIEFOWV9UT19FSUdIVFtnZXRDaGFubmVsV2lkdGgobWFzaywgc2hpZnQpXVsoZGF0YSAmIG1hc2spID4+PiBzaGlmdF07Ci19Ci0KLS8qIAotICogRmlsbCBpbiBkaXRoZXJlZCBncmFkYXRlZCB2YWx1ZXMgZm9yIGEgY29sb3IgY2hhbm5lbAotICovCi1zdGF0aWMgZmluYWwgdm9pZCBidWlsZERpdGhlcmVkR3JhZGllbnRDaGFubmVsKGludCBmcm9tLCBpbnQgdG8sIGludCBzdGVwcywKLQlpbnQgYmFuZFdpZHRoLCBpbnQgYmFuZEhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbCwKLQlieXRlW10gYml0bWFwRGF0YSwgaW50IGRwLCBpbnQgYnl0ZXNQZXJMaW5lLCBpbnQgYml0cykgewotCWZpbmFsIGludCBtYXNrID0gMHhmZjAwID4+PiBiaXRzOwotCWludCB2YWwgPSBmcm9tIDw8IDE2OwotCWZpbmFsIGludCBpbmMgPSAoKHRvIDw8IDE2KSAtIHZhbCkgLyBzdGVwcyArIDE7Ci0JaWYgKHZlcnRpY2FsKSB7Ci0JCWZvciAoaW50IGR5ID0gMDsgZHkgPCBiYW5kSGVpZ2h0OyArK2R5LCBkcCArPSBieXRlc1BlckxpbmUpIHsKLQkJCWZvciAoaW50IGR4ID0gMCwgZHB0ciA9IGRwOyBkeCA8IGJhbmRXaWR0aDsgKytkeCwgZHB0ciArPSA0KSB7Ci0JCQkJZmluYWwgaW50IHRocmVzaCA9IERJVEhFUl9NQVRSSVhbZHkgJiA3XVtkeF0gPj4+IGJpdHM7Ci0JCQkJaW50IHRlbXAgPSB2YWwgKyB0aHJlc2g7Ci0JCQkJaWYgKHRlbXAgPiAweGZmZmZmZikgYml0bWFwRGF0YVtkcHRyXSA9IC0xOwotCQkJCWVsc2UgYml0bWFwRGF0YVtkcHRyXSA9IChieXRlKSgodGVtcCA+Pj4gMTYpICYgbWFzayk7Ci0JCQl9Ci0JCQl2YWwgKz0gaW5jOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpbnQgZHggPSAwOyBkeCA8IGJhbmRXaWR0aDsgKytkeCwgZHAgKz0gNCkgewotCQkJZm9yIChpbnQgZHkgPSAwLCBkcHRyID0gZHA7IGR5IDwgYmFuZEhlaWdodDsgKytkeSwgZHB0ciArPSBieXRlc1BlckxpbmUpIHsKLQkJCQlmaW5hbCBpbnQgdGhyZXNoID0gRElUSEVSX01BVFJJWFtkeV1bZHggJiA3XSA+Pj4gYml0czsKLQkJCQlpbnQgdGVtcCA9IHZhbCArIHRocmVzaDsKLQkJCQlpZiAodGVtcCA+IDB4ZmZmZmZmKSBiaXRtYXBEYXRhW2RwdHJdID0gLTE7Ci0JCQkJZWxzZSBiaXRtYXBEYXRhW2RwdHJdID0gKGJ5dGUpKCh0ZW1wID4+PiAxNikgJiBtYXNrKTsKLQkJCX0KLQkJCXZhbCArPSBpbmM7Ci0JCX0KLQl9Ci19Ci19Ci0KLXN0YXRpYyBjbGFzcyBMRURhdGFJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQlpbnQgcG9zaXRpb247Ci0JSW5wdXRTdHJlYW0gaW47Ci0KLQkvKioKLQkgKiBUaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBieXRlcyB0byByZWFkLgotCSAqLwotCXByb3RlY3RlZCBieXRlW10gYnVmOwotCQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgYnl0ZSBhcnJheSA8Y29kZT5idWY8L2NvZGU+LiBBIHZhbHVlCi0JICogZXF1YWwgdG8gYnVmLmxlbmd0aCBpbmRpY2F0ZXMgbm8gYnl0ZXMgYXZhaWxhYmxlLiAgQSB2YWx1ZSBvZgotCSAqIDAgaW5kaWNhdGVzIHRoZSBidWZmZXIgaXMgZnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHBvczsKLQkKLQotCXB1YmxpYyBMRURhdGFJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCkgewotCQl0aGlzKGlucHV0LCA1MTIpOwotCX0KLQkKLQlwdWJsaWMgTEVEYXRhSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXQsIGludCBidWZmZXJTaXplKSB7Ci0JCXRoaXMuaW4gPSBpbnB1dDsKLQkJaWYgKGJ1ZmZlclNpemUgPiAwKSB7Ci0JCQlidWYgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLQkJCXBvcyA9IGJ1ZmZlclNpemU7Ci0JCX0gCi0JCWVsc2UgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ1ZiA9IG51bGw7Ci0JCWlmIChpbiAhPSBudWxsKSB7Ci0JCQlpbi5jbG9zZSgpOwotCQkJaW4gPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQuCi0JICovCi0JcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBvc2l0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXJzIGhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgd2l0aG91dCBibG9ja2luZwotCSAqLwotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZiA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJcmV0dXJuIChidWYubGVuZ3RoIC0gcG9zKSArIGluLmF2YWlsYWJsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5leHQgYnl0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChidWYgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCXBvc2l0aW9uKys7Ci0JCWlmIChwb3MgPCBidWYubGVuZ3RoKSByZXR1cm4gKGJ1Zltwb3MrK10gJiAweEZGKTsKLQkJcmV0dXJuIGluLnJlYWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogRG9uJ3QgaW1pdGF0ZSB0aGUgSkRLIGJlaGF2aW91ciBvZiByZWFkaW5nIGEgcmFuZG9tIG51bWJlcgotCSAqIG9mIGJ5dGVzIHdoZW4geW91IGNhbiBhY3R1YWxseSByZWFkIHRoZW0gYWxsLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdDsKLQkJaW50IGxlZnQgPSBsZW47Ci0JCXJlc3VsdCA9IHJlYWREYXRhKGIsIG9mZiwgbGVuKTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZXN1bHQgPT0gLTEpIHJldHVybiAtMTsKLQkJCXBvc2l0aW9uICs9IHJlc3VsdDsKLQkJCWlmIChyZXN1bHQgPT0gbGVmdCkgcmV0dXJuIGxlbjsKLQkJCWxlZnQgLT0gcmVzdWx0OwotCQkJb2ZmICs9IHJlc3VsdDsKLQkJCXJlc3VsdCA9IHJlYWREYXRhKGIsIG9mZiwgbGVmdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0gCSAqIFJlYWRzIGF0IG1vc3QgPGNvZGU+bGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoaXMgTEVEYXRhSW5wdXRTdHJlYW0gYW5kIAotIAkgKiBzdG9yZXMgdGhlbSBpbiBieXRlIGFycmF5IDxjb2RlPmJ1ZmZlcjwvY29kZT4gc3RhcnRpbmcgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPi4KLSAJICogPHA+Ci0gCSAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgbm8gYnl0ZXMgd2VyZSByZWFkIGFuZCAKLSAJICogZW5kIG9mIHN0cmVhbSB3YXMgZW5jb3VudGVyZWQuICBUaGlzIGltcGxlbWVudGF0aW9uIHJlYWRzIGJ5dGVzIGZyb20gCi0gCSAqIHRoZSBwdXNoYmFjayBidWZmZXIgZmlyc3QsIHRoZW4gdGhlIHRhcmdldCBzdHJlYW0gaWYgbW9yZSBieXRlcyBhcmUgcmVxdWlyZWQKLSAJICogdG8gc2F0aXNmeSA8Y29kZT5jb3VudDwvY29kZT4uCi0JICogPC9wPgotCSAqIEBwYXJhbSBidWZmZXIgdGhlIGJ5dGUgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4gdG8gc3RvcmUgdGhlIHJlYWQgYnl0ZXMuCi0JICogQHBhcmFtIGxlbmd0aCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtLgotCSAqCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KLQkgKi8KLQlwcml2YXRlIGludCByZWFkRGF0YShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoIHx8Ci0gIAkJIAlsZW5ndGggPCAwIHx8IChsZW5ndGggPiBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0KSkgewotCSAJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJIAl9Ci0JCQkJCi0JCWludCBjYWNoZUNvcGllZCA9IDA7Ci0JCWludCBuZXdPZmZzZXQgPSBvZmZzZXQ7Ci0JCi0JCS8vIEFyZSB0aGVyZSBwdXNoYmFjayBieXRlcyBhdmFpbGFibGU/Ci0JCWludCBhdmFpbGFibGUgPSBidWYubGVuZ3RoIC0gcG9zOwotCQlpZiAoYXZhaWxhYmxlID4gMCkgewotCQkJY2FjaGVDb3BpZWQgPSAoYXZhaWxhYmxlID49IGxlbmd0aCkgPyBsZW5ndGggOiBhdmFpbGFibGU7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgcG9zLCBidWZmZXIsIG5ld09mZnNldCwgY2FjaGVDb3BpZWQpOwotCQkJbmV3T2Zmc2V0ICs9IGNhY2hlQ29waWVkOwotCQkJcG9zICs9IGNhY2hlQ29waWVkOwotCQl9Ci0JCi0JCS8vIEhhdmUgd2UgY29waWVkIGVub3VnaD8KLQkJaWYgKGNhY2hlQ29waWVkID09IGxlbmd0aCkgcmV0dXJuIGxlbmd0aDsKLQotCQlpbnQgaW5Db3BpZWQgPSBpbi5yZWFkKGJ1ZmZlciwgbmV3T2Zmc2V0LCBsZW5ndGggLSBjYWNoZUNvcGllZCk7Ci0KLQkJaWYgKGluQ29waWVkID4gMCkgcmV0dXJuIGluQ29waWVkICsgY2FjaGVDb3BpZWQ7Ci0JCWlmIChjYWNoZUNvcGllZCA9PSAwKSByZXR1cm4gaW5Db3BpZWQ7Ci0JCXJldHVybiBjYWNoZUNvcGllZDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFuIGludGVnZXIgY29tcHJpc2VkIG9mIHRoZSBuZXh0Ci0JICogZm91ciBieXRlcyBvZiB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0XTsKLQkJcmVhZChidWYpOwotCQlyZXR1cm4gKCgoKCgoYnVmWzNdICYgMHhGRikgPDwgOCkgfCAKLQkJCShidWZbMl0gJiAweEZGKSkgPDwgOCkgfCAKLQkJCShidWZbMV0gJiAweEZGKSkgPDwgOCkgfCAKLQkJCShidWZbMF0gJiAweEZGKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgc2hvcnQgY29tcHJpc2VkIG9mIHRoZSBuZXh0Ci0JICogdHdvIGJ5dGVzIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHNob3J0IHJlYWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyXTsKLQkJcmVhZChidWYpOwotCQlyZXR1cm4gKHNob3J0KSgoKGJ1ZlsxXSAmIDB4RkYpIDw8IDgpIHwgKGJ1ZlswXSAmIDB4RkYpKTsKLQl9Ci0JCi0JLyoqCi0JICogUHVzaCBiYWNrIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgZ2l2ZW4gYnVmZmVyIDxjb2RlPmI8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSBieXRlcyBhcmUgcHVzaGVkIHNvIHRoYXQgdGhleSB3b3VsZCBiZSByZWFkIGJhY2sgYlswXSwgYlsxXSwgZXRjLiAKLQkgKiBJZiB0aGUgcHVzaCBiYWNrIGJ1ZmZlciBjYW5ub3QgaGFuZGxlIHRoZSBieXRlcyBjb3BpZWQgZnJvbSA8Y29kZT5iPC9jb2RlPiwgCi0JICogYW4gSU9FeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gYW5kIG5vIGJ5dGUgd2lsbCBiZSBwdXNoZWQgYmFjay4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBieXRlcyB0byBwdXNoIGJhY2sgaW50byB0aGUgc3RyZWFtCi0JICoKLQkgKiBAZXhjZXB0aW9uIAlqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZSBwdXNoYmFjayBidWZmZXIgaXMgdG9vIHNtYWxsCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gYi5sZW5ndGg7Ci0JCWlmIChsZW5ndGggPiBwb3MpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlwb3NpdGlvbiAtPSBsZW5ndGg7Ci0JCXBvcyAtPSBsZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYnVmLCBwb3MsIGxlbmd0aCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaWxlRm9ybWF0IHsJCi0JTEVEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyOwotCWludCBjb21wcmVzc2lvbjsKLQotYnl0ZVtdIGJpdEludmVydERhdGEoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkvLyBEZXN0cnVjdGl2ZWx5IGJpdCBpbnZlcnQgZGF0YSBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KLQlmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHsKLQkJZGF0YVtpXSA9IChieXRlKSgyNTUgLSBkYXRhW2kgLSBzdGFydEluZGV4XSk7Ci0JfQotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbQotICogcmVwcmVzZW50cyBhIHN1cHBvcnRlZCBmaWxlIGZvcm1hdC4KLSAqLwotYWJzdHJhY3QgYm9vbGVhbiBpc0ZpbGVGb3JtYXQoTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKTsKLQotYWJzdHJhY3QgSW1hZ2VEYXRhW10gbG9hZEZyb21CeXRlU3RyZWFtKCk7Ci0KLXB1YmxpYyBJbWFnZURhdGFbXSBsb2FkRnJvbVN0cmVhbShMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQl0cnkgewotCQlpbnB1dFN0cmVhbSA9IHN0cmVhbTsKLQkJcmV0dXJuIGxvYWRGcm9tQnl0ZVN0cmVhbSgpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEYXRhW10gbG9hZChJbnB1dFN0cmVhbSBpcywgSW1hZ2VMb2FkZXIgbG9hZGVyKSB7Ci0JTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IExFRGF0YUlucHV0U3RyZWFtKGlzKTsKLQlib29sZWFuIGlzU3VwcG9ydGVkID0gZmFsc2U7CQotCUZpbGVGb3JtYXQgZmlsZUZvcm1hdCA9IG5ldyBXaW5JQ09GaWxlRm9ybWF0KCk7Ci0JaWYgKGZpbGVGb3JtYXQuaXNGaWxlRm9ybWF0KHN0cmVhbSkpIGlzU3VwcG9ydGVkID0gdHJ1ZTsKLQllbHNlIHsKLQkJZmlsZUZvcm1hdCA9IG5ldyBXaW5CTVBGaWxlRm9ybWF0KCk7Ci0JCWlmIChmaWxlRm9ybWF0LmlzRmlsZUZvcm1hdChzdHJlYW0pKSBpc1N1cHBvcnRlZCA9IHRydWU7Ci0JfQotCWlmICghaXNTdXBwb3J0ZWQpIFNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfRk9STUFUKTsKLQlmaWxlRm9ybWF0LmxvYWRlciA9IGxvYWRlcjsKLQlyZXR1cm4gZmlsZUZvcm1hdC5sb2FkRnJvbVN0cmVhbShzdHJlYW0pOwotfQotfQotc3RhdGljIGNsYXNzIFdpbkJNUEZpbGVGb3JtYXQgZXh0ZW5kcyBGaWxlRm9ybWF0IHsKLQlzdGF0aWMgZmluYWwgaW50IEJNUEZpbGVIZWFkZXJTaXplID0gMTQ7Ci0Jc3RhdGljIGZpbmFsIGludCBCTVBIZWFkZXJGaXhlZFNpemUgPSA0MDsKLQlpbnQgaW1wb3J0YW50Q29sb3JzOwotCi12b2lkIGRlY29tcHJlc3NEYXRhKGJ5dGVbXSBzcmMsIGJ5dGVbXSBkZXN0LCBpbnQgc3RyaWRlLCBpbnQgY21wKSB7Ci0JaWYgKGNtcCA9PSAxKSB7IC8vIEJNUF9STEU4X0NPTVBSRVNTSU9OCi0JCWlmIChkZWNvbXByZXNzUkxFOERhdGEoc3JjLCBzcmMubGVuZ3RoLCBzdHJpZGUsIGRlc3QsIGRlc3QubGVuZ3RoKSA8PSAwKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY21wID09IDIpIHsgLy8gQk1QX1JMRTRfQ09NUFJFU1NJT04KLQkJaWYgKGRlY29tcHJlc3NSTEU0RGF0YShzcmMsIHNyYy5sZW5ndGgsIHN0cmlkZSwgZGVzdCwgZGVzdC5sZW5ndGgpIDw9IDApCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci19Ci1pbnQgZGVjb21wcmVzc1JMRTREYXRhKGJ5dGVbXSBzcmMsIGludCBudW1CeXRlcywgaW50IHN0cmlkZSwgYnl0ZVtdIGRlc3QsIGludCBkZXN0U2l6ZSkgewotCWludCBzcCA9IDA7Ci0JaW50IHNlID0gbnVtQnl0ZXM7Ci0JaW50IGRwID0gMDsKLQlpbnQgZGUgPSBkZXN0U2l6ZTsKLQlpbnQgeCA9IDAsIHkgPSAwOwotCXdoaWxlIChzcCA8IHNlKSB7Ci0JCWludCBsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJc3ArKzsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJCXNwKys7Ci0JCQlzd2l0Y2ggKGxlbikgewotCQkJCWNhc2UgMDogLyogZW5kIG9mIGxpbmUgKi8KLQkJCQkJeSsrOwotCQkJCQl4ID0gMDsKLQkJCQkJZHAgPSB5ICogc3RyaWRlOwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTogLyogZW5kIG9mIGJpdG1hcCAqLwotCQkJCQlyZXR1cm4gMTsKLQkJCQljYXNlIDI6IC8qIGRlbHRhICovCi0JCQkJCXggKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCXkgKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCWRwID0geSAqIHN0cmlkZSArIHggLyAyOwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6IC8qIGFic29sdXRlIG1vZGUgcnVuICovCi0JCQkJCWlmICgobGVuICYgMSkgIT0gMCkgLyogb2RkIHJ1biBsZW5ndGhzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkICovCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCXggKz0gbGVuOwotCQkJCQlsZW4gPSBsZW4gLyAyOwotCQkJCQlpZiAobGVuID4gKHNlIC0gc3ApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCQlkZXN0W2RwXSA9IHNyY1tzcF07Ci0JCQkJCQlkcCsrOwotCQkJCQkJc3ArKzsKLQkJCQkJfQotCQkJCQlpZiAoKHNwICYgMSkgIT0gMCkKLQkJCQkJCXNwKys7IC8qIHdvcmQgYWxpZ24gc3A/ICovCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChsZW4gJiAxKSAhPSAwKQotCQkJCXJldHVybiAtMTsKLQkJCXggKz0gbGVuOwotCQkJbGVuID0gbGVuIC8gMjsKLQkJCWJ5dGUgdGhlQnl0ZSA9IHNyY1tzcF07Ci0JCQlzcCsrOwotCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZGVzdFtkcF0gPSB0aGVCeXRlOwotCQkJCWRwKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci1pbnQgZGVjb21wcmVzc1JMRThEYXRhKGJ5dGVbXSBzcmMsIGludCBudW1CeXRlcywgaW50IHN0cmlkZSwgYnl0ZVtdIGRlc3QsIGludCBkZXN0U2l6ZSkgewotCWludCBzcCA9IDA7Ci0JaW50IHNlID0gbnVtQnl0ZXM7Ci0JaW50IGRwID0gMDsKLQlpbnQgZGUgPSBkZXN0U2l6ZTsKLQlpbnQgeCA9IDAsIHkgPSAwOwotCXdoaWxlIChzcCA8IHNlKSB7Ci0JCWludCBsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJc3ArKzsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlsZW4gPSBzcmNbc3BdICYgMHhGRjsKLQkJCXNwKys7Ci0JCQlzd2l0Y2ggKGxlbikgewotCQkJCWNhc2UgMDogLyogZW5kIG9mIGxpbmUgKi8KLQkJCQkJeSsrOwotCQkJCQl4ID0gMDsKLQkJCQkJZHAgPSB5ICogc3RyaWRlOwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTogLyogZW5kIG9mIGJpdG1hcCAqLwotCQkJCQlyZXR1cm4gMTsKLQkJCQljYXNlIDI6IC8qIGRlbHRhICovCi0JCQkJCXggKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCXkgKz0gc3JjW3NwXSAmIDB4RkY7Ci0JCQkJCXNwKys7Ci0JCQkJCWRwID0geSAqIHN0cmlkZSArIHg7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDogLyogYWJzb2x1dGUgbW9kZSBydW4gKi8KLQkJCQkJaWYgKGxlbiA+IChzZSAtIHNwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCQkJZGVzdFtkcF0gPSBzcmNbc3BdOwotCQkJCQkJZHArKzsKLQkJCQkJCXNwKys7Ci0JCQkJCX0KLQkJCQkJaWYgKChzcCAmIDEpICE9IDApCi0JCQkJCQlzcCsrOyAvKiB3b3JkIGFsaWduIHNwPyAqLwotCQkJCQl4ICs9IGxlbjsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlieXRlIHRoZUJ5dGUgPSBzcmNbc3BdOwotCQkJc3ArKzsKLQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWRlc3RbZHBdID0gdGhlQnl0ZTsKLQkJCQlkcCsrOwotCQkJfQotCQkJeCArPSBsZW47Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci1ib29sZWFuIGlzRmlsZUZvcm1hdChMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQl0cnkgewotCQlieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbMThdOwotCQlzdHJlYW0ucmVhZChoZWFkZXIpOwotCQlzdHJlYW0udW5yZWFkKGhlYWRlcik7Ci0JCWludCBpbmZvSGVhZGVyU2l6ZSA9IChoZWFkZXJbMTRdICYgMHhGRikgfCAoKGhlYWRlclsxNV0gJiAweEZGKSA8PCA4KSB8ICgoaGVhZGVyWzE2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaGVhZGVyWzE3XSAmIDB4RkYpIDw8IDI0KTsKLQkJcmV0dXJuIGhlYWRlclswXSA9PSAweDQyICYmIGhlYWRlclsxXSA9PSAweDREICYmIGluZm9IZWFkZXJTaXplID49IEJNUEhlYWRlckZpeGVkU2l6ZTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotYnl0ZVtdIGxvYWREYXRhKGJ5dGVbXSBpbmZvSGVhZGVyKSB7Ci0JaW50IHdpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgYml0Q291bnQgPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogYml0Q291bnQgKyA3KSAvIDg7Ci0Jc3RyaWRlID0gKHN0cmlkZSArIDMpIC8gNCAqIDQ7IC8vIFJvdW5kIHVwIHRvIDQgYnl0ZSBtdWx0aXBsZQotCWJ5dGVbXSBkYXRhID0gbG9hZERhdGEoaW5mb0hlYWRlciwgc3RyaWRlKTsKLQlmbGlwU2NhbkxpbmVzKGRhdGEsIHN0cmlkZSwgaGVpZ2h0KTsKLQlyZXR1cm4gZGF0YTsKLX0KLWJ5dGVbXSBsb2FkRGF0YShieXRlW10gaW5mb0hlYWRlciwgaW50IHN0cmlkZSkgewotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgZGF0YVNpemUgPSBoZWlnaHQgKiBzdHJpZGU7Ci0JYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtkYXRhU2l6ZV07Ci0JaW50IGNtcCA9IChpbmZvSGVhZGVyWzE2XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE3XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzE4XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxOV0gJiAweEZGKSA8PCAyNCk7Ci0JaWYgKGNtcCA9PSAwKSB7IC8vIEJNUF9OT19DT01QUkVTU0lPTgotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoZGF0YSkgIT0gZGF0YVNpemUpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgY29tcHJlc3NlZFNpemUgPSAoaW5mb0hlYWRlclsyMF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyMV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsyMl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMjNdICYgMHhGRikgPDwgMjQpOwotCQlieXRlW10gY29tcHJlc3NlZCA9IG5ldyBieXRlW2NvbXByZXNzZWRTaXplXTsKLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbS5yZWFkKGNvbXByZXNzZWQpICE9IGNvbXByZXNzZWRTaXplKQotCQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JCWRlY29tcHJlc3NEYXRhKGNvbXByZXNzZWQsIGRhdGEsIHN0cmlkZSwgY21wKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci1pbnRbXSBsb2FkRmlsZUhlYWRlcigpIHsKLQlpbnRbXSBoZWFkZXIgPSBuZXcgaW50WzVdOwotCXRyeSB7Ci0JCWhlYWRlclswXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbMV0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JCWhlYWRlclsyXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbM10gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJaGVhZGVyWzRdID0gaW5wdXRTdHJlYW0ucmVhZEludCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmIChoZWFkZXJbMF0gIT0gMHg0RDQyKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBoZWFkZXI7Ci19Ci1JbWFnZURhdGFbXSBsb2FkRnJvbUJ5dGVTdHJlYW0oKSB7Ci0JaW50W10gZmlsZUhlYWRlciA9IGxvYWRGaWxlSGVhZGVyKCk7Ci0JYnl0ZVtdIGluZm9IZWFkZXIgPSBuZXcgYnl0ZVtCTVBIZWFkZXJGaXhlZFNpemVdOwotCXRyeSB7Ci0JCWlucHV0U3RyZWFtLnJlYWQoaW5mb0hlYWRlcik7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWludCB3aWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGJpdENvdW50ID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGxvYWRQYWxldHRlKGluZm9IZWFkZXIpOwotCWlmIChpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpIDwgZmlsZUhlYWRlcls0XSkgewotCQkvLyBTZWVrIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbS5za2lwKGZpbGVIZWFkZXJbNF0gLSBpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQl9Ci0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShpbmZvSGVhZGVyKTsKLQl0aGlzLmNvbXByZXNzaW9uID0gKGluZm9IZWFkZXJbMTZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMThdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzE5XSAmIDB4RkYpIDw8IDI0KTsKLQl0aGlzLmltcG9ydGFudENvbG9ycyA9IChpbmZvSGVhZGVyWzM2XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzM3XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzM4XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclszOV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IHhQZWxzUGVyTWV0ZXIgPSAoaW5mb0hlYWRlclsyNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsyNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMjddICYgMHhGRikgPDwgMjQpOwotCWludCB5UGVsc1Blck1ldGVyID0gKGluZm9IZWFkZXJbMjhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzMxXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgdHlwZSA9ICh0aGlzLmNvbXByZXNzaW9uID09IDEgLypCTVBfUkxFOF9DT01QUkVTU0lPTiovKSB8fCAodGhpcy5jb21wcmVzc2lvbiA9PSAyIAotCi0vKkJNUF9STEU0X0NPTVBSRVNTSU9OKi8pID8gU1dULklNQUdFX0JNUF9STEUgOiBTV1QuSU1BR0VfQk1QOwotCXJldHVybiBuZXcgSW1hZ2VEYXRhW10gewotCQlJbWFnZURhdGEuaW50ZXJuYWxfbmV3KAotCQkJd2lkdGgsCi0JCQloZWlnaHQsCi0JCQliaXRDb3VudCwKLQkJCXBhbGV0dGUsCi0JCQk0LAotCQkJZGF0YSwKLQkJCTAsCi0JCQludWxsLAotCQkJbnVsbCwKLQkJCS0xLAotCQkJLTEsCi0JCQl0eXBlLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJMCkKLQl9OwotfQotUGFsZXR0ZURhdGEgbG9hZFBhbGV0dGUoYnl0ZVtdIGluZm9IZWFkZXIpIHsKLQlpbnQgZGVwdGggPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpZiAoZGVwdGggPD0gOCkgewotCQlpbnQgbnVtQ29sb3JzID0gKGluZm9IZWFkZXJbMzJdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMzNdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzRdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzM1XSAmIDB4RkYpIDw8IDI0KTsKLQkJaWYgKG51bUNvbG9ycyA9PSAwKSB7Ci0JCQludW1Db2xvcnMgPSAxIDw8IGRlcHRoOwotCQl9IGVsc2UgewotCQkJaWYgKG51bUNvbG9ycyA+IDI1NikKLQkJCQludW1Db2xvcnMgPSAyNTY7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW251bUNvbG9ycyAqIDRdOwotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoYnVmKSAhPSBidWYubGVuZ3RoKQotCQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JCXJldHVybiBwYWxldHRlRnJvbUJ5dGVzKGJ1ZiwgbnVtQ29sb3JzKTsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4N0MwMCwgMHgzRTAsIDB4MUYpOwotCWlmIChkZXB0aCA9PSAyNCkgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGLCAweEZGMDAsIDB4RkYwMDAwKTsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYwMCwgMHhGRjAwMDAsIDB4RkYwMDAwMDApOwotfQotUGFsZXR0ZURhdGEgcGFsZXR0ZUZyb21CeXRlcyhieXRlW10gYnl0ZXMsIGludCBudW1Db2xvcnMpIHsKLQlpbnQgYnl0ZXNPZmZzZXQgPSAwOwotCVJHQltdIGNvbG9ycyA9IG5ldyBSR0JbbnVtQ29sb3JzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yczsgaSsrKSB7Ci0JCWNvbG9yc1tpXSA9IG5ldyBSR0IoYnl0ZXNbYnl0ZXNPZmZzZXQgKyAyXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldCArIDFdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0XSAmIDB4RkYpOwotCQlieXRlc09mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKGNvbG9ycyk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgQk1QIHJlcHJlc2VudGF0aW9uIG9mCi0gKiB0aGUgZ2l2ZW4gZGV2aWNlIGluZGVwZW5kZW50IHBhbGV0dGUuCi0gKi8KLXN0YXRpYyBieXRlW10gcGFsZXR0ZVRvQnl0ZXMoUGFsZXR0ZURhdGEgcGFsKSB7Ci0JaW50IG4gPSBwYWwuY29sb3JzID09IG51bGwgPyAwIDogKHBhbC5jb2xvcnMubGVuZ3RoIDwgMjU2ID8gcGFsLmNvbG9ycy5sZW5ndGggOiAyNTYpOwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW24gKiA0XTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQlSR0IgY29sID0gcGFsLmNvbG9yc1tpXTsKLQkJYnl0ZXNbb2Zmc2V0XSA9IChieXRlKWNvbC5ibHVlOwotCQlieXRlc1tvZmZzZXQgKyAxXSA9IChieXRlKWNvbC5ncmVlbjsKLQkJYnl0ZXNbb2Zmc2V0ICsgMl0gPSAoYnl0ZSljb2wucmVkOwotCQlvZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotCi12b2lkIGZsaXBTY2FuTGluZXMoYnl0ZVtdIGRhdGEsIGludCBzdHJpZGUsIGludCBoZWlnaHQpIHsKLQlpbnQgaTEgPSAwOwotCWludCBpMiA9IChoZWlnaHQgLSAxKSAqIHN0cmlkZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodCAvIDI7IGkrKykgewotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RyaWRlOyBpbmRleCsrKSB7Ci0JCQlieXRlIGIgPSBkYXRhW2luZGV4ICsgaTFdOwotCQkJZGF0YVtpbmRleCArIGkxXSA9IGRhdGFbaW5kZXggKyBpMl07Ci0JCQlkYXRhW2luZGV4ICsgaTJdID0gYjsKLQkJfQotCQlpMSArPSBzdHJpZGU7Ci0JCWkyIC09IHN0cmlkZTsKLQl9Ci19Ci0KLX0KLQotc3RhdGljIGNsYXNzIFdpbklDT0ZpbGVGb3JtYXQgZXh0ZW5kcyBGaWxlRm9ybWF0IHsKLQkKLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIG5ld0JwbCk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4KLSAqIGljb24KLSAqLwotaW50IGljb25TaXplKEltYWdlRGF0YSBpKSB7Ci0JaW50IHNoYXBlRGF0YVN0cmlkZSA9IChpLndpZHRoICogaS5kZXB0aCArIDMxKSAvIDMyICogNDsKLQlpbnQgbWFza0RhdGFTdHJpZGUgPSAoaS53aWR0aCArIDMxKSAvIDMyICogNDsKLQlpbnQgZGF0YVNpemUgPSAoc2hhcGVEYXRhU3RyaWRlICsgbWFza0RhdGFTdHJpZGUpICogaS5oZWlnaHQ7Ci0JaW50IHBhbGV0dGVTaXplID0gaS5wYWxldHRlLmNvbG9ycyAhPSBudWxsID8gaS5wYWxldHRlLmNvbG9ycy5sZW5ndGggKiA0IDogMDsKLQlyZXR1cm4gV2luQk1QRmlsZUZvcm1hdC5CTVBIZWFkZXJGaXhlZFNpemUgKyBwYWxldHRlU2l6ZSArIGRhdGFTaXplOwotfQotYm9vbGVhbiBpc0ZpbGVGb3JtYXQoTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JdHJ5IHsKLQkJYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlWzRdOwotCQlzdHJlYW0ucmVhZChoZWFkZXIpOwotCQlzdHJlYW0udW5yZWFkKGhlYWRlcik7Ci0JCXJldHVybiBoZWFkZXJbMF0gPT0gMCAmJiBoZWFkZXJbMV0gPT0gMCAmJiBoZWFkZXJbMl0gPT0gMSAmJiBoZWFkZXJbM10gPT0gMDsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotYm9vbGVhbiBpc1ZhbGlkSWNvbihJbWFnZURhdGEgaSkgewotCXN3aXRjaCAoaS5kZXB0aCkgewotCQljYXNlIDE6Ci0JCWNhc2UgNDoKLQkJY2FzZSA4OgotCQkJaWYgKGkucGFsZXR0ZS5pc0RpcmVjdCkgcmV0dXJuIGZhbHNlOwotCQkJaW50IHNpemUgPSBpLnBhbGV0dGUuY29sb3JzLmxlbmd0aDsKLQkJCXJldHVybiBzaXplID09IDIgfHwgc2l6ZSA9PSAxNiB8fCBzaXplID09IDMyIHx8IHNpemUgPT0gMjU2OwotCQljYXNlIDI0OgotCQljYXNlIDMyOgotCQkJcmV0dXJuIGkucGFsZXR0ZS5pc0RpcmVjdDsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotaW50IGxvYWRGaWxlSGVhZGVyKExFRGF0YUlucHV0U3RyZWFtIGJ5dGVTdHJlYW0pIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbmV3IGludFszXTsKLQl0cnkgewotCQlmaWxlSGVhZGVyWzBdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJZmlsZUhlYWRlclsxXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWZpbGVIZWFkZXJbMl0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoZmlsZUhlYWRlclswXSAhPSAwKSB8fCAoZmlsZUhlYWRlclsxXSAhPSAxKSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgbnVtSWNvbnMgPSBmaWxlSGVhZGVyWzJdOwotCWlmIChudW1JY29ucyA8PSAwKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBudW1JY29uczsKLX0KLWludCBsb2FkRmlsZUhlYWRlcihMRURhdGFJbnB1dFN0cmVhbSBieXRlU3RyZWFtLCBib29sZWFuIGhhc0hlYWRlcikgewotCWludFtdIGZpbGVIZWFkZXIgPSBuZXcgaW50WzNdOwotCXRyeSB7Ci0JCWlmIChoYXNIZWFkZXIpIHsKLQkJCWZpbGVIZWFkZXJbMF0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJZmlsZUhlYWRlclsxXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxlSGVhZGVyWzBdID0gMDsKLQkJCWZpbGVIZWFkZXJbMV0gPSAxOwotCQl9Ci0JCWZpbGVIZWFkZXJbMl0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoZmlsZUhlYWRlclswXSAhPSAwKSB8fCAoZmlsZUhlYWRlclsxXSAhPSAxKSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgbnVtSWNvbnMgPSBmaWxlSGVhZGVyWzJdOwotCWlmIChudW1JY29ucyA8PSAwKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBudW1JY29uczsKLX0KLUltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpIHsKLQlpbnQgbnVtSWNvbnMgPSBsb2FkRmlsZUhlYWRlcihpbnB1dFN0cmVhbSk7Ci0JaW50W11bXSBoZWFkZXJzID0gbG9hZEljb25IZWFkZXJzKG51bUljb25zKTsKLQlJbWFnZURhdGFbXSBpY29ucyA9IG5ldyBJbWFnZURhdGFbaGVhZGVycy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbnMubGVuZ3RoOyBpKyspIHsKLQkJaWNvbnNbaV0gPSBsb2FkSWNvbihoZWFkZXJzW2ldKTsKLQl9Ci0JcmV0dXJuIGljb25zOwotfQotLyoqCi0gKiBMb2FkIG9uZSBpY29uIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgotICovCi1JbWFnZURhdGEgbG9hZEljb24oaW50W10gaWNvbkhlYWRlcikgewotCWJ5dGVbXSBpbmZvSGVhZGVyID0gbG9hZEluZm9IZWFkZXIoaWNvbkhlYWRlcik7Ci0JV2luQk1QRmlsZUZvcm1hdCBibXBGb3JtYXQgPSBuZXcgV2luQk1QRmlsZUZvcm1hdCgpOwotCWJtcEZvcm1hdC5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBibXBGb3JtYXQubG9hZFBhbGV0dGUoaW5mb0hlYWRlcik7Ci0JYnl0ZVtdIHNoYXBlRGF0YSA9IGJtcEZvcm1hdC5sb2FkRGF0YShpbmZvSGVhZGVyKTsKLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBkZXB0aCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWluZm9IZWFkZXJbMTRdID0gMTsKLQlpbmZvSGVhZGVyWzE1XSA9IDA7Ci0JYnl0ZVtdIG1hc2tEYXRhID0gYm1wRm9ybWF0LmxvYWREYXRhKGluZm9IZWFkZXIpOwotCW1hc2tEYXRhID0gY29udmVydFBhZChtYXNrRGF0YSwgd2lkdGgsIGhlaWdodCwgMSwgNCwgMik7Ci0JYml0SW52ZXJ0RGF0YShtYXNrRGF0YSwgMCwgbWFza0RhdGEubGVuZ3RoKTsKLQlyZXR1cm4gSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXBhbGV0dGUsCi0JCTQsCi0JCXNoYXBlRGF0YSwKLQkJMiwKLQkJbWFza0RhdGEsCi0JCW51bGwsCi0JCS0xLAotCQktMSwKLQkJU1dULklNQUdFX0lDTywKLQkJMCwKLQkJMCwKLQkJMCwKLQkJMCk7Ci19Ci1pbnRbXVtdIGxvYWRJY29uSGVhZGVycyhpbnQgbnVtSWNvbnMpIHsKLQlpbnRbXVtdIGhlYWRlcnMgPSBuZXcgaW50W251bUljb25zXVs3XTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUljb25zOyBpKyspIHsKLQkJCWhlYWRlcnNbaV1bMF0gPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQloZWFkZXJzW2ldWzFdID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJaGVhZGVyc1tpXVsyXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVszXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVs0XSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVs1XSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJCWhlYWRlcnNbaV1bNl0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlyZXR1cm4gaGVhZGVyczsKLX0KLWJ5dGVbXSBsb2FkSW5mb0hlYWRlcihpbnRbXSBpY29uSGVhZGVyKSB7Ci0JaW50IHdpZHRoID0gaWNvbkhlYWRlclswXTsKLQlpbnQgaGVpZ2h0ID0gaWNvbkhlYWRlclsxXTsKLQlpbnQgbnVtQ29sb3JzID0gaWNvbkhlYWRlclsyXTsgLy8gdGhlIG51bWJlciBvZiBjb2xvcnMgaXMgaW4gdGhlIGxvdyBieXRlLCBidXQgdGhlIGhpZ2ggYnl0ZSBtdXN0IGJlIDAKLQlpZiAobnVtQ29sb3JzID09IDApIG51bUNvbG9ycyA9IDI1NjsgLy8gdGhpcyBpcyBzcGVjaWZpZWQ6ICcwMCcgcmVwcmVzZW50cyAnMjU2JyAoMHgxMDApIGNvbG9ycwotCWlmICgobnVtQ29sb3JzICE9IDIpICYmIChudW1Db2xvcnMgIT0gOCkgJiYgKG51bUNvbG9ycyAhPSAxNikgJiYKLQkJKG51bUNvbG9ycyAhPSAzMikgJiYgKG51bUNvbG9ycyAhPSAyNTYpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWlmIChpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpIDwgaWNvbkhlYWRlcls2XSkgewotCQkvLyBTZWVrIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbS5za2lwKGljb25IZWFkZXJbNl0gLSBpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlieXRlW10gaW5mb0hlYWRlciA9IG5ldyBieXRlW1dpbkJNUEZpbGVGb3JtYXQuQk1QSGVhZGVyRml4ZWRTaXplXTsKLQl0cnkgewotCQlpbnB1dFN0cmVhbS5yZWFkKGluZm9IZWFkZXIpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoKGluZm9IZWFkZXJbMTJdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTNdICYgMHhGRikgPDwgOCkpICE9IDEpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW50IGluZm9XaWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaW5mb0hlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWlmIChoZWlnaHQgPT0gaW5mb0hlaWdodCAmJiBiaXRDb3VudCA9PSAxKSBoZWlnaHQgLz0gMjsKLQlpZiAoISgod2lkdGggPT0gaW5mb1dpZHRoKSAmJiAoaGVpZ2h0ICogMiA9PSBpbmZvSGVpZ2h0KSAmJgotCQkoYml0Q291bnQgPT0gMSB8fCBiaXRDb3VudCA9PSA0IHx8IGJpdENvdW50ID09IDggfHwgYml0Q291bnQgPT0gMjQgfHwgYml0Q291bnQgPT0gMzIpKSkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW5mb0hlYWRlcls4XSA9IChieXRlKShoZWlnaHQgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzldID0gKGJ5dGUpKChoZWlnaHQgPj4gOCkgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzEwXSA9IChieXRlKSgoaGVpZ2h0ID4+IDE2KSAmIDB4RkYpOwotCWluZm9IZWFkZXJbMTFdID0gKGJ5dGUpKChoZWlnaHQgPj4gMjQpICYgMHhGRik7Ci0JcmV0dXJuIGluZm9IZWFkZXI7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgU1dUIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9JQ08gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lPID0gMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9JTUFHRSA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05VTExfQVJHVU1FTlQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfQVJHVU1FTlQgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0NBTk5PVF9CRV9aRVJPID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9VTkRFRklORUQgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCA9IDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9NQVNLID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9BTFBIQSA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfTk9ORSA9IDB4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfUElYRUwgPSAxIDw8IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfQk1QID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9CTVBfUkxFID0gMTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoaW50IGNvZGUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yICIrY29kZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgY29kZSwgVGhyb3dhYmxlIHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfNC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhM2Q1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzE2XzguYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTUxZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl80LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZlYjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMzJfOC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5NDA2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzQuYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFiYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF80OF84LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY2NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsYXNzRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsYXNzRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRiMDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGFzc0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0RhdGEgZXh0ZW5kcyBJdGVtRGF0YSB7Ci0JCi0JQ2xhc3MgY2xheno7Ci0KLXB1YmxpYyBDbGFzc0RhdGEoQ2xhc3MgY2xhenosIFN0cmluZyBzdHIpIHsKLQlzdXBlcihzdHIpOwotCXRoaXMuY2xhenogPSBjbGF6ejsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsRmxhZ3MoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXsibm9fZ2VuIiwgImNwcCJ9OwotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0Q2xhenooKSB7Ci0JcmV0dXJuIGNsYXp6OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImV4Y2x1ZGUiKTsKLX0KLQotcHVibGljIHZvaWQgc2V0RXhjbHVkZShTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJleGNsdWRlIiwgc3RyKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThkMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGVhbnVwQ2xhc3MgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi1TdHJpbmcgY2xhc3NTb3VyY2VQYXRoOwotU3RyaW5nW10gc291cmNlUGF0aDsKLVN0cmluZyBjbGFzc1NvdXJjZTsKLUhhc2h0YWJsZSBmaWxlczsKLWludCB1c2VkQ291bnQsIHVudXNlZENvdW50OwotCi12b2lkIGxvYWRDbGFzc1NvdXJjZSgpIHsKLQlpZiAoY2xhc3NTb3VyY2VQYXRoID09IG51bGwpIHJldHVybjsKLQlGaWxlIGYgPSBuZXcgRmlsZShjbGFzc1NvdXJjZVBhdGgpOwotCWNsYXNzU291cmNlID0gbG9hZEZpbGUoZik7Ci19Ci0KLXZvaWQgbG9hZEZpbGVzICgpIHsKLQkvLyBCQUQgLSBob2xkcyBvbiB0byBhIGxvdCBvZiBtZW1vcnkKLQlpZiAoc291cmNlUGF0aCA9PSBudWxsKSByZXR1cm47Ci0JZmlsZXMgPSBuZXcgSGFzaHRhYmxlICgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUGF0aC5sZW5ndGg7IGkrKykgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzb3VyY2VQYXRoW2ldKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKLQkJCQkJZmlsZXMucHV0KGZpbGUsIGxvYWRGaWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvYWREaXJlY3RvcnkoZmlsZSk7Ci0JCQl9CQkKLQkJfQotCX0KLX0KLQotU3RyaW5nIGxvYWRGaWxlIChGaWxlIGZpbGUpIHsKLQl0cnkgewotCQlGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotCQlpbnQgcmVhZDsKLQkJd2hpbGUgKChyZWFkID0gYnIucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJc3RyLmFwcGVuZChidWZmZXIsIDAsIHJlYWQpOwotCQl9Ci0JCWZyLmNsb3NlKCk7Ci0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLQlyZXR1cm4gIiI7Ci19Ci0KLXZvaWQgbG9hZERpcmVjdG9yeShGaWxlIGZpbGUpIHsKLQlTdHJpbmdbXSBlbnRyaWVzID0gZmlsZS5saXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGUsIGVudHJ5KTsKLQkJaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChmLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0JCQkJZmlsZXMucHV0KGYsIGxvYWRGaWxlKGYpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWxvYWREaXJlY3RvcnkoZik7Ci0JCX0JCQkJCQotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlsb2FkRmlsZXMgKCk7Ci0JbG9hZENsYXNzU291cmNlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhdGgoU3RyaW5nW10gc291cmNlUGF0aCkgewotCXRoaXMuc291cmNlUGF0aCA9IHNvdXJjZVBhdGg7Ci0JZmlsZXMgPSBudWxsOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDbGFzc1NvdXJjZVBhdGgoU3RyaW5nIGNsYXNzU291cmNlUGF0aCkgewotCXRoaXMuY2xhc3NTb3VyY2VQYXRoID0gY2xhc3NTb3VyY2VQYXRoOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1MWFlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQ29uc3RhbnRzIGV4dGVuZHMgQ2xlYW51cENsYXNzIHsKLQotU3RyaW5nIGdldEZpZWxkVmFsdWUoRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlICh0cnVlKSB7Ci0JCWluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZihuYW1lLCBpbmRleCArIDEpOwotCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBudWxsOwotCQlpbnQgZXF1YWxzSW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKCI9IiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgZXF1YWxzSW5kZXgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpbnQgc2VtaUluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZigiOyIsIGVxdWFsc0luZGV4KTsKLSAJCQlyZXR1cm4gY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGVxdWFsc0luZGV4ICsgMSwgc2VtaUluZGV4KS50cmltKCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JdW51c2VkQ291bnQgPSB1c2VkQ291bnQgPSAwOwotCXN1cGVyLmdlbmVyYXRlKGNsYXp6KTsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLQlvdXRwdXQoInVzZWQ9IiArIHVzZWRDb3VudCArICIgdW51c2VkPSIgKyB1bnVzZWRDb3VudCArICIgdG90YWw9IiArICh1bnVzZWRDb3VudCArIHVzZWRDb3VudCkpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZFtdIGZpZWxkcykgewotCXNvcnQoZmllbGRzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKChmaWVsZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLkZJTkFMKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUoZmllbGQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gZmlsZXMua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKWZpbGVzLmdldChrZXkpOwotCQlpZiAoc3RyLmluZGV4T2YobmFtZSkgIT0gLTEpIHsKLQkJCWludCBtb2RpZmllcnMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCVN0cmluZyBtb2RpZmllcnNTdHIgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotCQkJb3V0cHV0KCJcdCIpOwotCQkJb3V0cHV0KG1vZGlmaWVyc1N0cik7Ci0JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTMoZmllbGQuZ2V0VHlwZSgpKSk7Ci0JCQlvdXRwdXQoIiAiICk7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dCgiID0gIik7Ci0JCQlvdXRwdXQoZ2V0RmllbGRWYWx1ZShmaWVsZCkpOwotCQkJb3V0cHV0bG4oIjsiKTsKLQkJCXVzZWRDb3VudCsrOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXVudXNlZENvdW50Kys7Ci0vLwlvdXRwdXQoIk5PVCBVU0VEPSIgKyBmaWVsZC50b1N0cmluZygpICsgIiBcbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIENsZWFudXBDb25zdGFudHMgPE9TIGNsYXNzTmFtZT4gPHNyYyBwYXRoPiA8Y2xhc3Mgc291cmNlPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCUNsZWFudXBDb25zdGFudHMgZ2VuID0gbmV3IENsZWFudXBDb25zdGFudHMoKTsKLQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbMF07Ci0JCVN0cmluZ1tdIHNvdXJjZVBhdGggPSBuZXcgU3RyaW5nW117YXJnc1sxXX07Ci0JCVN0cmluZyBjbGFzc1NvdXJjZSA9IGFyZ3NbMl07Ci0JCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQlnZW4uc2V0U291cmNlUGF0aChzb3VyY2VQYXRoKTsKLQkJZ2VuLnNldENsYXNzU291cmNlUGF0aChjbGFzc1NvdXJjZSk7Ci0JCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBOYXRpdmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cE5hdGl2ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5ZGZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cE5hdGl2ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotcHVibGljIGNsYXNzIENsZWFudXBOYXRpdmVzIGV4dGVuZHMgQ2xlYW51cENsYXNzIHsKLQkKLXB1YmxpYyBDbGVhbnVwTmF0aXZlcygpIHsKLX0KLQotU3RyaW5nW10gZ2V0QXJnTmFtZXMoTWV0aG9kIG1ldGhvZCkgewotCWludCBuX2FyZ3MgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7Ci0JaWYgKG5fYXJncyA9PSAwKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JU3RyaW5nIHBhcmFtcyA9ICIiOwotCWludCBpbmRleCA9IDA7Ci0Jd2hpbGUgKHRydWUpIHsKLQkJaW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKG5hbWUsIGluZGV4ICsgMSk7Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7Ci0JCWludCBwYXJhbnRlc2VzU3RhcnQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIoIiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgcGFyYW50ZXNlc1N0YXJ0KS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJaW50IHBhcmFudGVzZXNFbmQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIpIiwgcGFyYW50ZXNlc1N0YXJ0KTsKLSAJCQlwYXJhbXMgPSBjbGFzc1NvdXJjZS5zdWJzdHJpbmcocGFyYW50ZXNlc1N0YXJ0ICsgMSwgcGFyYW50ZXNlc0VuZCk7Ci0gCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW25fYXJnc107Ci0JU3RyaW5nVG9rZW5pemVyIHRrID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXJhbXMsICIsIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgcyA9IHRrLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRrMSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiAiKTsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJd2hpbGUgKHRrMS5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXMxID0gdGsxLm5leHRUb2tlbigpOwotCQl9Ci0JCW5hbWVzW2ldID0gczEudHJpbSgpOwotCX0KLQlyZXR1cm4gbmFtZXM7CQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCXVudXNlZENvdW50ID0gdXNlZENvdW50ID0gMDsKLQlzdXBlci5nZW5lcmF0ZShjbGF6eik7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWdlbmVyYXRlKG1ldGhvZHMpOwotCW91dHB1dCgidXNlZD0iICsgdXNlZENvdW50ICsgIiB1bnVzZWQ9IiArIHVudXNlZENvdW50ICsgIiB0b3RhbD0iICsgKHVudXNlZENvdW50ICsgdXNlZENvdW50KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQlzb3J0KG1ldGhvZHMpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUobWV0aG9kKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JRW51bWVyYXRpb24ga2V5cyA9IGZpbGVzLmtleXMoKTsKLQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQlTdHJpbmcgc3RyID0gKFN0cmluZylmaWxlcy5nZXQoa2V5KTsKLQkJaWYgKHN0ci5pbmRleE9mKG5hbWUpICE9IC0xKSB7Ci0JCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCVN0cmluZyBtb2RpZmllcnNTdHIgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotCQkJb3V0cHV0KG1vZGlmaWVyc1N0cik7Ci0JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTMobWV0aG9kLmdldFJldHVyblR5cGUoKSkpOwotCQkJb3V0cHV0KCIgIiApOwotCQkJb3V0cHV0KG1ldGhvZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0KCIoIik7Ci0JCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCVN0cmluZ1tdIHBhcmFtTmFtZXMgPSBnZXRBcmdOYW1lcyhtZXRob2QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0JCQkJU3RyaW5nIHNpZyA9IGdldFR5cGVTaWduYXR1cmUzKHBhcmFtVHlwZSk7Ci0JCQkJaWYgKGNsYXp6LmdldFBhY2thZ2UoKS5lcXVhbHMocGFyYW1UeXBlLmdldFBhY2thZ2UoKSkpIHNpZyA9IGdldENsYXNzTmFtZShwYXJhbVR5cGUpOwotCQkJCW91dHB1dChzaWcpOwotCQkJCW91dHB1dCgiICIpOwotCQkJCW91dHB1dChwYXJhbU5hbWVzW2ldKTsKLQkJCX0KLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJdXNlZENvdW50Kys7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JdW51c2VkQ291bnQrKzsKLS8vCW91dHB1dCgiTk9UIFVTRUQ9IiArIG1ldGhvZC50b1N0cmluZygpICsgIlxuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ2xlYW51cE5hdGl2ZXMgPE9TIGNsYXNzTmFtZT4gPHNyYyBwYXRoPiA8Y2xhc3Mgc291cmNlPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCUNsZWFudXBOYXRpdmVzIGdlbiA9IG5ldyBDbGVhbnVwTmF0aXZlcygpOwotCQlTdHJpbmcgY2xhenpOYW1lID0gYXJnc1swXTsKLQkJU3RyaW5nW10gc291cmNlUGF0aCA9IG5ldyBTdHJpbmdbXXthcmdzWzFdfTsKLQkJU3RyaW5nIGNsYXNzU291cmNlID0gYXJnc1syXTsgCi0JCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQlnZW4uc2V0U291cmNlUGF0aChzb3VyY2VQYXRoKTsKLQkJZ2VuLnNldENsYXNzU291cmNlUGF0aChjbGFzc1NvdXJjZSk7Ci0JCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NvbnN0YW50c0dlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NvbnN0YW50c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmYzZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Db25zdGFudHNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGRbXSBmaWVsZHMpIHsKLQlzb3J0KGZpZWxkcyk7Ci0Jb3V0cHV0bG4oImludCBtYWluKCkgeyIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoKGZpZWxkLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuRklOQUwpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JfQotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkIGZpZWxkKSB7Ci0JQ2xhc3MgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQlvdXRwdXQoIlx0cHJpbnRmKFwicHVibGljIHN0YXRpYyBmaW5hbCAiKTsKLQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTMoZmllbGQuZ2V0VHlwZSgpKSk7Ci0Jb3V0cHV0KCIgIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0KCIgPSAiKTsKLQlpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MgfHwgdHlwZSA9PSBieXRlW10uY2xhc3MpIG91dHB1dCgiXCIlc1wiIik7Ci0JZWxzZSBvdXRwdXQoIjB4JXgiKTsKLQlvdXRwdXQoIjtcXG5cIiwgIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0bG4oIik7Iik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAxKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ29uc3RhbnRzR2VuZXJhdG9yIDxjbGFzc05hbWUxPiA8Y2xhc3NOYW1lMj4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlDb25zdGFudHNHZW5lcmF0b3IgZ2VuID0gbmV3IENvbnN0YW50c0dlbmVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjbGF6ek5hbWUgPSBhcmdzW2ldOwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCQlnZW4uZ2VuZXJhdGUoY2xhenopOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZpZWxkRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZpZWxkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI4ODU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9GaWVsZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotcHVibGljIGNsYXNzIEZpZWxkRGF0YSBleHRlbmRzIEl0ZW1EYXRhIHsKLQkKLQlGaWVsZCBmaWVsZDsKLQkKLXB1YmxpYyBGaWVsZERhdGEoRmllbGQgZmllbGQsIFN0cmluZyBzdHIpIHsKLQlzdXBlcihzdHIpOwotCXRoaXMuZmllbGQgPSBmaWVsZDsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxGbGFncygpIHsKLQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJub19nZW4iLCAibm9fd2luY2UifTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiYWNjZXNzb3IiKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXN0KCkgewotCVN0cmluZyBjYXN0ID0gKChTdHJpbmcpZ2V0UGFyYW0oImNhc3QiKSkudHJpbSgpOwotCWlmIChjYXN0Lmxlbmd0aCgpID4gMCkgewotCQlpZiAoIWNhc3Quc3RhcnRzV2l0aCgiKCIpKSBjYXN0ID0gIigiICsgY2FzdDsKLQkJaWYgKCFjYXN0LmVuZHNXaXRoKCIpIikpIGNhc3QgPSBjYXN0ICsgIikiOwotCX0KLQlyZXR1cm4gY2FzdDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeGNsdWRlKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJleGNsdWRlIik7Ci19Ci0KLXB1YmxpYyBGaWVsZCBnZXRGaWVsZCgpIHsKLQlyZXR1cm4gZmllbGQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImFjY2Vzc29yIiwgc3RyKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2FzdChTdHJpbmcgc3RyKSB7Ci0Jc2V0UGFyYW0oImNhc3QiLCBzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFeGNsdWRlKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImV4Y2x1ZGUiLCBzdHIpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSXRlbURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JdGVtRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODcwNDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JdGVtRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSXRlbURhdGEgewotCi0JSGFzaE1hcCBwYXJhbXM7Ci0KLXB1YmxpYyBJdGVtRGF0YShTdHJpbmcgc3RyKSB7Ci0JcGFyc2Uoc3RyKTsKLX0KLQotc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQlTdHJpbmdUb2tlbml6ZXIgdGsgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgc2VwYXJhdG9yKTsKLQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCXdoaWxlICh0ay5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlyZXN1bHQuYWRkKHRrLm5leHRFbGVtZW50KCkpOwotCX0KLQlyZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0RmxhZ3MoKSB7Ci0JT2JqZWN0IGZsYWdzID0gZ2V0UGFyYW0oImZsYWdzIik7Ci0JaWYgKGZsYWdzID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCWlmIChmbGFncyBpbnN0YW5jZW9mIFN0cmluZ1tdKSByZXR1cm4gKFN0cmluZ1tdKWZsYWdzOwotCVN0cmluZ1tdIHJlc3VsdCA9IHNwbGl0KChTdHJpbmcpZmxhZ3MsICIgIik7Ci0JcGFyYW1zLnB1dCgiZmxhZ3MiLCByZXN1bHQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldEZsYWcoU3RyaW5nIGZsYWcpIHsKLQlTdHJpbmdbXSBmbGFncyA9IGdldEZsYWdzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgewotCQlpZiAoZmxhZ3NbaV0uZXF1YWxzKGZsYWcpKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgT2JqZWN0IGdldFBhcmFtKFN0cmluZyBrZXkpIHsKLQlPYmplY3QgdmFsdWUgPSBwYXJhbXMuZ2V0KGtleSk7Ci0JcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOwotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZSgpIHsKLQlyZXR1cm4gIWdldEZsYWcoIm5vX2dlbiIpOwotfQotCi1wdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3RyKSB7Ci0JdGhpcy5wYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCWlmIChzdHIubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCVN0cmluZ1tdIHBhcmFtcyA9IHNwbGl0KHN0ciwgIiwiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCWludCBlcXVhbHMgPSBwYXJhbS5pbmRleE9mKCc9Jyk7Ci0JCWlmIChlcXVhbHMgPT0gIC0xKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgc3RyICsgIiBwYXJhbSAiICsgcGFyYW0pOwotCQl9Ci0JCVN0cmluZyBrZXkgPSBwYXJhbS5zdWJzdHJpbmcoMCwgZXF1YWxzKS50cmltKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHBhcmFtLnN1YnN0cmluZyhlcXVhbHMgKyAxKS50cmltKCk7Ci0JCXNldFBhcmFtKGtleSwgdmFsdWUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nW10gZmxhZ3MpIHsgCi0Jc2V0UGFyYW0oImZsYWdzIiwgZmxhZ3MpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRGbGFnKFN0cmluZyBmbGFnLCBib29sZWFuIHZhbHVlKSB7Ci0JU3RyaW5nW10gZmxhZ3MgPSBnZXRGbGFncygpOwotCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChmbGFncykpOwotCWlmICh2YWx1ZSkgewotCQlzZXQuYWRkKGZsYWcpOwotCX0gZWxzZSB7Ci0JCXNldC5yZW1vdmUoZmxhZyk7Ci0JfQotCXNldEZsYWdzKChTdHJpbmdbXSlzZXQudG9BcnJheShuZXcgU3RyaW5nW3NldC5zaXplKCldKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlKGJvb2xlYW4gdmFsdWUpIHsKLQlzZXRGbGFnKCJub19nZW4iLCAhdmFsdWUpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRQYXJhbShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQlwYXJhbXMucHV0KGtleSwgdmFsdWUpOwotfQotCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JU2V0IHNldCA9IHBhcmFtcy5rZXlTZXQoKTsKLQlTdHJpbmdbXSBrZXlzID0gKFN0cmluZ1tdKXNldC50b0FycmF5KG5ldyBTdHJpbmdbc2V0LnNpemUoKV0pOwotCUFycmF5cy5zb3J0KGtleXMpOwotCWZvciAoaW50IGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykgewotCQlTdHJpbmcga2V5ID0ga2V5c1tqXTsKLQkJT2JqZWN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpOwotCQlTdHJpbmcgdmFsdWVTdHIgPSAiIjsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl2YWx1ZVN0ciA9IChTdHJpbmcpdmFsdWU7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gKFN0cmluZ1tdKXZhbHVlOwotCQkJU3RyaW5nQnVmZmVyIHZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKSB2YWx1ZUJ1ZmZlci5hcHBlbmQoIiAiKTsKLQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQodmFsdWVzW2ldKTsKLQkJCX0KLQkJCXZhbHVlU3RyID0gdmFsdWVCdWZmZXIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlU3RyID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAodmFsdWVTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpICE9IDApIGJ1ZmZlci5hcHBlbmQoIiwiKTsKLQkJCWJ1ZmZlci5hcHBlbmQoa2V5KTsKLQkJCWJ1ZmZlci5hcHBlbmQoIj0iKTsKLQkJCWJ1ZmZlci5hcHBlbmQodmFsdWVTdHIpOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZjMGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSk5JR2VuZXJhdG9yIHsKLQotCUNsYXNzIG1haW5DbGFzczsKLQlDbGFzc1tdIGNsYXNzZXM7Ci0JTWV0YURhdGEgbWV0YURhdGE7Ci0JYm9vbGVhbiBpc0NQUDsKLQlTdHJpbmcgZGVsaW1pdGVyOwotCVByaW50U3RyZWFtIG91dHB1dDsKLQlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3M7Ci0KLXB1YmxpYyBKTklHZW5lcmF0b3IoKSB7Ci0JZGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCW91dHB1dCA9IFN5c3RlbS5vdXQ7Ci0JbWV0YURhdGEgPSBuZXcgTWV0YURhdGEobmV3IFByb3BlcnRpZXMoKSk7Ci19Ci0KLVN0cmluZyBmaXhEZWxpbWl0ZXIoU3RyaW5nIHN0cikgewotCWlmIChkZWxpbWl0ZXIuZXF1YWxzKCJcbiIpKSByZXR1cm4gc3RyOwotCWludCBpbmRleCA9IDAsIGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQlpbnQgc3RhcnQgPSBpbmRleDsKLQkJaW5kZXggPSBzdHIuaW5kZXhPZignXG4nLCBzdGFydCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCWluZGV4Kys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBjbGF6eikgewotCVN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDE7Ci0JcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4LCBuYW1lLmxlbmd0aCgpKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoTWV0aG9kIG1ldGhvZCkgewotCXJldHVybiBnZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1UeXBlcykgewotCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSByZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQlTdHJpbmcgZnVuY3Rpb24gPSB0b0MobWV0aG9kLmdldE5hbWUoKSk7Ci0JaWYgKCFpc05hdGl2ZVVuaXF1ZShtZXRob2QpKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZnVuY3Rpb24pOwotCQlidWZmZXIuYXBwZW5kKCJfXyIpOwotCQlpZiAocGFyYW1UeXBlcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJCWJ1ZmZlci5hcHBlbmQodG9DKGdldFR5cGVTaWduYXR1cmUocGFyYW1UeXBlKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcmV0dXJuIGZ1bmN0aW9uOwotfQotCi1zdGF0aWMgaW50IGdldEJ5dGVDb3VudChDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiA0OwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiA0OwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiA4OwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gMjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAyOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAxOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gNDsKLQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiA4OwotCXJldHVybiA0OwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoQ2xhc3MgY2xhenopIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gIlYiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiSSI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJaIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gIkoiOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gIlMiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJDIjsKLQlpZiAoY2xhenogPT0gQnl0ZS5UWVBFKSByZXR1cm4gIkIiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gIkYiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEIjsKLQlpZiAoY2xhenogPT0gU3RyaW5nLmNsYXNzKSByZXR1cm4gIkxqYXZhL2xhbmcvU3RyaW5nOyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gIlsiICsgZ2V0VHlwZVNpZ25hdHVyZShjb21wb25lbnRUeXBlKTsKLQl9Ci0JcmV0dXJuICJMIiArIGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICI7IjsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlMShDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBWb2lkLlRZUEUpIHJldHVybiAiVm9pZCI7Ci0JaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJJbnQiOwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiQm9vbGVhbiI7Ci0JaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJMb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJTaG9ydCI7Ci0JaWYgKGNsYXp6ID09IENoYXJhY3Rlci5UWVBFKSByZXR1cm4gIkNoYXIiOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiQnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiRmxvYXQiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAiU3RyaW5nIjsKLQlyZXR1cm4gIk9iamVjdCI7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTIoQ2xhc3MgY2xhenopIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gInZvaWQiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiamludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJqYm9vbGVhbiI7Ci0JaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJqbG9uZyI7Ci0JaWYgKGNsYXp6ID09IFNob3J0LlRZUEUpIHJldHVybiAianNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiamNoYXIiOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiamJ5dGUiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gImpmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImpkb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAianN0cmluZyI7Ci0JaWYgKGNsYXp6ID09IENsYXNzLmNsYXNzKSByZXR1cm4gImpjbGFzcyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gZ2V0VHlwZVNpZ25hdHVyZTIoY29tcG9uZW50VHlwZSkgKyAiQXJyYXkiOwotCX0KLQlyZXR1cm4gImpvYmplY3QiOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUzKENsYXNzIGNsYXp6KSB7Ci0JaWYgKGNsYXp6ID09IFZvaWQuVFlQRSkgcmV0dXJuICJ2b2lkIjsKLQlpZiAoY2xhenogPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gImludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImxvbmciOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gInNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJieXRlIjsKLQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuICJmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJTdHJpbmciOwotCWlmIChjbGF6ei5pc0FycmF5KCkpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IGNsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKLQkJcmV0dXJuIGdldFR5cGVTaWduYXR1cmUzKGNvbXBvbmVudFR5cGUpICsgIltdIjsKLQl9Ci0JcmV0dXJuIGNsYXp6LmdldE5hbWUoKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlNChDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBWb2lkLlRZUEUpIHJldHVybiAidm9pZCI7Ci0JaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJqaW50IjsKLQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gImpib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImpsb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJqc2hvcnQiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJqY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJqYnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiamZsb2F0IjsKLQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiAiamRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJqc3RyaW5nIjsKLQlpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0JCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCXJldHVybiBnZXRUeXBlU2lnbmF0dXJlNChjb21wb25lbnRUeXBlKSArICIgKiI7Ci0JfQotCXJldHVybiBnZXRDbGFzc05hbWUoY2xhenopICsgIiAqIjsKLX0KLQotc3RhdGljIEhhc2hNYXAgdW5pcXVlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotc3RhdGljIENsYXNzIHVuaXF1ZUNsYXNzQ2FjaGU7Ci1zdGF0aWMgTWV0aG9kW10gdW5pcXVlTWV0aG9kc0NhY2hlOwotc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzTmF0aXZlVW5pcXVlKE1ldGhvZCBtZXRob2QpIHsKLQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCU9iamVjdCB1bmlxdWUgPSB1bmlxdWVDYWNoZS5nZXQobWV0aG9kKTsKLQlpZiAodW5pcXVlICE9IG51bGwpIHJldHVybiAoKEJvb2xlYW4pdW5pcXVlKS5ib29sZWFuVmFsdWUoKTsKLQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JTWV0aG9kW10gbWV0aG9kczsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQlpZiAoY2xhenouZXF1YWxzKHVuaXF1ZUNsYXNzQ2FjaGUpKSB7Ci0JCW1ldGhvZHMgPSB1bmlxdWVNZXRob2RzQ2FjaGU7Ci0JfSBlbHNlIHsKLQkJbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQl1bmlxdWVDbGFzc0NhY2hlID0gY2xheno7Ci0JCXVuaXF1ZU1ldGhvZHNDYWNoZSA9IG1ldGhvZHM7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbXRoID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtdGguZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpICE9IDAgJiYKLQkJCW1ldGhvZCAhPSBtdGggJiYgIW1ldGhvZC5lcXVhbHMobXRoKSAmJgotCQkJbmFtZS5lcXVhbHMobXRoLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCXVuaXF1ZUNhY2hlLnB1dChtZXRob2QsIG5ldyBCb29sZWFuKHJlc3VsdCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoTWV0aG9kW10gbWV0aG9kcykgewotCUFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlNZXRob2QgbXRoMSA9IChNZXRob2QpYTsKLQkJCU1ldGhvZCBtdGgyID0gKE1ldGhvZCliOwotCQkJaW50IHJlc3VsdCA9IG10aDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtdGgyLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IDAgPyByZXN1bHQgOiBnZXRGdW5jdGlvbk5hbWUobXRoMSkuY29tcGFyZVRvKGdldEZ1bmN0aW9uTmFtZShtdGgyKSk7Ci0JCX0KLQl9KTsKLX0KLQotc3RhdGljIHZvaWQgc29ydChGaWVsZFtdIGZpZWxkcykgewotCUFycmF5cy5zb3J0KGZpZWxkcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKEZpZWxkKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChGaWVsZCliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JQXJyYXlzLnNvcnQoY2xhc3NlcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKENsYXNzKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChDbGFzcyliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7CQotfQotCi1zdGF0aWMgU3RyaW5nIHRvQyhTdHJpbmcgc3RyKSB7Ci0JaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiAyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXyc6IGJ1ZmZlci5hcHBlbmQoIl8xIik7IGJyZWFrOwotCQkJY2FzZSAnOyc6IGJ1ZmZlci5hcHBlbmQoIl8yIik7IGJyZWFrOwotCQkJY2FzZSAnWyc6IGJ1ZmZlci5hcHBlbmQoIl8zIik7IGJyZWFrOwotCQkJY2FzZSAnLic6IGJ1ZmZlci5hcHBlbmQoIl8iKTsgYnJlYWs7Ci0JCQljYXNlICcvJzogYnVmZmVyLmFwcGVuZCgiXyIpOyBicmVhazsKLQkJCWRlZmF1bHQ6IGJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eik7Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29weXJpZ2h0KCkgewotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlpZiAoY2xhc3NlcyA9PSBudWxsKSByZXR1cm47Ci0JZ2VuZXJhdGVDb3B5cmlnaHQoKTsKLQlnZW5lcmF0ZUluY2x1ZGVzKCk7Ci0Jc29ydChjbGFzc2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlDbGFzc0RhdGEgZGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoY2xhenopOwotCQlpZiAoZGF0YS5nZXRGbGFnKCJjcHAiKSkgewotCQkJaXNDUFAgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJaWYgKGdldEdlbmVyYXRlKGNsYXp6KSkgZ2VuZXJhdGUoY2xhenopOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlvdXRwdXQuZmx1c2goKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShTdHJpbmcga2V5KSB7Ci0JTWV0YURhdGEgbXQgPSBnZXRNZXRhRGF0YSgpOwotCVN0cmluZyBkYXRhID0gbXQuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCW91dHB1dGxuKGZpeERlbGltaXRlcihkYXRhKSk7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGdldEdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JQ2xhc3NEYXRhIGRhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGNsYXp6KTsKLQlyZXR1cm4gIWRhdGEuZ2V0RmxhZygibm9fZ2VuIik7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldENQUCgpIHsKLQlyZXR1cm4gaXNDUFA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVsaW1pdGVyKCkgewotCXJldHVybiBkZWxpbWl0ZXI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBnZXRDUFAoKSA/ICIuY3BwIiA6ICIuYyI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JcmV0dXJuIGdldE91dHB1dE5hbWUoKSArIGdldFN1ZmZpeCgpICsgZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBQcmludFN0cmVhbSBnZXRPdXRwdXQoKSB7Ci0JcmV0dXJuIG91dHB1dDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCXJldHVybiBnZXRDbGFzc05hbWUoZ2V0TWFpbkNsYXNzKCkpLnRvTG93ZXJDYXNlKCk7Ci19Ci0KLXB1YmxpYyBDbGFzcyBnZXRNYWluQ2xhc3MoKSB7Ci0JcmV0dXJuIG1haW5DbGFzczsKLX0KLQotcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgewotCXJldHVybiBtZXRhRGF0YTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybSgpIHsKLQlyZXR1cm4gU1dULmdldFBsYXRmb3JtKCk7Ci19Ci0KLXB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCXJldHVybiBwcm9ncmVzczsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0JcmV0dXJuICIiOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXQoU3RyaW5nIHN0cikgewotCW91dHB1dC5wcmludChzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXRsbigpIHsKLQlvdXRwdXQoZ2V0RGVsaW1pdGVyKCkpOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXRsbihTdHJpbmcgc3RyKSB7Ci0Jb3V0cHV0KHN0cik7Ci0Jb3V0cHV0KGdldERlbGltaXRlcigpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2xhc3NlcyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0aGlzLmNsYXNzZXMgPSBjbGFzc2VzOwotfQotCi1wdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoQ2xhc3MgbWFpbkNsYXNzKSB7Ci0JdGhpcy5tYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1ldGFEYXRhIGRhdGEpIHsKLQltZXRhRGF0YSA9IGRhdGE7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE91dHB1dChQcmludFN0cmVhbSBvdXRwdXQpIHsKLQl0aGlzLm91dHB1dCA9IG91dHB1dDsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCXRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzczsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyODNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1wdWJsaWMgY2xhc3MgSk5JR2VuZXJhdG9yQXBwIHsKLQotCUNsYXNzIG1haW5DbGFzczsKLQlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3M7Ci0JU3RyaW5nIG1haW5DbGFzc05hbWUsIG91dHB1dERpciwgY2xhc3NwYXRoOwotCU1ldGFEYXRhIG1ldGFEYXRhOwotCi1wdWJsaWMgSk5JR2VuZXJhdG9yQXBwKCkgewotfQotCi1wdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLQlyZXR1cm4gY2xhc3NwYXRoOwotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0TWFpbkNsYXNzKCkgewotCXJldHVybiBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gbWFpbkNsYXNzTmFtZTsKLX0KLQotcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgewotCXJldHVybiBtZXRhRGF0YTsKLX0KLQotU3RyaW5nIGdldE1ldGFEYXRhRGlyKCkgewotCXJldHVybiAiLi9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvIjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXIoKSB7Ci0JcmV0dXJuIG91dHB1dERpcjsKLX0KLQotdm9pZCBnZW5lcmF0ZVNUQVRTX0MoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJU3RhdHNHZW5lcmF0b3IgZ2VuID0gbmV3IFN0YXRzR2VuZXJhdG9yKGZhbHNlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU1RBVFNfSChDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdGF0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RhdHNHZW5lcmF0b3IodHJ1ZSk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUUlVDVFNfSChDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKHRydWUpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzcyk7Ci0JCWdlbi5zZXRDbGFzc2VzKGNsYXNzZXMpOwotCQlnZW4uc2V0TWV0YURhdGEobWV0YURhdGEpOwotCQlnZW4uc2V0UHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZ2VuLnNldE91dHB1dChuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgb3V0cHV0RGlyICsgZ2VuLmdldEZpbGVOYW1lKCkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUUlVDVFNfQyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKGZhbHNlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCi19Ci0KLXZvaWQgZ2VuZXJhdGVTV1RfQyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotCi12b2lkIGdlbmVyYXRlTWV0YURhdGEoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJTWV0YURhdGFHZW5lcmF0b3IgZ2VuID0gbmV3IE1ldGFEYXRhR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmICghbmV3IEZpbGUoZ2V0TWV0YURhdGFEaXIoKSkuZXhpc3RzKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogTWV0YSBkYXRhIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3QiKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgZ2V0TWV0YURhdGFEaXIoKSArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlnZW5lcmF0ZShudWxsKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJJbml0aWFsaXppbmcuLi4iKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKCk7Ci0JQ2xhc3NbXSBuYXRpdmVzID0gZ2V0TmF0aXZlc0NsYXNzZXMoKTsKLQlDbGFzc1tdIHN0cnVjdHMgPSBnZXRTdHJ1Y3R1cmVDbGFzc2VzKCk7Ci0JdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSB7Ci0JCWludCBuYXRpdmVDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmF0aXZlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgY2xhenogPSBuYXRpdmVzW2ldOwotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbal07Ci0JCQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQkJCW5hdGl2ZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaW50IHRvdGFsID0gbmF0aXZlQ291bnQgKiA0OwotCQl0b3RhbCArPSBjbGFzc2VzLmxlbmd0aDsKLQkJdG90YWwgKz0gbmF0aXZlcy5sZW5ndGggKiAzOwotCQl0b3RhbCArPSBzdHJ1Y3RzLmxlbmd0aCAqIDI7Ci0JCXByb2dyZXNzLnNldFRvdGFsKHRvdGFsKTsKLQkJcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBzdHJ1Y3RzLmggLi4uIik7Ci0JfQotCWdlbmVyYXRlU1RSVUNUU19IKHN0cnVjdHMpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJHZW5lcmF0aW5nIHN0cnVjdHMuYyAuLi4iKTsKLQlnZW5lcmF0ZVNUUlVDVFNfQyhzdHJ1Y3RzKTsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBuYXRpdmVzIC4uLiIpOwotCWdlbmVyYXRlU1dUX0MobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RhdHMuaCAuLi4iKTsKLQlnZW5lcmF0ZVNUQVRTX0gobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RhdHMuYyAuLi4iKTsKLQlnZW5lcmF0ZVNUQVRTX0MobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgbWV0YSBkYXRhIC4uLiIpOwotCWdlbmVyYXRlTWV0YURhdGEoY2xhc3Nlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkRvbmUuIik7Ci0JdGhpcy5wcm9ncmVzcyA9IG51bGw7Ci19Ci0KLWJvb2xlYW4gY29tcGFyZShJbnB1dFN0cmVhbSBpczEsIElucHV0U3RyZWFtIGlzMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl3aGlsZSAodHJ1ZSkgewotCQlpbnQgYzEgPSBpczEucmVhZCgpOwotCQlpbnQgYzIgPSBpczIucmVhZCgpOwotCQlpZiAoYzEgIT0gYzIpIHJldHVybiBmYWxzZTsKLQkJaWYgKGMxID09IC0xKSBicmVhazsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgb3V0cHV0KGJ5dGVbXSBieXRlcywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCUZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JdHJ5IHsKLQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJaWYgKGNvbXBhcmUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMpKSkgcmV0dXJuOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCX0KLQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQlvdXQud3JpdGUoYnl0ZXMpOwotCW91dC5jbG9zZSgpOwotfQotCi1TdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCWludCBkb3QgPSBtYWluQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGRvdCA9PSAtMSkgcmV0dXJuICIiOwotCXJldHVybiBtYWluQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBkb3QpOwotfQotCi1TdHJpbmdbXSBnZXRDbGFzc05hbWVzKFN0cmluZyBtYWluQ2xhc3NOYW1lKSB7Ci0JU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQlTdHJpbmcgY2xhc3NwYXRoID0gZ2V0Q2xhc3NwYXRoKCk7Ci0JaWYgKGNsYXNzcGF0aCA9PSBudWxsKSBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOwotCVN0cmluZyBwa2dQYXRoID0gcGtnTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQlTdHJpbmcgcGtnWmlwUGF0aCA9IHBrZ05hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0JQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQotCWludCBzdGFydCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBjbGFzc3BhdGgubGVuZ3RoKCkpIHsKLQkJaW5kZXggPSBjbGFzc3BhdGguaW5kZXhPZihGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCBzdGFydCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgaW5kZXggPSBjbGFzc3BhdGgubGVuZ3RoKCk7Ci0JCVN0cmluZyBwYXRoID0gY2xhc3NwYXRoLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQlpZiAocGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShwYXRoKTsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwa2daaXBQYXRoKSAmJiBuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG5hbWUuc3Vic3RyaW5nKHBrZ1ppcFBhdGgubGVuZ3RoKCkgKyAxLCBuYW1lLmxlbmd0aCgpIC0gNik7Ci0JCQkJCQljbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCQljbGFzc2VzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoemlwRmlsZSAhPSBudWxsKSB6aXBGaWxlLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBwa2dQYXRoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nW10gZW50cmllcyA9IGZpbGUubGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlLCBlbnRyeSk7Ci0JCQkJCWlmICghZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlpZiAoZi5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZW50cnkuc3Vic3RyaW5nKDAsIGVudHJ5Lmxlbmd0aCgpIC0gNik7Ci0JCQkJCQkJY2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBFcnJvcigiU1VCRElSIE5PVCBET05FPSIgKyBmKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXN0YXJ0ID0gaW5kZXggKyAxOwotCX0KLQlyZXR1cm4gKFN0cmluZ1tdKWNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nW2NsYXNzZXMuc2l6ZSgpXSk7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuIG5ldyBDbGFzc1swXTsKLQlTdHJpbmdbXSBjbGFzc05hbWVzID0gZ2V0Q2xhc3NOYW1lcyhtYWluQ2xhc3NOYW1lKTsKLQlBcnJheXMuc29ydChjbGFzc05hbWVzKTsKLQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbY2xhc3NOYW1lcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lc1tpXTsKLQkJdHJ5IHsKLQkJCWNsYXNzZXNbaV0gPSBDbGFzcy5mb3JOYW1lKHBhY2thZ2VOYW1lICsgIi4iICsgY2xhc3NOYW1lLCBmYWxzZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldE5hdGl2ZXNDbGFzc2VzKCkgewotCWlmIChtYWluQ2xhc3NOYW1lID09IG51bGwpIHJldHVybiBuZXcgQ2xhc3NbMF07Ci0JQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2pdOwotCQkJaW50IG1vZHMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoKG1vZHMgJiBNb2RpZmllci5OQVRJVkUpICE9IDApIHsKLQkJCQlyZXN1bHQuYWRkKGNsYXp6KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gKENsYXNzW10pcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdC5zaXplKCldKTsKLX0KLQotcHVibGljIENsYXNzW10gZ2V0U3RydWN0dXJlQ2xhc3NlcygpIHsKLQlpZiAobWFpbkNsYXNzTmFtZSA9PSBudWxsKSByZXR1cm4gbmV3IENsYXNzWzBdOwotCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JQ2xhc3NbXSBjbGFzc2VzID0gZ2V0Q2xhc3NlcygpOwotCW91dGVyOgotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tqXTsKLQkJCWludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJaWYgKChtb2RzICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSBjb250aW51ZSBvdXRlcjsKLQkJfQotCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQlib29sZWFuIGhhc1B1YmxpY0ZpZWxkcyA9IGZhbHNlOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkcy5sZW5ndGg7IGorKykgewotCQkJRmllbGQgZmllbGQgPSBmaWVsZHNbal07Ci0JCQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQkJaWYgKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSAhPSAwICYmIChtb2RzICYgTW9kaWZpZXIuU1RBVElDKSA9PSAwKSB7Ci0JCQkJaGFzUHVibGljRmllbGRzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWhhc1B1YmxpY0ZpZWxkcykgY29udGludWU7Ci0JCXJlc3VsdC5hZGQoY2xhenopOwotCX0KLQlyZXR1cm4gKENsYXNzW10pcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdC5zaXplKCldKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFN0cmluZyBjbGFzc3BhdGgpIHsKLQl0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLX0KLQotcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzTmFtZShTdHJpbmcgc3RyKSB7Ci0JbWFpbkNsYXNzTmFtZSA9IHN0cjsKLQltZXRhRGF0YSA9IG5ldyBNZXRhRGF0YShtYWluQ2xhc3NOYW1lKTsKLQlTdHJpbmcgbWFpbkNsYXNzZXMgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKCJzd3RfbWFpbl9jbGFzc2VzIiwgbnVsbCk7Ci0JaWYgKG1haW5DbGFzc2VzICE9IG51bGwpIHsKLQkJU3RyaW5nW10gbGlzdCA9IEl0ZW1EYXRhLnNwbGl0KG1haW5DbGFzc2VzLCAiLCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKLQkJCWlmIChtYWluQ2xhc3NOYW1lLmVxdWFscyhsaXN0W2ldLnRyaW0oKSkpIHsKLQkJCQlzZXRPdXRwdXREaXIobGlzdFtpICsgMV0udHJpbSgpKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobWFpbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQltYWluQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG1haW5DbGFzc05hbWUsIGZhbHNlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyKFN0cmluZyBzdHIpIHsKLQlpZiAoc3RyICE9IG51bGwpIHsKLQkJaWYgKCFzdHIuZW5kc1dpdGgoIlxcIikgJiYgIXN0ci5lbmRzV2l0aCgiLyIpICkgewotCQkJc3RyICs9IEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JfQotCW91dHB1dERpciA9IHN0cjsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdE1haW5DbGFzcygpIHsKLQlyZXR1cm4gIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4iICsgZ2V0RGVmYXVsdFBsYXRmb3JtKCkgKyAiLk9TIjsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBsYXRmb3JtKCkgewotCXJldHVybiBTV1QuZ2V0UGxhdGZvcm0oKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCUpOSUdlbmVyYXRvckFwcCBnZW4gPSBuZXcgSk5JR2VuZXJhdG9yQXBwICgpOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoYXJnc1swXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDEpIGdlbi5zZXRPdXRwdXREaXIoYXJnc1sxXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDIpIGdlbi5zZXRDbGFzc3BhdGgoYXJnc1syXSk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoZ2V0RGVmYXVsdE1haW5DbGFzcygpKTsKLQl9Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHBVSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcFVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTljYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcFVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIEpOSUdlbmVyYXRvckFwcFVJIHsKLQotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQkKLQlDb21wb3NpdGUgYWN0aW9uc1BhbmVsOwotCUNvbWJvIG1haW5DbGFzc0NiLCBvdXRwdXREaXJDYjsKLQlUYWJsZSBjbGFzc2VzTHQsIG1lbWJlcnNMdCwgcGFyYW1zTHQ7Ci0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0JTGFiZWwgcHJvZ3Jlc3NMYWJlbDsKLQlGaWxlRGlhbG9nIGZpbGVEaWFsb2c7Ci0JCi0JVGFibGVFZGl0b3IgcGFyYW1UZXh0RWRpdG9yLCBtZW1iZXJUZXh0RWRpdG9yLCBjbGFzc1RleHRFZGl0b3I7Ci0JRmxhZ3NFZGl0b3IgcGFyYW1MaXN0RWRpdG9yLCBtZW1iZXJMaXN0RWRpdG9yLCBjbGFzc0xpc3RFZGl0b3I7Ci0JVGV4dCBwYXJhbUVkaXRvclR4LCBtZW1iZXJFZGl0b3JUeCwgY2xhc3NFZGl0b3JUeDsKLQlMaXN0IHBhcmFtRWRpdG9yTHQsIG1lbWJlckVkaXRvckx0LCBjbGFzc0VkaXRvckx0OwotCQotCXN0YXRpYyBjbGFzcyBGbGFnc0VkaXRvciB7Ci0JCVRhYmxlIHBhcmVudDsKLQkJaW50IGNvbHVtbiA9IC0xOwotCQlUYWJsZUl0ZW0gaXRlbTsKLQkJCi0JCXB1YmxpYyBGbGFnc0VkaXRvcihUYWJsZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJCXJldHVybiBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBUYWJsZUl0ZW0gZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oaW50IGNvbHVtbikgewotCQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCX0KLQl9Ci0JCi0JSk5JR2VuZXJhdG9yQXBwIGFwcDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfTkFNRV9DT0xVTU4gPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfRkxBR1NfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IENMQVNTX0VYQ0xVREVfQ09MVU1OID0gMjsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX0ZMQUdTX0NPTFVNTiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9DQVNUX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4gPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgRklFTERfRVhDTFVERV9DT0xVTU4gPSA0OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9GTEFHU19DT0xVTU4gPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBNRVRIT0RfRVhDTFVERV9DT0xVTU4gPSAzOwotCQotCXN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fSU5ERVhfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX1RZUEVfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX0ZMQUdTX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQQVJBTV9DQVNUX0NPTFVNTiA9IDM7Ci0JCi1wdWJsaWMgSk5JR2VuZXJhdG9yQXBwVUkoKSB7Ci0JdGhpcyAobmV3IEpOSUdlbmVyYXRvckFwcCgpKTsKLX0KLQotcHVibGljIEpOSUdlbmVyYXRvckFwcFVJKEpOSUdlbmVyYXRvckFwcCBhcHApIHsKLQl0aGlzLmFwcCA9IGFwcDsKLX0KLQotdm9pZCBjbGVhbnVwKCkgewotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi12b2lkIGdlbmVyYXRlU3RydWN0c0hlYWRlciAoKSB7Ci0JU3RydWN0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RydWN0c0dlbmVyYXRvcih0cnVlKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTdHJ1Y3RzICgpIHsKLQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKGZhbHNlKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTaXplb2YgKCkgewotCVNpemVvZkdlbmVyYXRvciBnZW4gPSBuZXcgU2l6ZW9mR2VuZXJhdG9yKCk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCWdlbi5nZW5lcmF0ZSgpOwotfQotCi12b2lkIGdlbmVyYXRlTWV0YURhdGEgKCkgewotCU1ldGFEYXRhR2VuZXJhdG9yIGdlbiA9IG5ldyBNZXRhRGF0YUdlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRTZWxlY3RlZE1ldGhvZHMoKTsKLQlpZiAobWV0aG9kcy5sZW5ndGggIT0gMCkgewotCQlnZW4uZ2VuZXJhdGUobWV0aG9kcyk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVOYXRpdmVzICgpIHsKLQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGdldFNlbGVjdGVkTWV0aG9kcygpOwotCWlmIChtZXRob2RzLmxlbmd0aCAhPSAwKSB7Ci0JCWdlbi5nZW5lcmF0ZShtZXRob2RzKTsKLQl9IGVsc2UgewotCQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUFsbCgpIHsKLQlpZiAoIXVwZGF0ZU91dHB1dERpcigpKSByZXR1cm47Ci0JQ3Vyc29yIGN1cnNvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKGN1cnNvcik7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JQ29udHJvbFtdIGNoaWxkcmVuID0gYWN0aW9uc1BhbmVsLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgY2hpbGQuc2V0RW5hYmxlZChmYWxzZSk7CQkJCQotCX0KLQlmaW5hbCBib29sZWFuIHNob3dQcm9ncmVzcyA9IHRydWU7Ci0JaWYgKHNob3dQcm9ncmVzcykgewotCQlwcm9ncmVzc0xhYmVsLnNldFRleHQoIiIpOwotCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JZmluYWwgYm9vbGVhbltdIGRvbmUgPSBuZXcgYm9vbGVhblsxXTsKLQluZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWFwcC5nZW5lcmF0ZSghc2hvd1Byb2dyZXNzID8gbnVsbCA6IG5ldyBQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNldFRvdGFsKGZpbmFsIGludCB0b3RhbCkgewotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKHRvdGFsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzdGVwKCkgewotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24ocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgKyAxKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsJCQkJCQotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcHJvZ3Jlc3NMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJCQkJCQlwcm9ncmVzc0xhYmVsLnVwZGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRvbmVbMF0gPSB0cnVlOwotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9Ci0JfS5zdGFydCgpOwotCXdoaWxlICghZG9uZVswXSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgY2hpbGQuc2V0RW5hYmxlZCh0cnVlKTsJCQkJCi0JfQotCWlmIChzaG93UHJvZ3Jlc3MpIHsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotfQotCi12b2lkIGdlbmVyYXRlQ29uc3RhbnRzICgpIHsKLQlDb25zdGFudHNHZW5lcmF0b3IgZ2VuID0gbmV3IENvbnN0YW50c0dlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCUZpZWxkW10gZmllbGRzID0gZ2V0U2VsZWN0ZWRGaWVsZHMoKTsKLQlpZiAoZmllbGRzLmxlbmd0aCAhPSAwKSB7Ci0JCWdlbi5nZW5lcmF0ZShmaWVsZHMpOwotCX0gZWxzZSB7Ci0JCWdlbi5zZXRDbGFzc2VzKGdldFNlbGVjdGVkQ2xhc3NlcygpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JfQotfQotCi1DbGFzc1tdIGdldFNlbGVjdGVkQ2xhc3NlcygpIHsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNsYXNzZXNMdC5nZXRTZWxlY3Rpb24oKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbaXRlbXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWNsYXNzZXNbaV0gPSAoKENsYXNzRGF0YSlpdGVtLmdldERhdGEoKSkuZ2V0Q2xhenooKTsKLQl9Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLU1ldGhvZFtdIGdldFNlbGVjdGVkTWV0aG9kcygpIHsKLQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSBtZW1iZXJzTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IG5ldyBNZXRob2Rbc2VsZWN0aW9uLmxlbmd0aF07Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IHNlbGVjdGlvbiBbaV07Ci0JCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotCQkJTWV0aG9kIG1ldGhvZCA9ICgoTWV0aG9kRGF0YSlkYXRhKS5nZXRNZXRob2QoKTsKLQkJCW1ldGhvZHNbY291bnQrK10gPSBtZXRob2Q7Ci0JCX0KLQl9Ci0JaWYgKGNvdW50ICE9IG1ldGhvZHMubGVuZ3RoKSB7Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQltZXRob2RzID0gcmVzdWx0OwotCX0KLQlyZXR1cm4gbWV0aG9kczsKLX0KLQotRmllbGRbXSBnZXRTZWxlY3RlZEZpZWxkcygpIHsKLQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSBtZW1iZXJzTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JRmllbGRbXSBmaWVsZHMgPSBuZXcgRmllbGRbc2VsZWN0aW9uLmxlbmd0aF07Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IHNlbGVjdGlvbiBbaV07Ci0JCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgRmllbGREYXRhKSB7Ci0JCQlGaWVsZCBmaWVsZCA9ICgoRmllbGREYXRhKWRhdGEpLmdldEZpZWxkKCk7Ci0JCQlmaWVsZHNbY291bnQrK10gPSBmaWVsZDsKLQkJfQotCX0KLQlpZiAoY291bnQgIT0gZmllbGRzLmxlbmd0aCkgewotCQlGaWVsZFtdIHJlc3VsdCA9IG5ldyBGaWVsZFtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZmllbGRzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJZmllbGRzID0gcmVzdWx0OwotCX0KLQlyZXR1cm4gZmllbGRzOwotfQotCi1wdWJsaWMgdm9pZCBvcGVuICgpIHsKLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJKTkkgR2VuZXJhdG9yIik7Ci0KLQlHcmlkRGF0YSBkYXRhOwotCUdyaWRMYXlvdXQgc2hlbGxMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCXNoZWxsTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCXNoZWxsLnNldExheW91dChzaGVsbExheW91dCk7Ci0JCi0JQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlwYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCUdyaWRMYXlvdXQgcGFuZWxMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCXBhbmVsTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXBhbmVsLnNldExheW91dChwYW5lbExheW91dCk7Ci0JCi0JTGlzdGVuZXIgdXBkYXRlTWFpbkNsYXNzTGlzdGVuZXIgPSAgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQl1cGRhdGVNYWluQ2xhc3MoKTsKLQkJCWlmICghdXBkYXRlT3V0cHV0RGlyKCkpIHJldHVybjsKLQkJCXVwZGF0ZUNsYXNzZXMoKTsKLQkJCXVwZGF0ZU1lbWJlcnMoKTsKLQkJCXVwZGF0ZVBhcmFtZXRlcnMoKTsKLQkJfQotCX07CQotCWNyZWF0ZU1haW5DbGFzc1BhbmVsKHBhbmVsLCB1cGRhdGVNYWluQ2xhc3NMaXN0ZW5lcik7Ci0JY3JlYXRlQ2xhc3Nlc1BhbmVsKHBhbmVsKTsKLQljcmVhdGVNZW1iZXJzUGFuZWwocGFuZWwpOwotCWNyZWF0ZVBhcmFtZXRlcnNQYW5lbChwYW5lbCk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9ucyhzaGVsbCk7Ci0KLQlQb2ludCBwcmVmZXJyZWRTaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlzaGVsbC5zZXRTaXplKHNoZWxsLmdldFNpemUoKS54LCBwcmVmZXJyZWRTaXplLnkpOwotCQotCXVwZGF0ZU1haW5DbGFzcygpOwotCXVwZGF0ZUNsYXNzZXMoKTsKLQl1cGRhdGVNZW1iZXJzKCk7Ci0JdXBkYXRlUGFyYW1ldGVycygpOwotfQotCi12b2lkIGNyZWF0ZU1haW5DbGFzc1BhbmVsKENvbXBvc2l0ZSBwYW5lbCwgTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpIHsKLQlMYWJlbCBtYWluQ2xhc3NMYiA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCW1haW5DbGFzc0xiLnNldFRleHQoIiZNYWluIENsYXNzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQltYWluQ2xhc3NDYiA9IG5ldyBDb21ibyhwYW5lbCwgU1dULkRST1BfRE9XTik7Ci0JU3RyaW5nIG1haW5DbGFzcyA9IGFwcC5nZXRNYWluQ2xhc3NOYW1lKCk7Ci0JbWFpbkNsYXNzQ2Iuc2V0VGV4dChtYWluQ2xhc3MgPT0gbnVsbCA/ICIiIDogbWFpbkNsYXNzKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JbWFpbkNsYXNzQ2Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQltYWluQ2xhc3NDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0JbWFpbkNsYXNzQ2IuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHVwZGF0ZUxpc3RlbmVyKTsKLQotCUxhYmVsIG91dHB1dERpckxiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0Jb3V0cHV0RGlyTGIuc2V0VGV4dCgiJk91dHB1dCBEaXI6Iik7Ci0JCi0Jb3V0cHV0RGlyQ2IgPSBuZXcgQ29tYm8ocGFuZWwsIFNXVC5EUk9QX0RPV04pOwotCVN0cmluZyBvdXRwdXREaXIgPSBhcHAuZ2V0T3V0cHV0RGlyKCk7Ci0Jb3V0cHV0RGlyQ2Iuc2V0VGV4dChvdXRwdXREaXIgPT0gbnVsbCA/ICIiIDogb3V0cHV0RGlyKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0Jb3V0cHV0RGlyQ2Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlvdXRwdXREaXJDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0Jb3V0cHV0RGlyQ2IuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHVwZGF0ZUxpc3RlbmVyKTsKLQotCVN0cmluZyBtYWluQ2xhc3NlcyA9IGFwcC5nZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKCJzd3RfbWFpbl9jbGFzc2VzIiwgbnVsbCk7Ci0JaWYgKG1haW5DbGFzc2VzICE9IG51bGwpIHsKLQkJU3RyaW5nW10gbGlzdCA9IEl0ZW1EYXRhLnNwbGl0KG1haW5DbGFzc2VzLCAiLCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKLQkJCW1haW5DbGFzc0NiLmFkZChsaXN0W2ldLnRyaW0oKSk7Ci0JCQlvdXRwdXREaXJDYi5hZGQobGlzdFtpICsgMV0udHJpbSgpKTsKLQkJfQotCX0KLX0KLQotdm9pZCBjcmVhdGVDbGFzc2VzUGFuZWwoQ29tcG9zaXRlIHBhbmVsKSB7Ci0JTGFiZWwgY2xhc3Nlc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JY2xhc3Nlc0xiLnNldFRleHQoIiZDbGFzc2VzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQljbGFzc2VzTHQgPSBuZXcgVGFibGUocGFuZWwsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBjbGFzc2VzTHQuZ2V0SXRlbUhlaWdodCgpICogNjsKLQljbGFzc2VzTHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQljbGFzc2VzTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQljbGFzc2VzTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVNZW1iZXJzKCk7Ci0JCQkJdXBkYXRlUGFyYW1ldGVycygpOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihjbGFzc2VzTHQsIFNXVC5OT05FLCBDTEFTU19OQU1FX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkNsYXNzIik7Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGNsYXNzZXNMdCwgU1dULk5PTkUsIENMQVNTX0ZMQUdTX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JLyoKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oY2xhc3Nlc0x0LCBTV1QuTk9ORSwgQ0xBU1NfRVhDTFVERV9DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJFeGNsdWRlIik7Ci0JKi8KLQkKLQljbGFzc1RleHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IoY2xhc3Nlc0x0KTsKLQljbGFzc1RleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWNsYXNzRWRpdG9yVHggPSBuZXcgVGV4dChjbGFzc2VzTHQsIFNXVC5TSU5HTEUpOwotCWNsYXNzVGV4dEVkaXRvci5zZXRFZGl0b3IoY2xhc3NFZGl0b3JUeCk7Ci0JTGlzdGVuZXIgY2xhc3NUZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQljbGFzc1RleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWNsYXNzRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGNsYXNzVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gY2xhc3NUZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IChDbGFzc0RhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoY29sdW1uID09IENMQVNTX0VYQ0xVREVfQ09MVU1OKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBjbGFzc0VkaXRvclR4LmdldFRleHQoKTsKLQkJCQljbGFzc0RhdGEuc2V0RXhjbHVkZSh0ZXh0KTsKLQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBjbGFzc0RhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKGNsYXNzRGF0YS5nZXRDbGF6eigpLCBjbGFzc0RhdGEpOwotCQkJCWNsYXNzZXNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWNsYXNzRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGNsYXNzVGV4dExpc3RlbmVyKTsKLQljbGFzc0VkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY2xhc3NUZXh0TGlzdGVuZXIpOwotCWNsYXNzRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBjbGFzc1RleHRMaXN0ZW5lcik7Ci0JCi0JZmluYWwgU2hlbGwgZmxvYXRlciA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5PX1RSSU0pOwotCWZsb2F0ZXIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWNsYXNzTGlzdEVkaXRvciA9IG5ldyBGbGFnc0VkaXRvcihjbGFzc2VzTHQpOwotCWNsYXNzRWRpdG9yTHQgPSBuZXcgTGlzdChmbG9hdGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQljbGFzc0VkaXRvckx0LnNldEl0ZW1zKENsYXNzRGF0YS5nZXRBbGxGbGFncygpKTsKLQlmbG9hdGVyLnBhY2soKTsKLQlmbG9hdGVyLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQljbGFzc0xpc3RFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCUxpc3RlbmVyIGNsYXNzZXNMaXN0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBjbGFzc0xpc3RFZGl0b3IuZ2V0SXRlbSgpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGNvbHVtbiA9IGNsYXNzTGlzdEVkaXRvci5nZXRDb2x1bW4oKTsKLQkJCUNsYXNzRGF0YSBjbGFzc0RhdGEgPSAoQ2xhc3NEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBDTEFTU19GTEFHU19DT0xVTU4pIHsKLQkJCQlTdHJpbmdbXSBmbGFncyA9IGNsYXNzRWRpdG9yTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJY2xhc3NEYXRhLnNldEZsYWdzKGZsYWdzKTsKLQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBnZXRGbGFnc1N0cmluZyhjbGFzc0RhdGEuZ2V0RmxhZ3MoKSkpOwotCQkJCWl0ZW0uc2V0Q2hlY2tlZChjbGFzc0RhdGEuZ2V0R2VuZXJhdGUoKSk7Ci0JCQkJTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQkJCQltZXRhRGF0YS5zZXRNZXRhRGF0YShjbGFzc0RhdGEuZ2V0Q2xhenooKSwgY2xhc3NEYXRhKTsKLQkJCQljbGFzc2VzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBjbGFzc2VzTGlzdExpc3RlbmVyKTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY2xhc3Nlc0xpc3RMaXN0ZW5lcik7Ci0JY2xhc3NFZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGNsYXNzZXNMaXN0TGlzdGVuZXIpOwotCi0JY2xhc3Nlc0x0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGUueCwgZS55KTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gY2xhc3Nlc0x0LmdldEl0ZW0ocHQpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGNvbHVtbiA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzTHQuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHB0KSkgewotCQkJCQljb2x1bW4gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9CQkJCQotCQkJfQotCQkJaWYgKGNvbHVtbiA9PSAtMSkgcmV0dXJuOwotCQkJQ2xhc3NEYXRhIGRhdGEgPSAoQ2xhc3NEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBDTEFTU19FWENMVURFX0NPTFVNTikgewotCQkJCWNsYXNzVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQljbGFzc1RleHRFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQljbGFzc0VkaXRvclR4LnNldFRleHQoZGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCWNsYXNzRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJY2xhc3NFZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCWNsYXNzRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uID09IENMQVNTX0ZMQUdTX0NPTFVNTikgewotCQkJCWNsYXNzTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQljbGFzc0xpc3RFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQljbGFzc0VkaXRvckx0LnNldFNlbGVjdGlvbihkYXRhLmdldEZsYWdzKCkpOwotCQkJCWZsb2F0ZXIuc2V0TG9jYXRpb24oY2xhc3Nlc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCWZsb2F0ZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQljbGFzc0VkaXRvckx0LnNldEZvY3VzKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotdm9pZCBjcmVhdGVNZW1iZXJzUGFuZWwoQ29tcG9zaXRlIHBhbmVsKSB7Ci0JTGFiZWwgbWVtYmVyc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JbWVtYmVyc0xiLnNldFRleHQoIk1lbSZiZXJzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQltZW1iZXJzTHQgPSBuZXcgVGFibGUocGFuZWwsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBtZW1iZXJzTHQuZ2V0SXRlbUhlaWdodCgpICogNjsKLQltZW1iZXJzTHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQltZW1iZXJzTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVQYXJhbWV0ZXJzKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQltZW1iZXJUZXh0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yKG1lbWJlcnNMdCk7Ci0JbWVtYmVyVGV4dEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JbWVtYmVyRWRpdG9yVHggPSBuZXcgVGV4dChtZW1iZXJzTHQsIFNXVC5TSU5HTEUpOwotCW1lbWJlclRleHRFZGl0b3Iuc2V0RWRpdG9yKG1lbWJlckVkaXRvclR4KTsKLQlMaXN0ZW5lciBtZW1iZXJUZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQltZW1iZXJUZXh0RWRpdG9yLnNldEl0ZW0obnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQltZW1iZXJFZGl0b3JUeC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbWVtYmVyVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gbWVtYmVyVGV4dEVkaXRvci5nZXRDb2x1bW4oKTsKLQkJCUl0ZW1EYXRhIG1lbWJlckRhdGEgPSAoSXRlbURhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG1lbWJlckVkaXRvclR4LmdldFRleHQoKTsKLQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQlpZiAobWVtYmVyRGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJCUZpZWxkRGF0YSBmaWVsZERhdGEgPSAoRmllbGREYXRhKW1lbWJlckRhdGE7Ci0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSBGSUVMRF9DQVNUX0NPTFVNTjogewotCQkJCQkJZmllbGREYXRhLnNldENhc3QodGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBmaWVsZERhdGEuZ2V0Q2FzdCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgRklFTERfQUNDRVNTT1JfQ09MVU1OOiB7Ci0JCQkJCQlmaWVsZERhdGEuc2V0QWNjZXNzb3IodGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIEZJRUxEX0VYQ0xVREVfQ09MVU1OOiB7Ci0JCQkJCQlmaWVsZERhdGEuc2V0RXhjbHVkZSh0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGZpZWxkRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZmllbGREYXRhLmdldEZpZWxkKCksIGZpZWxkRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0gZWxzZSBpZiAobWVtYmVyRGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLQkJCQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSAoTWV0aG9kRGF0YSltZW1iZXJEYXRhOwotCQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJCWNhc2UgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTjogewotCQkJCQkJbWV0aG9kRGF0YS5zZXRBY2Nlc3Nvcih0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIG1ldGhvZERhdGEuZ2V0QWNjZXNzb3IoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE1FVEhPRF9FWENMVURFX0NPTFVNTjogewotCQkJCQkJbWV0aG9kRGF0YS5zZXRFeGNsdWRlKHRleHQpOwotCQkJCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEobWV0aG9kRGF0YS5nZXRNZXRob2QoKSwgbWV0aG9kRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JbWVtYmVyRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG1lbWJlclRleHRMaXN0ZW5lcik7Ci0JbWVtYmVyRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBtZW1iZXJUZXh0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbWVtYmVyVGV4dExpc3RlbmVyKTsKLQkKLQlmaW5hbCBTaGVsbCBmbG9hdGVyID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuTk9fVFJJTSk7Ci0JZmxvYXRlci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbWVtYmVyTGlzdEVkaXRvciA9IG5ldyBGbGFnc0VkaXRvcihtZW1iZXJzTHQpOwotCW1lbWJlckVkaXRvckx0ID0gbmV3IExpc3QoZmxvYXRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JZmxvYXRlci5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfSk7Ci0JTGlzdGVuZXIgbWVtYmVyTGlzdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbWVtYmVyTGlzdEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gbWVtYmVyTGlzdEVkaXRvci5nZXRDb2x1bW4oKTsKLQkJCUl0ZW1EYXRhIGRhdGEgPSAoSXRlbURhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlTdHJpbmdbXSBmbGFncyA9IG1lbWJlckVkaXRvckx0LmdldFNlbGVjdGlvbigpOwotCQkJZGF0YS5zZXRGbGFncyhmbGFncyk7Ci0JCQlpdGVtLnNldFRleHQoY29sdW1uLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChkYXRhLmdldEdlbmVyYXRlKCkpOwotCQkJTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgRmllbGREYXRhKSB7Ci0JCQkJRmllbGREYXRhIGZpZWxkRGF0YSA9IChGaWVsZERhdGEpZGF0YTsKLQkJCQltZXRhRGF0YS5zZXRNZXRhRGF0YShmaWVsZERhdGEuZ2V0RmllbGQoKSwgZmllbGREYXRhKTsKLQkJCQltZW1iZXJzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotCQkJCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IChNZXRob2REYXRhKWRhdGE7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEobWV0aG9kRGF0YS5nZXRNZXRob2QoKSwgbWV0aG9kRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JbWVtYmVyRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG1lbWJlckxpc3RMaXN0ZW5lcik7Ci0JbWVtYmVyRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBtZW1iZXJMaXN0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbWVtYmVyTGlzdExpc3RlbmVyKTsKLQkKLQltZW1iZXJzTHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5idXR0b24gIT0gMSkgcmV0dXJuOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBtZW1iZXJzTHQuZ2V0SXRlbShwdCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnNMdC5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMocHQpKSB7Ci0JCQkJCWNvbHVtbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0JCQkJCi0JCQl9Ci0JCQlpZiAoY29sdW1uID09IC0xKSByZXR1cm47Ci0JCQlJdGVtRGF0YSBpdGVtRGF0YSA9IChJdGVtRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJCUZpZWxkRGF0YSBkYXRhID0gKEZpZWxkRGF0YSlpdGVtRGF0YTsKLQkJCQlpZiAoY29sdW1uID09IEZJRUxEX0NBU1RfQ09MVU1OIHx8IGNvbHVtbiA9PSBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4gfHwgY29sdW1uID09IEZJRUxEX0VYQ0xVREVfQ09MVU1OKSB7Ci0JCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQkJU3RyaW5nIHRleHQgPSAiIjsKLQkJCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJCWNhc2UgRklFTERfQ0FTVF9DT0xVTU46IHRleHQgPSBkYXRhLmdldENhc3QoKTsgYnJlYWs7Ci0JCQkJCQljYXNlIEZJRUxEX0FDQ0VTU09SX0NPTFVNTjogdGV4dCA9IGRhdGEuZ2V0QWNjZXNzb3IoKTsgYnJlYWs7Ci0JCQkJCQljYXNlIEZJRUxEX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRFeGNsdWRlKCk7IGJyZWFrOwotCQkJCQl9Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNldFRleHQodGV4dCk7Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IEZJRUxEX0ZMQUdTX0NPTFVNTikgewotCQkJCQltZW1iZXJMaXN0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQltZW1iZXJMaXN0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCW1lbWJlckVkaXRvckx0LnNldEl0ZW1zKEZpZWxkRGF0YS5nZXRBbGxGbGFncygpKTsKLQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0U2VsZWN0aW9uKGRhdGEuZ2V0RmxhZ3MoKSk7Ci0JCQkJCWZsb2F0ZXIuc2V0TG9jYXRpb24obWVtYmVyc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCQlmbG9hdGVyLnBhY2soKTsKLQkJCQkJZmxvYXRlci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBNZXRob2REYXRhKSB7Ci0JCQkJTWV0aG9kRGF0YSBkYXRhID0gKE1ldGhvZERhdGEpaXRlbURhdGE7Ci0JCQkJaWYgKGNvbHVtbiA9PSBNRVRIT0RfRVhDTFVERV9DT0xVTU4gfHwgY29sdW1uID09IE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4pIHsKLQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQlTdHJpbmcgdGV4dCA9ICIiOwotCQkJCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJCQkJY2FzZSBNRVRIT0RfQUNDRVNTT1JfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRBY2Nlc3NvcigpOyBicmVhazsKLQkJCQkJCWNhc2UgTUVUSE9EX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRFeGNsdWRlKCk7IGJyZWFrOwotCQkJCQl9Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNldFRleHQodGV4dCk7Ci0JCQkJCW1lbWJlckVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IE1FVEhPRF9GTEFHU19DT0xVTU4pIHsKLQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRJdGVtcyhNZXRob2REYXRhLmdldEFsbEZsYWdzKCkpOwotCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRTZWxlY3Rpb24oZGF0YS5nZXRGbGFncygpKTsKLQkJCQkJZmxvYXRlci5zZXRMb2NhdGlvbihtZW1iZXJzTHQudG9EaXNwbGF5KGUueCwgZS55KSk7Ci0JCQkJCWZsb2F0ZXIucGFjaygpOwotCQkJCQlmbG9hdGVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCW1lbWJlckVkaXRvckx0LnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgY3JlYXRlUGFyYW1ldGVyc1BhbmVsKENvbXBvc2l0ZSBwYW5lbCkgewotCUxhYmVsIHBhcmFtc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFyYW1zTGIuc2V0VGV4dCgiJlBhcmFtZXRlcnM6Iik7Ci0JCi0JR3JpZERhdGEgZGF0YTsKLQlwYXJhbXNMdCA9IG5ldyBUYWJsZShwYW5lbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWludCBpdGVtSGVpZ2h0ID0gcGFyYW1zTHQuZ2V0SXRlbUhlaWdodCgpOwotCWRhdGEuaGVpZ2h0SGludCA9IGl0ZW1IZWlnaHQgKiA2OwotCXBhcmFtc0x0LnNldExheW91dERhdGEoZGF0YSk7Ci0JcGFyYW1zTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHBhcmFtc0x0LCBTV1QuTk9ORSwgUEFSQU1fSU5ERVhfQ09MVU1OKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9UWVBFX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIlR5cGUiKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9GTEFHU19DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJGbGFncyIpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYXJhbXNMdCwgU1dULk5PTkUsIFBBUkFNX0NBU1RfQ09MVU1OKTsKLQljb2x1bW4uc2V0VGV4dCgiQ2FzdCIpOwotCQotCXBhcmFtVGV4dEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihwYXJhbXNMdCk7Ci0JcGFyYW1UZXh0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQlwYXJhbUVkaXRvclR4ID0gbmV3IFRleHQocGFyYW1zTHQsIFNXVC5TSU5HTEUpOwotCXBhcmFtVGV4dEVkaXRvci5zZXRFZGl0b3IocGFyYW1FZGl0b3JUeCk7Ci0JTGlzdGVuZXIgcGFyYW1UZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQlwYXJhbVRleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXBhcmFtRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHBhcmFtVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gcGFyYW1UZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fQ0FTVF9DT0xVTU4pIHsKLQkJCQlTdHJpbmcgdGV4dCA9IHBhcmFtRWRpdG9yVHguZ2V0VGV4dCgpOwotCQkJCXBhcmFtRGF0YS5zZXRDYXN0KHRleHQpOwotCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIHBhcmFtRGF0YS5nZXRDYXN0KCkpOwotCQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEocGFyYW1EYXRhLmdldE1ldGhvZCgpLCBwYXJhbURhdGEuZ2V0UGFyYW1ldGVyKCksIHBhcmFtRGF0YSk7Ci0JCQkJcGFyYW1zTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQlwYXJhbUVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBwYXJhbVRleHRMaXN0ZW5lcik7Ci0JcGFyYW1FZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHBhcmFtVGV4dExpc3RlbmVyKTsKLQlwYXJhbUVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgcGFyYW1UZXh0TGlzdGVuZXIpOwotCQotCWZpbmFsIFNoZWxsIGZsb2F0ZXIgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5OT19UUklNKTsKLQlmbG9hdGVyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlwYXJhbUxpc3RFZGl0b3IgPSBuZXcgRmxhZ3NFZGl0b3IocGFyYW1zTHQpOwotCXBhcmFtRWRpdG9yTHQgPSBuZXcgTGlzdChmbG9hdGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlwYXJhbUVkaXRvckx0LnNldEl0ZW1zKFBhcmFtZXRlckRhdGEuZ2V0QWxsRmxhZ3MoKSk7Ci0JZmxvYXRlci5wYWNrKCk7Ci0JZmxvYXRlci5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJcGFyYW1MaXN0RWRpdG9yLnNldEl0ZW0obnVsbCk7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQlMaXN0ZW5lciBwYXJhbUxpc3RMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHBhcmFtTGlzdEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gcGFyYW1MaXN0RWRpdG9yLmdldENvbHVtbigpOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fRkxBR1NfQ09MVU1OKSB7Ci0JCQkJU3RyaW5nW10gZmxhZ3MgPSBwYXJhbUVkaXRvckx0LmdldFNlbGVjdGlvbigpOwotCQkJCXBhcmFtRGF0YS5zZXRGbGFncyhmbGFncyk7Ci0JCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgZ2V0RmxhZ3NTdHJpbmcocGFyYW1EYXRhLmdldEZsYWdzKCkpKTsKLQkJCQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKHBhcmFtRGF0YS5nZXRNZXRob2QoKSwgcGFyYW1EYXRhLmdldFBhcmFtZXRlcigpLCBwYXJhbURhdGEpOwotCQkJCXBhcmFtc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JcGFyYW1FZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgcGFyYW1MaXN0TGlzdGVuZXIpOwotCXBhcmFtRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBwYXJhbUxpc3RMaXN0ZW5lcik7Ci0JcGFyYW1FZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHBhcmFtTGlzdExpc3RlbmVyKTsKLQotCXBhcmFtc0x0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGUueCwgZS55KTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gcGFyYW1zTHQuZ2V0SXRlbShwdCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0x0LmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJCWlmIChpdGVtLmdldEJvdW5kcyhpKS5jb250YWlucyhwdCkpIHsKLQkJCQkJY29sdW1uID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCWlmIChjb2x1bW4gPT0gLTEpIHJldHVybjsKLQkJCVBhcmFtZXRlckRhdGEgZGF0YSA9IChQYXJhbWV0ZXJEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBQQVJBTV9DQVNUX0NPTFVNTikgewotCQkJCXBhcmFtVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQlwYXJhbVRleHRFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQlwYXJhbUVkaXRvclR4LnNldFRleHQoZGF0YS5nZXRDYXN0KCkpOwotCQkJCXBhcmFtRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJcGFyYW1FZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCXBhcmFtRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uID09IFBBUkFNX0ZMQUdTX0NPTFVNTikgewotCQkJCXBhcmFtTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQlwYXJhbUxpc3RFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQlwYXJhbUVkaXRvckx0LnNldFNlbGVjdGlvbihkYXRhLmdldEZsYWdzKCkpOwotCQkJCWZsb2F0ZXIuc2V0TG9jYXRpb24ocGFyYW1zTHQudG9EaXNwbGF5KGUueCwgZS55KSk7Ci0JCQkJZmxvYXRlci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCXBhcmFtRWRpdG9yTHQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfQotCX0pOwotfQotCi1CdXR0b24gY3JlYXRlQWN0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCUJ1dHRvbiBhY3Rpb24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWFjdGlvbi5zZXRUZXh0KHRleHQpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlhY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlhY3Rpb24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCXJldHVybiBhY3Rpb247Ci19Ci0KLXZvaWQgY3JlYXRlQWN0aW9uQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KSB7CQkKLQlhY3Rpb25zUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQlhY3Rpb25zUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JR3JpZExheW91dCBhY3Rpb25zTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlhY3Rpb25zTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCWFjdGlvbnNQYW5lbC5zZXRMYXlvdXQoYWN0aW9uc0xheW91dCk7Ci0JCi0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlICZBbGwiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlQWxsKCk7Ci0JCX0KLQl9KTsKLQkKLQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoYWN0aW9uc1BhbmVsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlzZXBhcmF0b3IgPSBuZXcgTGFiZWwoYWN0aW9uc1BhbmVsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgU3RydWN0cyAmSGVhZGVyIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZVN0cnVjdHNIZWFkZXIoKTsKLQkJfQotCX0pOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSAmU3RydWN0cyIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVTdHJ1Y3RzKCk7Ci0JCX0KLQl9KTsKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgJk5hdGl2ZXMiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlTmF0aXZlcygpOwotCQl9Ci0JfSk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlIE1ldGEgJkRhdGEiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlTWV0YURhdGEoKTsKLQkJfQotCX0pOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSBDb25zJnRhbnRzIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZUNvbnN0YW50cygpOwotCQl9Ci0JfSk7CQotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSBTaSZ6ZW9mIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZVNpemVvZigpOwotCQl9Ci0JfSk7Ci0KLQlDb21wb3NpdGUgZmlsbGVyID0gbmV3IENvbXBvc2l0ZShhY3Rpb25zUGFuZWwsIFNXVC5OT05FKTsKLQlmaWxsZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCi0JcHJvZ3Jlc3NMYWJlbCA9IG5ldyBMYWJlbChhY3Rpb25zUGFuZWwsIFNXVC5OT05FKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JcHJvZ3Jlc3NMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCi0JcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoYWN0aW9uc1BhbmVsLCBTV1QuTk9ORSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCXByb2dyZXNzQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHJ1bigpIHsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljbGVhbnVwKCk7Ci19Ci0KLVN0cmluZyBnZXRQYWNrYWdlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQlpbnQgZG90ID0gYXBwLmdldE1haW5DbGFzc05hbWUoKS5sYXN0SW5kZXhPZignLicpOwotCWlmIChkb3QgPT0gLTEpIHJldHVybiAiIjsKLQlyZXR1cm4gYXBwLmdldE1haW5DbGFzc05hbWUoKS5zdWJzdHJpbmcoMCwgZG90KTsKLX0KLQotU3RyaW5nIGdldENsYXNzU3RyaW5nKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIG5hbWUgPSBKTklHZW5lcmF0b3IuZ2V0VHlwZVNpZ25hdHVyZTMoY2xhenopOwotCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBuYW1lOwotCXJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIG5hbWUubGVuZ3RoKCkpOwotfQotCi1TdHJpbmcgZ2V0RmxhZ3NTdHJpbmcoU3RyaW5nW10gZmxhZ3MpIHsKLQlpZiAoZmxhZ3MubGVuZ3RoID09IDApIHJldHVybiAiIjsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWZvciAoaW50IGogPSAwOyBqIDwgZmxhZ3MubGVuZ3RoOyBqKyspIHsKLQkJU3RyaW5nIGZsYWcgPSBmbGFnc1tqXTsKLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSAhPSAwKSBidWZmZXIuYXBwZW5kKCIsICIpOwotCQlidWZmZXIuYXBwZW5kKGZsYWcpOwotCX0KLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLVN0cmluZyBnZXRNZXRob2RTdHJpbmcoTWV0aG9kIG1ldGhvZCkgewotCVN0cmluZyBwa2dOYW1lID0gZ2V0UGFja2FnZVN0cmluZyhtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsKLQlidWZmZXIuYXBwZW5kKCIoIik7Ci0JQ2xhc3NbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJaWYgKGkgIT0gMCkgYnVmZmVyLmFwcGVuZCgiLCIpOwotCQlTdHJpbmcgc3RyaW5nID0gSk5JR2VuZXJhdG9yLmdldFR5cGVTaWduYXR1cmUzKHBhcmFtKTsKLQkJaWYgKHN0cmluZy5zdGFydHNXaXRoKHBrZ05hbWUpKSBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBrZ05hbWUubGVuZ3RoKCkgKyAxKTsKLQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCX0KLQlidWZmZXIuYXBwZW5kKCIpIik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1TdHJpbmcgZ2V0RmllbGRTdHJpbmcoRmllbGQgZmllbGQpIHsKLQlyZXR1cm4gZmllbGQuZ2V0TmFtZSgpOwotfQotCi12b2lkIHVwZGF0ZUNsYXNzZXMoKSB7Ci0JY2xhc3Nlc0x0LnJlbW92ZUFsbCgpOwotCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JQ2xhc3NbXSBjbGFzc2VzID0gYXBwLmdldENsYXNzZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlDbGFzc0RhdGEgY2xhc3NEYXRhID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoY2xhenopOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY2xhc3Nlc0x0LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0RGF0YShjbGFzc0RhdGEpOwotCQlpdGVtLnNldFRleHQoQ0xBU1NfTkFNRV9DT0xVTU4sIGdldENsYXNzU3RyaW5nKGNsYXp6KSk7Ci0JCWl0ZW0uc2V0VGV4dChDTEFTU19GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGNsYXNzRGF0YS5nZXRGbGFncygpKSk7Ci0JCWl0ZW0uc2V0Q2hlY2tlZChjbGFzc0RhdGEuZ2V0R2VuZXJhdGUoKSk7Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IGNsYXNzZXNMdC5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCWNvbHVtbi5wYWNrKCk7Ci0JfQotfQotCi12b2lkIHVwZGF0ZU1lbWJlcnMoKSB7Ci0JbWVtYmVyc0x0LnJlbW92ZUFsbCgpOwotCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JbWVtYmVyc0x0LnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IG1lbWJlcnNMdC5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCWNvbHVtbi5kaXNwb3NlKCk7Ci0JfQotCWludFtdIGluZGljZXMgPSBjbGFzc2VzTHQuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCWlmIChpbmRpY2VzLmxlbmd0aCAhPSAxKSByZXR1cm47Ci0JVGFibGVJdGVtIGNsYXNzSXRlbSA9IGNsYXNzZXNMdC5nZXRJdGVtKGluZGljZXNbMF0pOwotCUNsYXNzRGF0YSBjbGFzc0RhdGEgPSAoQ2xhc3NEYXRhKWNsYXNzSXRlbS5nZXREYXRhKCk7Ci0JQ2xhc3MgY2xhenogPSBjbGFzc0RhdGEuZ2V0Q2xhenooKTsKLQlib29sZWFuIGhhc05hdGl2ZXMgPSBmYWxzZTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpbnQgbW9kcyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKGhhc05hdGl2ZXMgPSgobW9kcyAmIE1vZGlmaWVyLk5BVElWRSkgIT0gMCkpIGJyZWFrOwotCX0KLQltZW1iZXJzTHQuc2V0UmVkcmF3KGZhbHNlKTsKLQlpZiAoaGFzTmF0aXZlcykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBNRVRIT0RfTkFNRV9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiTWV0aG9kIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBNRVRIT0RfRkxBR1NfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBNRVRIT0RfQUNDRVNTT1JfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkFjY2Vzc29yIik7Ci0JCS8qCi0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBNRVRIT0RfRVhDTFVERV9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiRXhjbHVkZSIpOwotCQkqLwotCQlKTklHZW5lcmF0b3Iuc29ydChtZXRob2RzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKG1ldGhvZCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obWVtYmVyc0x0LCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldERhdGEobWV0aG9kRGF0YSk7Ci0JCQlpdGVtLnNldFRleHQoTUVUSE9EX05BTUVfQ09MVU1OLCBnZXRNZXRob2RTdHJpbmcobWV0aG9kKSk7Ci0JCQlpdGVtLnNldENoZWNrZWQobWV0aG9kRGF0YS5nZXRHZW5lcmF0ZSgpKTsKLQkJCWl0ZW0uc2V0VGV4dChNRVRIT0RfRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhtZXRob2REYXRhLmdldEZsYWdzKCkpKTsKLQkJCWl0ZW0uc2V0VGV4dChNRVRIT0RfQUNDRVNTT1JfQ09MVU1OLCBtZXRob2REYXRhLmdldEFjY2Vzc29yKCkpOwotCQkJLyoKLQkJCWl0ZW0uc2V0VGV4dChNRVRIT0RfRVhDTFVERV9DT0xVTU4sIG1ldGhvZERhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCSovCi0JCX0KLQl9IGVsc2UgewotCQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9OQU1FX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJGaWVsZCIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgRklFTERfRkxBR1NfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9DQVNUX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDYXN0Iik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiQWNjZXNzb3IiKTsKLQkJLyoKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIEZJRUxEX0VYQ0xVREVfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkV4Y2x1ZGUiKTsKLQkJKi8KLQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsgCi0JCQlpZiAoKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSA9PSAwKSB8fAotCQkJCSgobW9kcyAmIE1vZGlmaWVyLkZJTkFMKSAhPSAwKSB8fAotCQkJCSgobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkpIGNvbnRpbnVlOwotCQkJRmllbGREYXRhIGZpZWxkRGF0YSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGZpZWxkKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShtZW1iZXJzTHQsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0RGF0YShmaWVsZERhdGEpOwotCQkJaXRlbS5zZXRUZXh0KEZJRUxEX05BTUVfQ09MVU1OLCBnZXRGaWVsZFN0cmluZyhmaWVsZCkpOwotCQkJaXRlbS5zZXRDaGVja2VkKGZpZWxkRGF0YS5nZXRHZW5lcmF0ZSgpKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9DQVNUX0NPTFVNTiwgZmllbGREYXRhLmdldENhc3QoKSk7Ci0JCQlpdGVtLnNldFRleHQoRklFTERfRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhmaWVsZERhdGEuZ2V0RmxhZ3MoKSkpOwotCQkJaXRlbS5zZXRUZXh0KEZJRUxEX0FDQ0VTU09SX0NPTFVNTiwgZmllbGREYXRhLmdldEFjY2Vzc29yKCkpOwotCQkJLyoKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9FWENMVURFX0NPTFVNTiwgZmllbGREYXRhLmdldEV4Y2x1ZGUoKSk7Ci0JCQkqLwotCQl9Ci0JfQotCWNvbHVtbnMgPSBtZW1iZXJzTHQuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQljb2x1bW4ucGFjaygpOwotCX0KLQltZW1iZXJzTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQltZW1iZXJzTHQuc2V0UmVkcmF3KHRydWUpOwotfQotCi12b2lkIHVwZGF0ZVBhcmFtZXRlcnMoKSB7Ci0JcGFyYW1zTHQucmVtb3ZlQWxsKCk7Ci0JTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQlpbnRbXSBpbmRpY2VzID0gbWVtYmVyc0x0LmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQlpZiAoaW5kaWNlcy5sZW5ndGggIT0gMSkgewotCQlwYXJhbXNMdC5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuOwotCX0KLQlUYWJsZUl0ZW0gbWVtYmVySXRlbSA9IG1lbWJlcnNMdC5nZXRJdGVtKGluZGljZXNbMF0pOwotCU9iamVjdCBkYXRhID0gbWVtYmVySXRlbS5nZXREYXRhKCk7Ci0JaWYgKCEoZGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpKSByZXR1cm47Ci0JcGFyYW1zTHQuc2V0UmVkcmF3KGZhbHNlKTsKLQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSAoTWV0aG9kRGF0YSltZW1iZXJJdGVtLmdldERhdGEoKTsKLQlNZXRob2QgbWV0aG9kID0gbWV0aG9kRGF0YS5nZXRNZXRob2QoKTsKLQlDbGFzc1tdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIHBhcmFtID0gcGFyYW1zW2ldOwotCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwYXJhbXNMdCwgU1dULk5PTkUpOwotCQlpdGVtLnNldERhdGEocGFyYW1EYXRhKTsKLQkJaXRlbS5zZXRUZXh0KFBBUkFNX0lOREVYX0NPTFVNTiwgU3RyaW5nLnZhbHVlT2YoaSkpOwotCQlpdGVtLnNldFRleHQoUEFSQU1fVFlQRV9DT0xVTU4sIGdldENsYXNzU3RyaW5nKHBhcmFtKSk7Ci0JCWl0ZW0uc2V0VGV4dChQQVJBTV9DQVNUX0NPTFVNTiwgcGFyYW1EYXRhLmdldENhc3QoKSk7Ci0JCWl0ZW0uc2V0VGV4dChQQVJBTV9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKHBhcmFtRGF0YS5nZXRGbGFncygpKSk7Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHBhcmFtc0x0LmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gY29sdW1uc1tpXTsKLQkJY29sdW1uLnBhY2soKTsKLQl9Ci0JcGFyYW1zTHQuc2V0UmVkcmF3KHRydWUpOwotCXBhcmFtc0x0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci19Ci0KLXZvaWQgdXBkYXRlR2VuZXJhdGUoVGFibGVJdGVtIGl0ZW0pIHsKLQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCUl0ZW1EYXRhIGl0ZW1EYXRhID0gKEl0ZW1EYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCWl0ZW1EYXRhLnNldEdlbmVyYXRlKGl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQlpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBDbGFzc0RhdGEpIHsKLQkJQ2xhc3NEYXRhIGRhdGEgPSAoQ2xhc3NEYXRhKWl0ZW1EYXRhOwotCQltZXRhRGF0YS5zZXRNZXRhRGF0YShkYXRhLmdldENsYXp6KCksIGRhdGEpOwotCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBGaWVsZERhdGEpIHsKLQkJRmllbGREYXRhIGRhdGEgPSAoRmllbGREYXRhKWl0ZW1EYXRhOwotCQlpdGVtLnNldFRleHQoRklFTERfRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZGF0YS5nZXRGaWVsZCgpLCBkYXRhKTsKLQl9IGVsc2UgaWYgKGl0ZW1EYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotCQlNZXRob2REYXRhIGRhdGEgPSAoTWV0aG9kRGF0YSlpdGVtRGF0YTsKLQkJaXRlbS5zZXRUZXh0KE1FVEhPRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGRhdGEuZ2V0RmxhZ3MoKSkpOwotCQltZXRhRGF0YS5zZXRNZXRhRGF0YShkYXRhLmdldE1ldGhvZCgpLCBkYXRhKTsKLQl9IGVsc2UgaWYgKGl0ZW1EYXRhIGluc3RhbmNlb2YgUGFyYW1ldGVyRGF0YSkgewotCQlQYXJhbWV0ZXJEYXRhIGRhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtRGF0YTsKLQkJaXRlbS5zZXRUZXh0KFBBUkFNX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcoZGF0YS5nZXRGbGFncygpKSk7Ci0JCW1ldGFEYXRhLnNldE1ldGFEYXRhKGRhdGEuZ2V0TWV0aG9kKCksIGRhdGEuZ2V0UGFyYW1ldGVyKCksIGRhdGEpOwotCX0KLX0KLQotYm9vbGVhbiB1cGRhdGVPdXRwdXREaXIoKSB7Ci0JU3RyaW5nIG91dHB1dERpclN0ciA9IG91dHB1dERpckNiLmdldFRleHQoKTsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXJTdHIpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuSUNPTl9FUlJPUik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJPdXRwdXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiIpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5JQ09OX0VSUk9SKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIk91dHB1dCBkaXJlY3RvcnkgaXMgbm90IGEgZGlyZWN0b3J5LiIpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWlmIChvdXRwdXREaXJTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCWlmICghb3V0cHV0RGlyU3RyLmVxdWFscyhhcHAuZ2V0T3V0cHV0RGlyKCkpKSB7Ci0JCQlhcHAuc2V0T3V0cHV0RGlyKG91dHB1dERpclN0cik7Ci0JCX0KLQkJaWYgKG91dHB1dERpckNiLmluZGV4T2Yob3V0cHV0RGlyU3RyKSA9PSAtMSkgewotCQkJb3V0cHV0RGlyQ2IuYWRkKG91dHB1dERpclN0cik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgdXBkYXRlTWFpbkNsYXNzKCkgewotCVN0cmluZyBtYWluQ2xhc3NTdHIgPSBtYWluQ2xhc3NDYi5nZXRUZXh0KCk7Ci0JaWYgKG1haW5DbGFzc1N0ci5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFtYWluQ2xhc3NTdHIuZXF1YWxzKGFwcC5nZXRNYWluQ2xhc3NOYW1lKCkpKSB7Ci0JCQlhcHAuc2V0TWFpbkNsYXNzTmFtZShtYWluQ2xhc3NTdHIpOwotCQl9Ci0JCWlmIChtYWluQ2xhc3NDYi5pbmRleE9mKG1haW5DbGFzc1N0cikgPT0gLTEpIHsKLQkJCW1haW5DbGFzc0NiLmFkZChtYWluQ2xhc3NTdHIpOwotCQl9Ci0JCWlmIChhcHAuZ2V0T3V0cHV0RGlyKCkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gb3V0cHV0RGlyQ2IuaW5kZXhPZihhcHAuZ2V0T3V0cHV0RGlyKCkpOwotCQkJaWYgKGluZGV4ICE9IC0xKSBvdXRwdXREaXJDYi5zZWxlY3QoaW5kZXgpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JSk5JR2VuZXJhdG9yQXBwIGdlbiA9IG5ldyBKTklHZW5lcmF0b3JBcHAgKCk7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQlnZW4uc2V0TWFpbkNsYXNzTmFtZShhcmdzWzBdKTsKLQkJaWYgKGFyZ3MubGVuZ3RoID4gMSkgZ2VuLnNldE91dHB1dERpcihhcmdzWzFdKTsKLQl9IGVsc2UgewotCQlnZW4uc2V0TWFpbkNsYXNzTmFtZShKTklHZW5lcmF0b3JBcHAuZ2V0RGVmYXVsdE1haW5DbGFzcygpKTsKLQl9Ci0JSk5JR2VuZXJhdG9yQXBwVUkgdWkgPSBuZXcgSk5JR2VuZXJhdG9yQXBwVUkoZ2VuKTsKLQl1aS5vcGVuKCk7Ci0JdWkucnVuKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODllODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YSB7Ci0JCi0JUHJvcGVydGllcyBkYXRhOwotCi1wdWJsaWMgTWV0YURhdGEoU3RyaW5nIG1haW5DbGFzcykgewotCWRhdGEgPSBuZXcgUHJvcGVydGllcygpOwotCWludCBpbmRleCA9IDA7Ci0JQ2xhc3MgY2xhenogPSBnZXRDbGFzcygpOwotCWludCBsZW5ndGggPSBtYWluQ2xhc3MubGVuZ3RoKCk7Ci0Jd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7Ci0JCWluZGV4ID0gbWFpbkNsYXNzLmluZGV4T2YoJy4nLCBpbmRleCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgaW5kZXggPSBsZW5ndGg7Ci0JCUlucHV0U3RyZWFtIGlzID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShtYWluQ2xhc3Muc3Vic3RyaW5nKDAsIGluZGV4KSArICIucHJvcGVydGllcyIpOwotCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkYXRhLmxvYWQoaXMpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCQkKLQkJfQotCQlpbmRleCsrOwotCX0KLX0KLQotcHVibGljIE1ldGFEYXRhKFByb3BlcnRpZXMgZGF0YSkgewotCXRoaXMuZGF0YSA9IGRhdGE7Ci19Ci0KLXB1YmxpYyBDbGFzc0RhdGEgZ2V0TWV0YURhdGEoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcga2V5ID0gSk5JR2VuZXJhdG9yLnRvQyhjbGF6ei5nZXROYW1lKCkpOwotCVN0cmluZyB2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgIiIpOwotCXJldHVybiBuZXcgQ2xhc3NEYXRhKGNsYXp6LCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBGaWVsZERhdGEgZ2V0TWV0YURhdGEoRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gSk5JR2VuZXJhdG9yLmdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgZmllbGQuZ2V0TmFtZSgpOwotCVN0cmluZyB2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgIiIpOwotCXJldHVybiBuZXcgRmllbGREYXRhKGZpZWxkLCB2YWx1ZSk7Ci19Ci0KLWJvb2xlYW4gY29udmVydFRvMzJCaXQoQ2xhc3NbXSBwYXJhbVR5cGVzKSB7Ci0JYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCWlmIChwYXJhbVR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQlwYXJhbVR5cGVzW2ldID0gSW50ZWdlci5UWVBFOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJaWYgKHBhcmFtVHlwZSA9PSBsb25nW10uY2xhc3MpIHsKLQkJCXBhcmFtVHlwZXNbaV0gPSBpbnRbXS5jbGFzczsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBjaGFuZ2VkOwkKLX0KLQotcHVibGljIE1ldGhvZERhdGEgZ2V0TWV0YURhdGEoTWV0aG9kIG1ldGhvZCkgewotCVN0cmluZyBjbGFzc05hbWUgPSBKTklHZW5lcmF0b3IuZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpOwotCVN0cmluZyB2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUoKTsKLQkJdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksIG51bGwpOwotCX0KLQkvKgotCSogU3VwcG9ydCBmb3IgNjQgYml0IHBvcnQuCi0JKi8KLQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJaWYgKGNvbnZlcnRUbzMyQml0KHBhcmFtVHlwZXMpKSB7Ci0JCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCwgcGFyYW1UeXBlcyk7Ci0JCQl2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JCX0KLQl9CQotCWlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOwkKLQlyZXR1cm4gbmV3IE1ldGhvZERhdGEobWV0aG9kLCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBQYXJhbWV0ZXJEYXRhIGdldE1ldGFEYXRhKE1ldGhvZCBtZXRob2QsIGludCBwYXJhbWV0ZXIpIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gSk5JR2VuZXJhdG9yLmdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0JU3RyaW5nIGtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kKSArICJfIiArIHBhcmFtZXRlcjsKLQlTdHJpbmcgdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksIG51bGwpOwotCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiXyIgKyBwYXJhbWV0ZXI7Ci0JCXZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQl9CQotCS8qCi0JKiBTdXBwb3J0IGZvciA2NCBiaXQgcG9ydC4KLQkqLwotCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCUNsYXNzW10gcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpZiAoY29udmVydFRvMzJCaXQocGFyYW1UeXBlcykpIHsKLQkJCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBwYXJhbVR5cGVzKSArICJfIiArIHBhcmFtZXRlcjsKLQkJCXZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJfQotCX0JCi0JaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gIiI7CQotCXJldHVybiBuZXcgUGFyYW1ldGVyRGF0YShtZXRob2QsIHBhcmFtZXRlciwgdmFsdWUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhKFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQlyZXR1cm4gZGF0YS5nZXRQcm9wZXJ0eShrZXksIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzIGNsYXp6LCBDbGFzc0RhdGEgdmFsdWUpIHsKLQlTdHJpbmcga2V5ID0gSk5JR2VuZXJhdG9yLnRvQyhjbGF6ei5nZXROYW1lKCkpOwotCXNldE1ldGFEYXRhKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKEZpZWxkIGZpZWxkLCBGaWVsZERhdGEgdmFsdWUpIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gSk5JR2VuZXJhdG9yLmdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgZmllbGQuZ2V0TmFtZSgpOwotCXNldE1ldGFEYXRhKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgdmFsdWUpIHsKLQlTdHJpbmcga2V5OwotCVN0cmluZyBjbGFzc05hbWUgPSBKTklHZW5lcmF0b3IuZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQlpZiAoSk5JR2VuZXJhdG9yLmlzTmF0aXZlVW5pcXVlKG1ldGhvZCkpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUgKCk7Ci0JfSBlbHNlIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpOwotCX0KLQlzZXRNZXRhRGF0YShrZXksIHZhbHVlLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShNZXRob2QgbWV0aG9kLCBpbnQgYXJnLCBQYXJhbWV0ZXJEYXRhIHZhbHVlKSB7Ci0JU3RyaW5nIGtleTsKLQlTdHJpbmcgY2xhc3NOYW1lID0gSk5JR2VuZXJhdG9yLmdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0JaWYgKEpOSUdlbmVyYXRvci5pc05hdGl2ZVVuaXF1ZShtZXRob2QpKSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIG1ldGhvZC5nZXROYW1lICgpICsgIl8iICsgYXJnOwotCX0gZWxzZSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kKSArICJfIiArIGFyZzsKLQl9Ci0Jc2V0TWV0YURhdGEoa2V5LCB2YWx1ZS50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0TWV0YURhdGEoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JZGF0YS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGFEYXRhR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwNzdkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotcHVibGljIGNsYXNzIE1ldGFEYXRhR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X3Byb3BlcnRpZXNfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0Jb3V0cHV0KHRvQyhjbGF6ei5nZXROYW1lKCkpKTsKLQlvdXRwdXQoIj0iKTsKLQlDbGFzc0RhdGEgZGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoY2xhenopOwotCWlmIChkYXRhICE9IG51bGwpIG91dHB1dChkYXRhLnRvU3RyaW5nKCkpOwotCW91dHB1dGxuKCk7Ci0JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotCWdlbmVyYXRlKGZpZWxkcyk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWdlbmVyYXRlKG1ldGhvZHMpOwotCW91dHB1dGxuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkW10gZmllbGRzKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmICgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkgY29udGludWU7Ci0JCWlmICgobW9kcyAmIE1vZGlmaWVyLkZJTkFMKSAhPSAwKSBjb250aW51ZTsKLQkJaWYgKChtb2RzICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUoZmllbGQpOwotCQlvdXRwdXRsbigpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGQgZmllbGQpIHsKLQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQlvdXRwdXQoIl8iKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXQoIj0iKTsKLQlGaWVsZERhdGEgZGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoZmllbGQpOwotCWlmIChkYXRhICE9IG51bGwpIG91dHB1dChkYXRhLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShNZXRob2RbXSBtZXRob2RzKSB7Ci0Jc29ydChtZXRob2RzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUobWV0aG9kKTsKLQkJb3V0cHV0bG4oKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKE1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0JYnVmZmVyLmFwcGVuZCgiXyIpOwotCWlmIChpc05hdGl2ZVVuaXF1ZShtZXRob2QpKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKSk7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyLmFwcGVuZChnZXRGdW5jdGlvbk5hbWUobWV0aG9kKSk7Ci0JfQotCVN0cmluZyBrZXkgPSBidWZmZXIudG9TdHJpbmcoKTsKLQlvdXRwdXQoa2V5KTsKLQlvdXRwdXQoIj0iKTsKLQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCk7Ci0JaWYgKG1ldGhvZERhdGEgIT0gbnVsbCkgb3V0cHV0KG1ldGhvZERhdGEudG9TdHJpbmcoKSk7Ci0Jb3V0cHV0bG4oKTsKLQlpbnQgbGVuZ3RoID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJb3V0cHV0KGtleSk7Ci0JCW91dHB1dCgiXyIpOwotCQlvdXRwdXQoaSArICI9Iik7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlpZiAocGFyYW1EYXRhICE9IG51bGwpIG91dHB1dChwYXJhbURhdGEudG9TdHJpbmcoKSk7Ci0JCW91dHB1dGxuKCk7CQkKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiAiLnByb3BlcnRpZXMiOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoKSB7Ci0JcmV0dXJuIGdldE1haW5DbGFzcygpLmdldE5hbWUoKTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gZ2V0R2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGhvZERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRob2REYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmQ2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGhvZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2REYXRhIGV4dGVuZHMgSXRlbURhdGEgewotCQotCU1ldGhvZCBtZXRob2Q7Ci0KLXB1YmxpYyBNZXRob2REYXRhKE1ldGhvZCBtZXRob2QsIFN0cmluZyBzdHIpIHsKLQlzdXBlcihzdHIpOwotCXRoaXMubWV0aG9kID0gbWV0aG9kOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbEZsYWdzKCkgewotCXJldHVybiBuZXcgU3RyaW5nW117Im5vX2dlbiIsICJhZGRyZXNzIiwgImNvbnN0IiwgImR5bmFtaWMiLCAiam5pIiwgImNwcCIsICJuZXciLCAiZGVsZXRlIn07Ci19Ci0KLXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotCXJldHVybiBtZXRob2Q7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImFjY2Vzc29yIik7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZSgpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiZXhjbHVkZSIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJhY2Nlc3NvciIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlc0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU4OWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmF0aXZlc0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLWJvb2xlYW4gZW50ZXJFeGl0TWFjcm87Ci0KLXB1YmxpYyBOYXRpdmVzR2VuZXJhdG9yKCkgewotCWVudGVyRXhpdE1hY3JvID0gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X2NvcHlyaWdodCIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotCVN0cmluZyBvdXRwdXROYW1lID0gZ2V0T3V0cHV0TmFtZSgpOwotCW91dHB1dGxuKCIjaW5jbHVkZSBcInN3dC5oXCIiKTsKLQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0Jb3V0cHV0KG91dHB1dE5hbWUpOwotCW91dHB1dGxuKCJfc3RydWN0cy5oXCIiKTsKLQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0Jb3V0cHV0KG91dHB1dE5hbWUpOwotCW91dHB1dGxuKCJfc3RhdHMuaFwiIik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKG1ldGhvZE5hbWUpKSBjb3VudCsrOwotCX0KLQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQljb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKG1ldGhvZE5hbWUpKSByZXN1bHRbY291bnQrK10gPSBtZXRob2RzW2ldOwotCX0KLQlnZW5lcmF0ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlpbnQgaSA9IDA7Ci0JZm9yICg7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgIT0gMCkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1ldGhvZHMubGVuZ3RoKSByZXR1cm47Ci0Jc29ydChtZXRob2RzKTsKLQlpZiAoaXNDUFApIHsKLQkJb3V0cHV0bG4oImV4dGVybiBcIkNcIiB7Iik7Ci0JCW91dHB1dGxuKCk7Ci0JfQotCWdlbmVyYXRlTmF0aXZlTWFjcm8oY2xhenopOwotCWdlbmVyYXRlRXhjbHVkZXMobWV0aG9kcyk7Ci0JZ2VuZXJhdGUobWV0aG9kcyk7Ci0JaWYgKGlzQ1BQKSB7Ci0JCW91dHB1dGxuKCJ9Iik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShNZXRob2RbXSBtZXRob2RzKSB7Ci0Jc29ydChtZXRob2RzKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKG1ldGhvZCk7Ci0JCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zdGVwKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShNZXRob2QgbWV0aG9kKSB7Ci0JTWV0aG9kRGF0YSBtZXRob2REYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QpOwotCWlmIChtZXRob2REYXRhLmdldEZsYWcoIm5vX2dlbiIpKSByZXR1cm47Ci0JQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JU3RyaW5nIGZ1bmN0aW9uID0gZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCk7Ci0JCi0JaWYgKCEocmV0dXJuVHlwZSA9PSBWb2lkLlRZUEUgfHwgcmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpIHx8IGlzU3lzdGVtQ2xhc3MocmV0dXJuVHlwZSkgfHwgcmV0dXJuVHlwZSA9PSBTdHJpbmcuY2xhc3MpKSB7Ci0JCW91dHB1dCgiV2FybmluZzogYmFkIHJldHVybiB0eXBlLiA6Iik7Ci0JCW91dHB1dGxuKG1ldGhvZC50b1N0cmluZygpKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlnZW5lcmF0ZVNvdXJjZVN0YXJ0KGZ1bmN0aW9uKTsKLQlnZW5lcmF0ZUZ1bmN0aW9uUHJvdG90eXBlKG1ldGhvZCwgZnVuY3Rpb24sIHBhcmFtVHlwZXMsIHJldHVyblR5cGUpOwotCWdlbmVyYXRlRnVuY3Rpb25Cb2R5KG1ldGhvZCwgbWV0aG9kRGF0YSwgZnVuY3Rpb24sIHBhcmFtVHlwZXMsIHJldHVyblR5cGUpOwotCWdlbmVyYXRlU291cmNlRW5kKGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFbnRlckV4aXRNYWNybyhib29sZWFuIGVudGVyRXhpdE1hY3JvKSB7Ci0JdGhpcy5lbnRlckV4aXRNYWNybyA9IGVudGVyRXhpdE1hY3JvOwotfQotCi12b2lkIGdlbmVyYXRlRXhjbHVkZXMoTWV0aG9kW10gbWV0aG9kcykgewotCUhhc2hTZXQgZXhjbHVkZXMgPSBuZXcgSGFzaFNldCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCk7Ci0JCVN0cmluZyBleGNsdWRlID0gbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCk7Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCWV4Y2x1ZGVzLmFkZChleGNsdWRlKTsKLQkJfQotCX0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNsdWRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQlvdXRwdXRsbihleGNsdWRlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kKTsKLQkJCVN0cmluZyBtZXRob2RFeGNsdWRlID0gbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCk7Ci0JCQlpZiAoZXhjbHVkZS5lcXVhbHMobWV0aG9kRXhjbHVkZSkpIHsKLQkJCQlvdXRwdXQoIiNkZWZpbmUgTk9fIik7Ci0JCQkJb3V0cHV0bG4oZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVOYXRpdmVNYWNybyhDbGFzcyBjbGF6eikgewotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGNsYXp6KSk7Ci0Jb3V0cHV0KCJfTkFUSVZFKGZ1bmMpIEphdmFfIik7Ci0Jb3V0cHV0KHRvQyhjbGF6ei5nZXROYW1lKCkpKTsKLQlvdXRwdXRsbigiXyMjZnVuYyIpOwotCW91dHB1dGxuKCk7Ci19Ci0KLWJvb2xlYW4gZ2VuZXJhdGVHZXRQYXJhbWV0ZXIoTWV0aG9kIG1ldGhvZCwgaW50IGksIENsYXNzIHBhcmFtVHlwZSwgUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEsIGJvb2xlYW4gY3JpdGljYWwsIGludCBpbmRlbnQpIHsKLQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSByZXR1cm4gZmFsc2U7Ci0JU3RyaW5nIGlTdHIgPSBTdHJpbmcudmFsdWVPZihpKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSBvdXRwdXQoIlx0Iik7Ci0Jb3V0cHV0KCJpZiAoYXJnIik7Ci0Jb3V0cHV0KGlTdHIpOwotCW91dHB1dCgiKSBpZiAoKGxwYXJnIik7Ci0Jb3V0cHV0KGlTdHIpOwotCW91dHB1dCgiID0gIik7Ci0JaWYgKHBhcmFtVHlwZS5pc0FycmF5KCkpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IHBhcmFtVHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmIChjcml0aWNhbCkgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoImVudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZyIpOwotCQkJCX0KLQkJCQlvdXRwdXQoaVN0cik7Ci0JCQkJb3V0cHV0KCIsIE5VTEwpIik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoImVudi0+R2V0Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCIoKmVudiktPkdldCIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoY29tcG9uZW50VHlwZSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoYXJnIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheUVsZW1lbnRzKGVudiwgYXJnIik7Ci0JCQkJfQotCQkJCW91dHB1dChpU3RyKTsKLQkJCQlvdXRwdXQoIiwgTlVMTCkiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJfQotCX0gZWxzZSBpZiAocGFyYW1UeXBlID09IFN0cmluZy5jbGFzcykgewotCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoInVuaWNvZGUiKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldFN0cmluZ0NoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0U3RyaW5nQ2hhcnMoZW52LCBhcmciKTsKLQkJCX0KLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQl9IGVsc2UgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldFN0cmluZ1VURkNoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBhcmciKTsKLQkJCX0KLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKCJub19pbiIpKSB7Ci0JCQlvdXRwdXQoIiZfYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoImdldCIpOwotCQkJb3V0cHV0KGdldENsYXNzTmFtZShwYXJhbVR5cGUpKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIiwgJl9hcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiKSIpOwotCQl9Ci0JfQkKLQlvdXRwdXRsbigiKSA9PSBOVUxMKSBnb3RvIGZhaWw7Iik7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTZXRQYXJhbWV0ZXIoaW50IGksIENsYXNzIHBhcmFtVHlwZSwgUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEsIGJvb2xlYW4gY3JpdGljYWwpIHsKLQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSByZXR1cm47Ci0JU3RyaW5nIGlTdHIgPSBTdHJpbmcudmFsdWVPZihpKTsKLQlpZiAocGFyYW1UeXBlLmlzQXJyYXkoKSkgewotCQlvdXRwdXQoIlx0aWYgKGFyZyIpOwotCQlvdXRwdXQoaVN0cik7Ci0JCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIpICIpOwotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKGNyaXRpY2FsKSB7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmciKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGlTdHIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2UiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+UmVsZWFzZSIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoY29tcG9uZW50VHlwZSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoYXJnIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheUVsZW1lbnRzKGVudiwgYXJnIik7Ci0JCQkJfQotCQkJCW91dHB1dChpU3RyKTsKLQkJCX0KLQkJCW91dHB1dCgiLCBscGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsICIpOwotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKCJub19vdXQiKSkgewotCQkJCW91dHB1dCgiSk5JX0FCT1JUIik7Ci0JCQl9IGVsc2UgewkJCQkKLQkJCQlvdXRwdXQoIjAiKTsKLQkJCX0KLQkJCW91dHB1dCgiKTsiKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCX0gZWxzZSBpZiAocGFyYW1UeXBlID09IFN0cmluZy5jbGFzcykgewotCQlvdXRwdXQoIlx0aWYgKGFyZyIpOwotCQlvdXRwdXQoaVN0cik7Ci0JCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIpICIpOwotCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoInVuaWNvZGUiKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhhcmciKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPlJlbGVhc2VTdHJpbmdDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhcmciKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQl9Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIsIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0bG4oIik7Iik7Ci0JfSBlbHNlIHsKLQkJaWYgKCFwYXJhbURhdGEuZ2V0RmxhZygibm9fb3V0IikpIHsKLQkJCW91dHB1dCgiXHRpZiAoYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIiAmJiBscGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIpICIpOwotCQkJb3V0cHV0KCJzZXQiKTsKLQkJCW91dHB1dChnZXRDbGFzc05hbWUocGFyYW1UeXBlKSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsIGxwYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUV4aXRNYWNybyhNZXRob2QgbWV0aG9kLCBTdHJpbmcgZnVuY3Rpb24pIHsKLQlpZiAoIWVudGVyRXhpdE1hY3JvKSByZXR1cm47Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChnZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQlvdXRwdXQoIl9OQVRJVkVfRVhJVChlbnYsIHRoYXQsICIpOwotCW91dHB1dChmdW5jdGlvbik7Ci0Jb3V0cHV0bG4oIl9GVU5DKTsiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUVudGVyTWFjcm8oTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uKSB7Ci0JaWYgKCFlbnRlckV4aXRNYWNybykgcmV0dXJuOwotCW91dHB1dCgiXHQiKTsKLQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0Jb3V0cHV0KCJfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigiX0ZVTkMpOyIpOwotfQotCi1ib29sZWFuIGdlbmVyYXRlTG9jYWxWYXJzKE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1UeXBlcywgQ2xhc3MgcmV0dXJuVHlwZSkgewotCWJvb2xlYW4gbmVlZHNSZXR1cm4gPSBlbnRlckV4aXRNYWNybzsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJaWYgKHBhcmFtVHlwZS5pc1ByaW1pdGl2ZSgpIHx8IGlzU3lzdGVtQ2xhc3MocGFyYW1UeXBlKSkgY29udGludWU7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlvdXRwdXQoIlx0Iik7Ci0JCWlmIChwYXJhbVR5cGUuaXNBcnJheSgpKSB7Ci0JCQlDbGFzcyBjb21wb25lbnRUeXBlID0gcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIoY29tcG9uZW50VHlwZSkpOwotCQkJCW91dHB1dCgiICpscGFyZyIgKyBpKTsKLQkJCQlvdXRwdXQoIj1OVUxMOyIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXJyb3IoIm5vdCBkb25lIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGFyYW1UeXBlID09IFN0cmluZy5jbGFzcykgewotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKCJ1bmljb2RlIikpIHsKLQkJCQlvdXRwdXQoImNvbnN0IGpjaGFyICpscGFyZyIgKyBpKTsJCQkJCi0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiY29uc3QgY2hhciAqbHBhcmciICsgaSk7Ci0JCQl9Ci0JCQlvdXRwdXQoIj0gTlVMTDsiKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dChnZXRDbGFzc05hbWUocGFyYW1UeXBlKSk7Ci0JCQlvdXRwdXQoIiBfYXJnIiArIGkpOwotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKCJpbml0IikpIG91dHB1dCgiPXswfSIpOwotCQkJb3V0cHV0KCIsICpscGFyZyIgKyBpKTsKLQkJCW91dHB1dCgiPU5VTEw7Iik7Ci0JCX0KLQkJb3V0cHV0bG4oKTsKLQkJbmVlZHNSZXR1cm4gPSB0cnVlOwotCX0KLQlpZiAobmVlZHNSZXR1cm4pIHsKLQkJaWYgKHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCQlvdXRwdXQoIlx0Iik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQkJb3V0cHV0bG4oIiByYyA9IDA7Iik7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5lZWRzUmV0dXJuOwotfQotCi1ib29sZWFuIGdlbmVyYXRlR2V0dGVycyhNZXRob2QgbWV0aG9kLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQlib29sZWFuIGdlbkZhaWxUYWcgPSBmYWxzZTsKLQlpbnQgY3JpdGljYWxDb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlpZiAoIWlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQlnZW5GYWlsVGFnIHw9IGdlbmVyYXRlR2V0UGFyYW1ldGVyKG1ldGhvZCwgaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIGZhbHNlLCAxKTsKLQkJfSBlbHNlIHsKLQkJCWNyaXRpY2FsQ291bnQrKzsKLQkJfQotCX0KLQlpZiAoY3JpdGljYWxDb3VudCAhPSAwKSB7Ci0JCW91dHB1dGxuKCIjaWZkZWYgSk5JX1ZFUlNJT05fMV8yIik7Ci0JCW91dHB1dGxuKCJcdGlmIChJU19KTklfMV8yKSB7Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJaWYgKGlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQkJZ2VuRmFpbFRhZyB8PSBnZW5lcmF0ZUdldFBhcmFtZXRlcihtZXRob2QsIGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCB0cnVlLCAyKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHR9IGVsc2UiKTsKLQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQlvdXRwdXRsbigiXHR7Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJaWYgKGlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQkJZ2VuRmFpbFRhZyB8PSBnZW5lcmF0ZUdldFBhcmFtZXRlcihtZXRob2QsIGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCBmYWxzZSwgMik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSIpOwotCX0KLQlyZXR1cm4gZ2VuRmFpbFRhZzsKLX0KLQotdm9pZCBnZW5lcmF0ZVNldHRlcnMoTWV0aG9kIG1ldGhvZCwgQ2xhc3NbXSBwYXJhbVR5cGVzKSB7Ci0JaW50IGNyaXRpY2FsQ291bnQgPSAwOwotCWZvciAoaW50IGkgPSBwYXJhbVR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlpZiAoaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCWNyaXRpY2FsQ291bnQrKzsKLQkJfQotCX0KLQlpZiAoY3JpdGljYWxDb3VudCAhPSAwKSB7Ci0JCW91dHB1dGxuKCIjaWZkZWYgSk5JX1ZFUlNJT05fMV8yIik7Ci0JCW91dHB1dGxuKCJcdGlmIChJU19KTklfMV8yKSB7Iik7Ci0JCWZvciAoaW50IGkgPSBwYXJhbVR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlpZiAoaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCQlvdXRwdXQoIlx0Iik7Ci0JCQkJZ2VuZXJhdGVTZXRQYXJhbWV0ZXIoaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIHRydWUpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdH0gZWxzZSIpOwotCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCW91dHB1dGxuKCJcdHsiKTsKLQkJZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJCWlmIChpc0NyaXRpY2FsKHBhcmFtVHlwZSwgcGFyYW1EYXRhKSkgewotCQkJCW91dHB1dCgiXHQiKTsKLQkJCQlnZW5lcmF0ZVNldFBhcmFtZXRlcihpLCBwYXJhbVR5cGUsIHBhcmFtRGF0YSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdH0iKTsKLQl9Ci0JZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCWlmICghaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCWdlbmVyYXRlU2V0UGFyYW1ldGVyKGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCBmYWxzZSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVEeW5hbWljRnVuY3Rpb25DYWxsKE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBDbGFzcyByZXR1cm5UeXBlLCBib29sZWFuIG5lZWRzUmV0dXJuKSB7Ci0Jb3V0cHV0bG4oIi8qIik7Ci0JZ2VuZXJhdGVGdW5jdGlvbkNhbGwobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCByZXR1cm5UeXBlLCBuZWVkc1JldHVybik7Ci0Jb3V0cHV0bG4oIiovIik7Ci0Jb3V0cHV0bG4oIlx0eyIpOwotCi0JU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCWlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCWlmIChnZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgewotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOyIpOwotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBITU9EVUxFIGhtID0gTlVMTDsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgRkFSUFJPQyBmcCA9IE5VTEw7Iik7Ci0JCWlmIChyZXR1cm5UeXBlICE9IFZvaWQuVFlQRSkgewotCQkJaWYgKG5lZWRzUmV0dXJuKSB7Ci0JCQkJb3V0cHV0bG4oIlx0XHRyYyA9IDA7Iik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0XHRpZiAoIWluaXRpYWxpemVkKSB7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKCFobSkgaG0gPSBMb2FkTGlicmFyeSgiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiX0xJQik7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKGhtKSBmcCA9IEdldFByb2NBZGRyZXNzKGhtLCBcIiIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJcIik7Iik7Ci0JCW91dHB1dGxuKCJcdFx0XHRpbml0aWFsaXplZCA9IDE7Iik7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCQlvdXRwdXRsbigiXHRcdGlmIChmcCkgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJb3V0cHV0KCJmcCIpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbFJpZ2h0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHBhcmFtVHlwZXMsIDApOwotCQlvdXRwdXRsbigpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQl9IGVsc2UgaWYgKGdldFBsYXRmb3JtKCkuZXF1YWxzKCJjYXJib24iKSkgewotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOyIpOwotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBDRkJ1bmRsZVJlZiBidW5kbGUgPSBOVUxMOyIpOwotCQlvdXRwdXQoIlx0XHR0eXBlZGVmICIpOwotCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQlvdXRwdXQoIiAoKkZQVFIpKCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDApIG91dHB1dCgiLCAiKTsKLQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJCVN0cmluZyBjYXN0ID0gcGFyYW1EYXRhLmdldENhc3QoKTsKLQkJCWlmIChjYXN0Lmxlbmd0aCgpID4gMikgewotCQkJCW91dHB1dChjYXN0LnN1YnN0cmluZygxLCBjYXN0Lmxlbmd0aCgpIC0gMSkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTQocGFyYW1UeXBlKSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIik7Iik7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIEZQVFIgZnB0cjsiKTsKLQkJaWYgKHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCQlpZiAobmVlZHNSZXR1cm4pIHsKLQkJCQlvdXRwdXRsbigiXHRcdHJjID0gMDsiKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHRcdGlmICghaW5pdGlhbGl6ZWQpIHsiKTsKLQkJb3V0cHV0KCJcdFx0XHRpZiAoIWJ1bmRsZSkgYnVuZGxlID0gQ0ZCdW5kbGVHZXRCdW5kbGVXaXRoSWRlbnRpZmllcihDRlNUUigiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiX0xJQikpOyIpOwotCQlvdXRwdXQoIlx0XHRcdGlmIChidW5kbGUpIGZwdHIgPSAoRlBUUilDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUoYnVuZGxlLCBDRlNUUihcIiIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJcIikpOyIpOwotCQlvdXRwdXRsbigiXHRcdFx0aW5pdGlhbGl6ZWQgPSAxOyIpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQkJb3V0cHV0bG4oIlx0XHRpZiAoZnB0cikgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJb3V0cHV0KCIoKmZwdHIpIik7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgMCk7Ci0JCW91dHB1dGxuKCk7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Iik7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIHZvaWQgKmhhbmRsZSA9IE5VTEw7Iik7Ci0JCW91dHB1dCgiXHRcdHR5cGVkZWYgIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCW91dHB1dCgiICgqRlBUUikoIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgb3V0cHV0KCIsICIpOwotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJU3RyaW5nIGNhc3QgPSBwYXJhbURhdGEuZ2V0Q2FzdCgpOwotCQkJaWYgKGNhc3QubGVuZ3RoKCkgPiAyKSB7Ci0JCQkJb3V0cHV0KGNhc3Quc3Vic3RyaW5nKDEsIGNhc3QubGVuZ3RoKCkgLSAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlNChwYXJhbVR5cGUpKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiKTsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgRlBUUiBmcHRyOyIpOwotCQlpZiAocmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUpIHsKLQkJCWlmIChuZWVkc1JldHVybikgewotCQkJCW91dHB1dGxuKCJcdFx0cmMgPSAwOyIpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdFx0aWYgKCFpbml0aWFsaXplZCkgeyIpOwotCQlvdXRwdXQoIlx0XHRcdGlmICghaGFuZGxlKSBoYW5kbGUgPSBkbG9wZW4oIik7Ci0JCW91dHB1dChuYW1lKTsKLQkJb3V0cHV0bG4oIl9MSUIsIFJUTERfTEFaWSk7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKGhhbmRsZSkgZnB0ciA9IChGUFRSKWRsc3ltKGhhbmRsZSwgXCIiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiXCIpOyIpOwotCQlvdXRwdXRsbigiXHRcdFx0aW5pdGlhbGl6ZWQgPSAxOyIpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQkJb3V0cHV0bG4oIlx0XHRpZiAoZnB0cikgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJb3V0cHV0KCIoKmZwdHIpIik7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgMCk7Ci0JCW91dHB1dGxuKCk7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCX0KLQotCW91dHB1dGxuKCJcdH0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbExlZnRTaWRlKE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwgQ2xhc3MgcmV0dXJuVHlwZSwgYm9vbGVhbiBuZWVkc1JldHVybikgewotCW91dHB1dCgiXHQiKTsKLQlpZiAocmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUpIHsKLQkJaWYgKG5lZWRzUmV0dXJuKSB7Ci0JCQlvdXRwdXQoInJjID0gIik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoInJldHVybiAiKTsKLQkJfQotCQlvdXRwdXQoIigiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKHJldHVyblR5cGUpKTsKLQkJb3V0cHV0KCIpIik7Ci0JfQotCWlmIChtZXRob2REYXRhLmdldEZsYWcoImFkZHJlc3MiKSkgewotCQlvdXRwdXQoIiYiKTsKLQl9CQotCWlmIChtZXRob2REYXRhLmdldEZsYWcoImpuaSIpKSB7Ci0JCW91dHB1dChpc0NQUCA/ICJlbnYtPiIgOiAiKCplbnYpLT4iKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkNhbGxSaWdodFNpZGUoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBDbGFzc1tdIHBhcmFtVHlwZXMsIGludCBwYXJhbVN0YXJ0KSB7Ci0JaWYgKCFtZXRob2REYXRhLmdldEZsYWcoImNvbnN0IikpIHsKLQkJb3V0cHV0KCIoIik7Ci0JCWlmIChtZXRob2REYXRhLmdldEZsYWcoImpuaSIpKSB7Ci0JCQlpZiAoIWlzQ1BQKSBvdXRwdXQoImVudiwgIik7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHBhcmFtU3RhcnQ7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlpZiAoaSAhPSBwYXJhbVN0YXJ0KSBvdXRwdXQoIiwgIik7Ci0JCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoInN0cnVjdCIpKSBvdXRwdXQoIioiKTsKLQkJCW91dHB1dChwYXJhbURhdGEuZ2V0Q2FzdCgpKTsKLQkJCWlmICghcGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgJiYgIWlzU3lzdGVtQ2xhc3MocGFyYW1UeXBlKSkgb3V0cHV0KCJscCIpOwotCQkJb3V0cHV0KCJhcmciICsgaSk7Ci0JCX0KLQkJb3V0cHV0KCIpIik7Ci0JfQotCW91dHB1dCgiOyIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25DYWxsKE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBDbGFzcyByZXR1cm5UeXBlLCBib29sZWFuIG5lZWRzUmV0dXJuKSB7Ci0JU3RyaW5nIGNvcHkgPSAoU3RyaW5nKW1ldGhvZERhdGEuZ2V0UGFyYW0oImNvcHkiKTsKLQlib29sZWFuIG1ha2VDb3B5ID0gY29weS5sZW5ndGgoKSAhPSAwICYmIGlzQ1BQICYmIHJldHVyblR5cGUgIT0gVm9pZC5UWVBFOwotCWlmIChtYWtlQ29weSkgewotCQlvdXRwdXQoIlx0Iik7Ci0JCW91dHB1dChjb3B5KTsKLQkJb3V0cHV0KCIgdGVtcCA9ICIpOwotCX0gZWxzZSB7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsTGVmdFNpZGUobWV0aG9kLCBtZXRob2REYXRhLCByZXR1cm5UeXBlLCBuZWVkc1JldHVybik7Ci0JfQotCWludCBwYXJhbVN0YXJ0ID0gMDsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JaWYgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2FsbCIpKSB7Ci0JCW91dHB1dCgiKCIpOwotCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCAwKTsKLQkJU3RyaW5nIGNhc3QgPSBwYXJhbURhdGEuZ2V0Q2FzdCgpOyAKLQkJaWYgKGNhc3QubGVuZ3RoKCkgIT0gMCAmJiAhY2FzdC5lcXVhbHMoIigpIikpIHsKLQkJCW91dHB1dChjYXN0KTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dCgiKCIpOwotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKHJldHVyblR5cGUpKTsKLQkJCW91dHB1dCgiICgqKSgpKSIpOwotCQl9Ci0JCW91dHB1dCgiYXJnMCkiKTsKLQkJcGFyYW1TdGFydCA9IDE7Ci0JfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoIlZ0YmxDYWxsIikpIHsKLQkJb3V0cHV0KCIoKCIpOwotCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQlvdXRwdXQoIiAoU1RETUVUSE9EQ0FMTFRZUEUgKikoIik7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMSkgb3V0cHV0KCIsICIpOwotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlNChwYXJhbVR5cGUpKTsKLQkJfQotCQlvdXRwdXQoIikpKCooIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlNChwYXJhbVR5cGVzWzFdKSk7Ci0JCW91dHB1dCgiICoqKWFyZzEpW2FyZzBdKSIpOwotCQlwYXJhbVN0YXJ0ID0gMTsKLQl9IGVsc2UgaWYgKG1ldGhvZERhdGEuZ2V0RmxhZygiY3BwIikpIHsKLQkJb3V0cHV0KCIoIik7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIDApOwotCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoInN0cnVjdCIpKSBvdXRwdXQoIioiKTsKLQkJU3RyaW5nIGNhc3QgPSBwYXJhbURhdGEuZ2V0Q2FzdCgpOyAKLQkJaWYgKGNhc3QubGVuZ3RoKCkgIT0gMCAmJiAhY2FzdC5lcXVhbHMoIigpIikpIHsKLQkJCW91dHB1dChjYXN0KTsKLQkJfQotCQlvdXRwdXQoImFyZzApLT4iKTsKLQkJU3RyaW5nIGFjY2Vzc29yID0gbWV0aG9kRGF0YS5nZXRBY2Nlc3NvcigpOwotCQlpZiAoYWNjZXNzb3IubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaWYgKChpbmRleCA9IG5hbWUuaW5kZXhPZignXycpKSAhPSAtMSkgewotCQkJCW91dHB1dChuYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIG5hbWUubGVuZ3RoKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KG5hbWUpOwotCQkJfQotCQl9Ci0JCXBhcmFtU3RhcnQgPSAxOwotCX0gZWxzZSBpZiAobWV0aG9kRGF0YS5nZXRGbGFnKCJuZXciKSkgewotCQlvdXRwdXQoIm5ldyAiKTsKLQkJU3RyaW5nIGFjY2Vzc29yID0gbWV0aG9kRGF0YS5nZXRBY2Nlc3NvcigpOwotCQlpZiAoYWNjZXNzb3IubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaWYgKChpbmRleCA9IG5hbWUuaW5kZXhPZignXycpKSAhPSAtMSkgewotCQkJCW91dHB1dChuYW1lLnN1YnN0cmluZygwLCBpbmRleCkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQobmFtZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKG1ldGhvZERhdGEuZ2V0RmxhZygiZGVsZXRlIikpIHsKLQkJb3V0cHV0KCJkZWxldGUgIik7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIDApOwotCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIoIik7Ci0JCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCJfIikpKTsKLQkJCW91dHB1dCgiICopIik7Ci0JCX0KLQkJb3V0cHV0bG4oImFyZzA7Iik7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2REYXRhLmdldEFjY2Vzc29yKCk7Ci0JCWlmIChhY2Nlc3Nvci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KG5hbWUpOwotCQl9Ci0JfQotCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgcGFyYW1TdGFydCk7Ci0Jb3V0cHV0bG4oKTsKLQlpZiAobWFrZUNvcHkpIHsKLQkJb3V0cHV0bG4oIlx0eyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJb3V0cHV0KGNvcHkpOwotCQlvdXRwdXQoIiogY29weSA9IG5ldyAiKTsKLQkJb3V0cHV0KGNvcHkpOwotCQlvdXRwdXRsbigiKCk7Iik7Ci0JCW91dHB1dGxuKCJcdFx0KmNvcHkgPSB0ZW1wOyIpOwotCQlvdXRwdXQoIlx0XHRyYyA9ICIpOwotCQlvdXRwdXQoIigiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKHJldHVyblR5cGUpKTsKLQkJb3V0cHV0KCIpIik7Ci0JCW91dHB1dGxuKCJjb3B5OyIpOwotCQlvdXRwdXRsbigiXHR9Iik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlUmV0dXJuKE1ldGhvZCBtZXRob2QsIENsYXNzIHJldHVyblR5cGUsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlpZiAobmVlZHNSZXR1cm4gJiYgcmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUpIHsKLQkJb3V0cHV0bG4oIlx0cmV0dXJuIHJjOyIpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUdUS21lbW1vdmUoTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQlnZW5lcmF0ZUVudGVyTWFjcm8obWV0aG9kLCBmdW5jdGlvbik7Ci0Jb3V0cHV0KCJcdCIpOwotCWJvb2xlYW4gZ2V0ID0gcGFyYW1UeXBlc1swXS5pc1ByaW1pdGl2ZSgpOwotCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocGFyYW1UeXBlc1tnZXQgPyAxIDogMF0pOwotCW91dHB1dChnZXQgPyAiaWYgKGFyZzEpIGdldCIgOiAiaWYgKGFyZzApIHNldCIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dChnZXQgPyAiRmllbGRzKGVudiwgYXJnMSwgKCIgOiAiRmllbGRzKGVudiwgYXJnMCwgKCIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dChnZXQgPyAiICopYXJnMCkiIDogIiAqKWFyZzEpIik7Ci0Jb3V0cHV0bG4oIjsiKTsKLQlnZW5lcmF0ZUV4aXRNYWNybyhtZXRob2QsIGZ1bmN0aW9uKTsJCi19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkJvZHkoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBTdHJpbmcgZnVuY3Rpb24sIENsYXNzW10gcGFyYW1UeXBlcywgQ2xhc3MgcmV0dXJuVHlwZSkgewotCW91dHB1dGxuKCJ7Iik7Ci0JCi0JLyogQ3VzdG9tIEdUSyBtZW1tb3Zlcy4gKi8KLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JaWYgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JYm9vbGVhbiBpc0dUS21lbW92ZSA9IG5hbWUuZXF1YWxzKCJtZW1tb3ZlIikgJiYgcGFyYW1UeXBlcy5sZW5ndGggPT0gMiAmJiByZXR1cm5UeXBlID09IFZvaWQuVFlQRTsKLQlpZiAoaXNHVEttZW1vdmUpIHsKLQkJZ2VuZXJhdGVHVEttZW1tb3ZlKG1ldGhvZCwgZnVuY3Rpb24sIHBhcmFtVHlwZXMpOwotCX0gZWxzZSB7Ci0JCWJvb2xlYW4gbmVlZHNSZXR1cm4gPSBnZW5lcmF0ZUxvY2FsVmFycyhtZXRob2QsIHBhcmFtVHlwZXMsIHJldHVyblR5cGUpOwotCQlnZW5lcmF0ZUVudGVyTWFjcm8obWV0aG9kLCBmdW5jdGlvbik7Ci0JCWJvb2xlYW4gZ2VuRmFpbFRhZyA9IGdlbmVyYXRlR2V0dGVycyhtZXRob2QsIHBhcmFtVHlwZXMpOwotCQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKCJkeW5hbWljIikpIHsKLQkJCWdlbmVyYXRlRHluYW1pY0Z1bmN0aW9uQ2FsbChtZXRob2QsIG1ldGhvZERhdGEsIHBhcmFtVHlwZXMsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYXRlRnVuY3Rpb25DYWxsKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCQl9Ci0JCWlmIChnZW5GYWlsVGFnKSBvdXRwdXRsbigiZmFpbDoiKTsKLQkJZ2VuZXJhdGVTZXR0ZXJzKG1ldGhvZCwgcGFyYW1UeXBlcyk7Ci0JCWdlbmVyYXRlRXhpdE1hY3JvKG1ldGhvZCwgZnVuY3Rpb24pOwotCQlnZW5lcmF0ZVJldHVybihtZXRob2QsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQl9Ci0JCi0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUZ1bmN0aW9uUHJvdG90eXBlKE1ldGhvZCBtZXRob2QsIFN0cmluZyBmdW5jdGlvbiwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBDbGFzcyByZXR1cm5UeXBlKSB7Ci0Jb3V0cHV0KCJKTklFWFBPUlQgIik7Ci0Jb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKHJldHVyblR5cGUpKTsKLQlvdXRwdXQoIiBKTklDQUxMICIpOwotCW91dHB1dChnZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQlvdXRwdXQoIl9OQVRJVkUoIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigiKSIpOwotCW91dHB1dCgiXHQoSk5JRW52ICplbnYsICIpOwotCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKSB7Ci0JCW91dHB1dCgiamNsYXNzIik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0KCJqb2JqZWN0Iik7Ci0JfQotCW91dHB1dCgiIHRoYXQiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJb3V0cHV0KCIsICIpOwotCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocGFyYW1UeXBlKSk7Ci0JCW91dHB1dCgiIGFyZyIgKyBpKTsKLQl9Ci0Jb3V0cHV0bG4oIikiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZVN0YXJ0KFN0cmluZyBmdW5jdGlvbikgewotCW91dHB1dCgiI2lmbmRlZiBOT18iKTsKLQlvdXRwdXRsbihmdW5jdGlvbik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VFbmQoU3RyaW5nIGZ1bmN0aW9uKSB7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotfQotCi1ib29sZWFuIGlzQ3JpdGljYWwoQ2xhc3MgcGFyYW1UeXBlLCBQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSkgewotCXJldHVybiBwYXJhbVR5cGUuaXNBcnJheSgpICYmIHBhcmFtVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSAmJiBwYXJhbURhdGEuZ2V0RmxhZygiY3JpdGljYWwiKTsKLX0KLQotYm9vbGVhbiBpc1N5c3RlbUNsYXNzKENsYXNzIHR5cGUpIHsKLQlyZXR1cm4gdHlwZSA9PSBPYmplY3QuY2xhc3MgfHwgdHlwZSA9PSBDbGFzcy5jbGFzczsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotLy8JYXJncyA9IG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TIn07Ci0JaWYgKGFyZ3MubGVuZ3RoIDwgMSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIE5hdGl2ZXNHZW5lcmF0b3IgPGNsYXNzTmFtZTE+IDxjbGFzc05hbWUyPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCU5hdGl2ZXNHZW5lcmF0b3IgZ2VuID0gbmV3IE5hdGl2ZXNHZW5lcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY2xhenpOYW1lID0gYXJnc1tpXTsKLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQkJZ2VuLmdlbmVyYXRlKGNsYXp6KTsKLS8vCQkJZ2VuLmdlbmVyYXRlKGNsYXp6LCAiQ29tbWFuZEJhcl9EZXN0cm95Iik7Ci0JCX0KLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUGFyYW1ldGVyRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1BhcmFtZXRlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2OGU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUGFyYW1ldGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckRhdGEgZXh0ZW5kcyBJdGVtRGF0YSB7Ci0JCi0JTWV0aG9kIG1ldGhvZDsKLQlpbnQgcGFyYW1ldGVyOwotCi1wdWJsaWMgUGFyYW1ldGVyRGF0YShNZXRob2QgbWV0aG9kLCBpbnQgcGFyYW1ldGVyLCBTdHJpbmcgc3RyKSB7Ci0Jc3VwZXIoc3RyKTsKLQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQl0aGlzLnBhcmFtZXRlciA9IHBhcmFtZXRlcjsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxGbGFncygpIHsKLQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJub19pbiIsICJub19vdXQiLCAiY3JpdGljYWwiLCAiaW5pdCIsICJzdHJ1Y3QiLCAidW5pY29kZSJ9OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhc3QoKSB7Ci0JU3RyaW5nIGNhc3QgPSAoKFN0cmluZylnZXRQYXJhbSgiY2FzdCIpKS50cmltKCk7Ci0JaWYgKGNhc3QubGVuZ3RoKCkgPiAwKSB7Ci0JCWlmICghY2FzdC5zdGFydHNXaXRoKCIoIikpIGNhc3QgPSAiKCIgKyBjYXN0OwotCQlpZiAoIWNhc3QuZW5kc1dpdGgoIikiKSkgY2FzdCA9IGNhc3QgKyAiKSI7Ci0JfQotCXJldHVybiBjYXN0OwotfQotCi1wdWJsaWMgTWV0aG9kIGdldE1ldGhvZCgpIHsKLQlyZXR1cm4gbWV0aG9kOwotfQotCi1wdWJsaWMgaW50IGdldFBhcmFtZXRlcigpIHsKLQlyZXR1cm4gcGFyYW1ldGVyOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDYXN0KFN0cmluZyBzdHIpIHsKLQlzZXRQYXJhbSgiY2FzdCIsIHN0cik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Qcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Qcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0Y2Y3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2dyZXNzTW9uaXRvciB7Ci0KLXB1YmxpYyB2b2lkIHNldFRvdGFsKGludCB0b3RhbCk7Ci1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKLXB1YmxpYyB2b2lkIHN0ZXAoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1NpemVvZkdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1NpemVvZkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTI2MDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TaXplb2ZHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1wdWJsaWMgY2xhc3MgU2l6ZW9mR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dCgiXHRwcmludGYoXCIiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoIj0lZFxcblwiLCBzaXplb2YoIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIikpOyIpOwotLy8JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotLy8JZ2VuZXJhdGUoZmllbGRzKTsJCi19Ci0JCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlvdXRwdXRsbigiaW50IG1haW4oKSB7Iik7Ci0Jc3VwZXIuZ2VuZXJhdGUoKTsKLQlvdXRwdXRsbigifSIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZFtdIGZpZWxkcykgewotCXNvcnQoZmllbGRzKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmICgoZmllbGQuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5GSU5BTCkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKGZpZWxkKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkIGZpZWxkKSB7Ci0Jb3V0cHV0KCJcdHByaW50ZihcIiIpOwotCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCW91dHB1dCgiPSVkXFxuXCIsIHNpemVvZigiKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXRsbigiKSk7Iik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAxKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgU2l6ZW9mR2VuZXJhdG9yIDxjbGFzc05hbWUxPiA8Y2xhc3NOYW1lMj4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlTaXplb2ZHZW5lcmF0b3IgZ2VuID0gbmV3IFNpemVvZkdlbmVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjbGF6ek5hbWUgPSBhcmdzW2ldOwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCQlnZW4uZ2VuZXJhdGUoY2xhenopOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1N0YXRzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RhdHNHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1MGNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RhdHNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotcHVibGljIGNsYXNzIFN0YXRzR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotCWJvb2xlYW4gaGVhZGVyOwotCQotcHVibGljIFN0YXRzR2VuZXJhdG9yKGJvb2xlYW4gaGVhZGVyKSB7Ci0JdGhpcy5oZWFkZXIgPSBoZWFkZXI7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29weXJpZ2h0KCkgewotCWdlbmVyYXRlTWV0YURhdGEoInN3dF9jb3B5cmlnaHQiKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVJbmNsdWRlcygpIHsKLQlpZiAoIWhlYWRlcikgewotCQlvdXRwdXRsbigiI2luY2x1ZGUgXCJzd3QuaFwiIik7Ci0JCW91dHB1dCgiI2luY2x1ZGUgXCIiKTsKLQkJb3V0cHV0KGdldE91dHB1dE5hbWUoKSk7Ci0JCW91dHB1dGxuKCJfc3RhdHMuaFwiIik7Ci0JCW91dHB1dGxuKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCWlmIChoZWFkZXIpIHsKLQkJZ2VuZXJhdGVIZWFkZXJGaWxlKGNsYXp6KTsKLQl9IGVsc2UgewotCQlnZW5lcmF0ZVNvdXJjZUZpbGUoY2xhenopOwotCX0KLX0KLQotcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JcmV0dXJuIGhlYWRlciA/ICIuaCIgOiBzdXBlci5nZXRFeHRlbnNpb24oKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0JcmV0dXJuICJfc3RhdHMiOwotfQotCi12b2lkIGdlbmVyYXRlSGVhZGVyRmlsZShDbGFzcyBjbGF6eil7Ci0JZ2VuZXJhdGVOQVRJVkVNYWNyb3MoY2xhenopOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlzb3J0KG1ldGhvZHMpOwotCWdlbmVyYXRlRnVuY3Rpb25FbnVtKG1ldGhvZHMpOwkKLX0KLQotdm9pZCBnZW5lcmF0ZU5BVElWRU1hY3JvcyhDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dGxuKCIjaWZkZWYgTkFUSVZFX1NUQVRTIik7Ci0Jb3V0cHV0KCJleHRlcm4gaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25Db3VudDsiKTsKLQlvdXRwdXQoImV4dGVybiBpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOyIpOwotCW91dHB1dCgiZXh0ZXJuIGNoYXIqICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOyIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoIl9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Iik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXRsbigiI2Vsc2UiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpICIpOwotCW91dHB1dGxuKCIjZW5kaWYiKTsKLQlvdXRwdXRsbigpOwkKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZUZpbGUoQ2xhc3MgY2xhenopIHsKLQlvdXRwdXRsbigiI2lmZGVmIE5BVElWRV9TVEFUUyIpOwotCW91dHB1dGxuKCk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWludCBtZXRob2RDb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCW1ldGhvZENvdW50Kys7Ci0JfQotCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dCgiaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dCgiX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAiKTsKLQlvdXRwdXQoU3RyaW5nLnZhbHVlT2YobWV0aG9kQ291bnQpKTsKLQlvdXRwdXRsbigiOyIpOwotCW91dHB1dCgiaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dCgiX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WyIpOwotCW91dHB1dChTdHJpbmcudmFsdWVPZihtZXRob2RDb3VudCkpOwotCW91dHB1dGxuKCJdOyIpOwotCW91dHB1dCgiY2hhciAqICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0geyIpOwotCXNvcnQobWV0aG9kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCW91dHB1dCgiXHRcIiIpOwotCQlvdXRwdXQoZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkpOwotCQlvdXRwdXRsbigiXCIsIik7Ci0JCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zdGVwKCk7Ci0JfQotCW91dHB1dGxuKCJ9OyIpOwotCW91dHB1dGxuKCk7Ci0JZ2VuZXJhdGVTdGF0c05hdGl2ZXMoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigpOwotCW91dHB1dGxuKCIjZW5kaWYiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVN0YXRzTmF0aXZlcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0Jb3V0cHV0bG4oIiNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYyIpOwotCW91dHB1dGxuKCk7Ci0KLQlvdXRwdXQoIkpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKCIpOwotCW91dHB1dCh0b0MoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbkNvdW50IikpOwotCW91dHB1dGxuKCIpIik7Ci0Jb3V0cHV0bG4oIlx0KEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRyZXR1cm4gIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbkNvdW50OyIpOwotCW91dHB1dGxuKCJ9Iik7Ci0Jb3V0cHV0bG4oKTsKLQotCW91dHB1dCgiSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBTVEFUU19OQVRJVkUoIik7Ci0Jb3V0cHV0KHRvQyhjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uTmFtZSIpKTsKLQlvdXRwdXRsbigiKSIpOwotCW91dHB1dGxuKCJcdChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0cmV0dXJuICIpOwotCWlmIChpc0NQUCkgewotCQlvdXRwdXQoImVudi0+TmV3U3RyaW5nVVRGKCIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dCgiKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCAiKTsKLQl9Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbk5hbWVzW2luZGV4XSk7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLQlvdXRwdXRsbigpOwotCi0Jb3V0cHV0KCJKTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRSgiKTsKLQlvdXRwdXQodG9DKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25DYWxsQ291bnQiKSk7Ci0Jb3V0cHV0bG4oIikiKTsKLQlvdXRwdXRsbigiXHQoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdHJldHVybiAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2luZGV4XTsiKTsKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25FbnVtKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQlpZiAobWV0aG9kcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCW91dHB1dGxuKCJ0eXBlZGVmIGVudW0geyIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQlvdXRwdXQoIlx0Iik7Ci0JCW91dHB1dChnZXRGdW5jdGlvbk5hbWUobWV0aG9kKSk7Ci0JCW91dHB1dGxuKCJfRlVOQywiKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci0JQ2xhc3MgY2xhenogPSBtZXRob2RzWzBdLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0Jb3V0cHV0KCJ9ICIpOwotCW91dHB1dChnZXRDbGFzc05hbWUoY2xhenopKTsKLQlvdXRwdXRsbigiX0ZVTkNTOyIpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RydWN0c0dlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1N0cnVjdHNHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjOGE2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RydWN0c0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHNHZW5lcmF0b3IgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi1ib29sZWFuIGhlYWRlcjsKLQotcHVibGljIFN0cnVjdHNHZW5lcmF0b3IoYm9vbGVhbiBoZWFkZXIpIHsKLQl0aGlzLmhlYWRlciA9IGhlYWRlcjsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X2NvcHlyaWdodCIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotCWlmIChoZWFkZXIpIHsKLQkJb3V0cHV0KCIjaW5jbHVkZSBcIiIpOwotCQlvdXRwdXQoZ2V0T3V0cHV0TmFtZSgpKTsKLQkJb3V0cHV0bG4oIi5oXCIiKTsKLQl9IGVsc2UgewotCQlvdXRwdXRsbigiI2luY2x1ZGUgXCJzd3QuaFwiIik7Ci0JCW91dHB1dCgiI2luY2x1ZGUgXCIiKTsKLQkJb3V0cHV0KGdldE91dHB1dE5hbWUoKSk7Ci0JCW91dHB1dGxuKCJfc3RydWN0cy5oXCIiKTsKLQl9Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlpbnQgaiA9IDA7Ci0JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotCWZvciAoOyBqIDwgZmllbGRzLmxlbmd0aDsgaisrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2pdOwotCQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5QVUJMSUMpICE9IDAgJiYgKG1vZHMgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChqID09IGZpZWxkcy5sZW5ndGgpIHJldHVybjsKLQlpZiAoaGVhZGVyKSB7Ci0JCWdlbmVyYXRlSGVhZGVyRmlsZShjbGF6eik7Ci0JfSBlbHNlIHsKLQkJZ2VuZXJhdGVTb3VyY2VGaWxlKGNsYXp6KTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgewotCWlmICghaGVhZGVyICYmIGdldENsYXNzZXMoKS5sZW5ndGggPT0gMCkgcmV0dXJuOwotCXN1cGVyLmdlbmVyYXRlKCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBoZWFkZXIgPyAiLmgiIDogc3VwZXIuZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotCXJldHVybiAiX3N0cnVjdHMiOwotfQotCi12b2lkIGdlbmVyYXRlRXhjbHVkZXMoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JSGFzaFNldCBleGNsdWRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoY2xhenopOwotCQlTdHJpbmcgZXhjbHVkZSA9IGNsYXNzRGF0YS5nZXRFeGNsdWRlKCk7Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCWV4Y2x1ZGVzLmFkZChleGNsdWRlKTsKLQkJfQotCX0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNsdWRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQlvdXRwdXRsbihleGNsdWRlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCQlDbGFzc0RhdGEgY2xhc3NEYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShjbGF6eik7Ci0JCQlTdHJpbmcgY2xhc3NFeGNsdWRlID0gY2xhc3NEYXRhLmdldEV4Y2x1ZGUoKTsKLQkJCWlmIChleGNsdWRlLmVxdWFscyhjbGFzc0V4Y2x1ZGUpKSB7Ci0JCQkJb3V0cHV0KCIjZGVmaW5lIE5PXyIpOwotCQkJCW91dHB1dGxuKGdldENsYXNzTmFtZShjbGF6eikpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVIZWFkZXJGaWxlKENsYXNzIGNsYXp6KSB7Ci0JZ2VuZXJhdGVTb3VyY2VTdGFydChjbGF6eik7Ci0JZ2VuZXJhdGVQcm90b3R5cGVzKGNsYXp6KTsKLQlnZW5lcmF0ZUJsYW5rTWFjcm9zKGNsYXp6KTsKLQlnZW5lcmF0ZVNvdXJjZUVuZChjbGF6eik7CQotCW91dHB1dGxuKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VGaWxlKENsYXNzIGNsYXp6KSB7Ci0JZ2VuZXJhdGVTb3VyY2VTdGFydChjbGF6eik7Ci0JZ2VuZXJhdGVGSURzU3RydWN0dXJlKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlR2xvYmFsVmFyKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlRnVuY3Rpb25zKGNsYXp6KTsKLQlnZW5lcmF0ZVNvdXJjZUVuZChjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZVN0YXJ0KENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCIjaWZuZGVmIE5PXyIpOwotCW91dHB1dGxuKGNsYXp6TmFtZSk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VFbmQoQ2xhc3MgY2xhenopIHsKLQlvdXRwdXRsbigiI2VuZGlmIik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVHbG9iYWxWYXIoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIl9GSURfQ0FDSEUgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZjOyIpOwotfQotCi12b2lkIGdlbmVyYXRlQmxhbmtNYWNyb3MoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXRsbigiI2Vsc2UiKTsKLQlvdXRwdXQoIiNkZWZpbmUgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGEsYikiKTsKLQlvdXRwdXQoIiNkZWZpbmUgZ2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhhLGIsYykgTlVMTCIpOwotCW91dHB1dCgiI2RlZmluZSBzZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGEsYixjKSIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiX3NpemVvZigpIDAiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVByb3RvdHlwZXMoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoInZvaWQgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0KTsiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIiAqZ2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCIgKmxwU3RydWN0KTsiKTsKLQlvdXRwdXQoInZvaWQgc2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCIgKmxwU3RydWN0KTsiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJfc2l6ZW9mKCkgc2l6ZW9mKCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCIpIik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGSURzU3RydWN0dXJlKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJ0eXBlZGVmIHN0cnVjdCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiX0ZJRF9DQUNIRSB7Iik7Ci0Jb3V0cHV0bG4oIlx0aW50IGNhY2hlZDsiKTsKLQlvdXRwdXRsbigiXHRqY2xhc3MgY2xheno7Iik7Ci0Jb3V0cHV0KCJcdGpmaWVsZElEICIpOwotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKGlnbm9yZUZpZWxkKGZpZWxkKSkgY29udGludWU7Ci0JCWlmICghZmlyc3QpIG91dHB1dCgiLCAiKTsKLQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCWZpcnN0ID0gZmFsc2U7Ci0JfQotCW91dHB1dGxuKCI7Iik7Ci0Jb3V0cHV0KCJ9ICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJfRklEX0NBQ0hFOyIpOwotfQotCi12b2lkIGdlbmVyYXRlQ2FjaGVGdW5jdGlvbihDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dCgidm9pZCBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0aWYgKCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGYy5jYWNoZWQpIHJldHVybjsiKTsKLQlDbGFzcyBzdXBlcmNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCWlmIChzdXBlcmNsYXp6ICE9IE9iamVjdC5jbGFzcykgewotCQlTdHJpbmcgc3VwZXJOYW1lID0gZ2V0Q2xhc3NOYW1lKHN1cGVyY2xhenopOwotCQlvdXRwdXQoIlx0Y2FjaGUiKTsKLQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCW91dHB1dGxuKCJGaWVsZHMoZW52LCBscE9iamVjdCk7Iik7Ci0JfQotCW91dHB1dCgiXHQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlpZiAoaXNDUFApIHsKLQkJb3V0cHV0KCJGYy5jbGF6eiA9IGVudi0+R2V0T2JqZWN0Q2xhc3MobHBPYmplY3QpOyIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dCgiRmMuY2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOyIpOwotCX0KLQlvdXRwdXRsbigpOwotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKGlnbm9yZUZpZWxkKGZpZWxkKSkgY29udGludWU7Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGNsYXp6TmFtZSk7Ci0JCW91dHB1dCgiRmMuIik7Ci0JCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQlpZiAoaXNDUFApIHsKLQkJCW91dHB1dCgiID0gZW52LT5HZXRGaWVsZElEKCIpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCAiKTsKLQkJfQotCQlvdXRwdXQoY2xhenpOYW1lKTsKLQkJb3V0cHV0KCJGYy5jbGF6eiwgXCIiKTsKLQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCW91dHB1dCgiXCIsIFwiIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlKGZpZWxkLmdldFR5cGUoKSkpOwotCQlvdXRwdXRsbigiXCIpOyIpOwotCX0KLQlvdXRwdXQoIlx0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZjLmNhY2hlZCA9IDE7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUdldEZpZWxkcyhDbGFzcyBjbGF6eikgewotCUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JU3RyaW5nIHN1cGVyTmFtZSA9IGdldENsYXNzTmFtZShzdXBlcmNsYXp6KTsKLQlpZiAoc3VwZXJjbGF6eiAhPSBPYmplY3QuY2xhc3MpIHsKLQkJLyogV2luZG93cyBleGNlcHRpb24gLSBjYW5ub3QgY2FsbCBnZXQvc2V0IGZ1bmN0aW9uIG9mIHN1cGVyIGNsYXNzIGluIHRoaXMgY2FzZSAqLwotCQlpZiAoIShjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJBIikgfHwgY2xhenpOYW1lLmVxdWFscyhzdXBlck5hbWUgKyAiVyIpKSkgewotCQkJb3V0cHV0KCJcdGdldCIpOwotCQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0LCAoIik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dGxuKCIgKilscFN0cnVjdCk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZUdldEZpZWxkcyhzdXBlcmNsYXp6KTsKLQkJfQotCX0KLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlGaWVsZERhdGEgZmllbGREYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShmaWVsZCk7Ci0JCVN0cmluZyBleGNsdWRlID0gZmllbGREYXRhLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCX0KLQkJYm9vbGVhbiBub1dpbkNFID0gZmllbGREYXRhLmdldEZsYWcoIm5vX3dpbmNlIik7Ci0JCWlmIChub1dpbkNFKSB7Ci0JCQlvdXRwdXRsbigiI2lmbmRlZiBfV0lOMzJfV0NFIik7Ci0JCX0KLQkJQ2xhc3MgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKHR5cGUpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yID09IG51bGwgfHwgYWNjZXNzb3IubGVuZ3RoKCkgPT0gMCkgYWNjZXNzb3IgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCW91dHB1dCgiXHRscFN0cnVjdC0+Iik7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJb3V0cHV0KCIgPSAiKTsKLQkJCW91dHB1dChmaWVsZERhdGEuZ2V0Q2FzdCgpKTsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiZW52LT5HZXQiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPkdldCIpOwotCQkJfQotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJGaWVsZChscE9iamVjdCwgIik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiRmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQl9Ci0JCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCW91dHB1dCgiRmMuIik7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dCgiKTsiKTsKLQkJfSBlbHNlIGlmICh0eXBlLmlzQXJyYXkoKSkgewotCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCQlvdXRwdXQoIlx0Iik7CQkJCQotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCQlvdXRwdXQoIiBscE9iamVjdDEgPSAoIik7Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIillbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIikoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCQlvdXRwdXQoIkZjLiIpOwotCQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIlx0ZW52LT5HZXQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIlx0KCplbnYpLT5HZXQiKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGNvbXBvbmVudFR5cGUpKTsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihscE9iamVjdDEsIDAsIHNpemVvZihscFN0cnVjdC0+Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihlbnYsIGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXQoIikiKTsKLQkJCQlpbnQgYnl0ZUNvdW50ID0gZ2V0Qnl0ZUNvdW50KGNvbXBvbmVudFR5cGUpOwotCQkJCWlmIChieXRlQ291bnQgPiAxKSB7Ci0JCQkJCW91dHB1dCgiIC8gIik7Ci0JCQkJCW91dHB1dChTdHJpbmcudmFsdWVPZihieXRlQ291bnQpKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KCIsICgiKTsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTQodHlwZSkpOwkJCQkKLQkJCQlvdXRwdXQoIilscFN0cnVjdC0+Iik7Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXRsbigiKTsiKTsKLQkJCQlvdXRwdXQoIlx0fSIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXJyb3IoIm5vdCBkb25lIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXRsbigiXHR7Iik7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoIlx0am9iamVjdCBscE9iamVjdDEgPSBlbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCJcdGpvYmplY3QgbHBPYmplY3QxID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGxwT2JqZWN0LCAiKTsKLQkJCX0KLQkJCW91dHB1dChnZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCQkJb3V0cHV0KCJGYy4iKTsKLQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQlvdXRwdXQoIlx0aWYgKGxwT2JqZWN0MSAhPSBOVUxMKSBnZXQiKTsKLQkJCW91dHB1dCh0eXBlTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0MSwgJmxwU3RydWN0LT4iKTsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJCW91dHB1dCgiXHR9Iik7Ci0JCX0KLQkJb3V0cHV0bG4oKTsKLQkJaWYgKG5vV2luQ0UpIHsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCQlpZiAoZXhjbHVkZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVHZXRGdW5jdGlvbihDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiICpnZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIiAqbHBTdHJ1Y3QpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0aWYgKCEiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZjLmNhY2hlZCkgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGVudiwgbHBPYmplY3QpOyIpOwotCWdlbmVyYXRlR2V0RmllbGRzKGNsYXp6KTsKLQlvdXRwdXRsbigiXHRyZXR1cm4gbHBTdHJ1Y3Q7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNldEZpZWxkcyhDbGFzcyBjbGF6eikgewotCUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JU3RyaW5nIHN1cGVyTmFtZSA9IGdldENsYXNzTmFtZShzdXBlcmNsYXp6KTsKLQlpZiAoc3VwZXJjbGF6eiAhPSBPYmplY3QuY2xhc3MpIHsKLQkJLyogV2luZG93cyBleGNlcHRpb24gLSBjYW5ub3QgY2FsbCBnZXQvc2V0IGZ1bmN0aW9uIG9mIHN1cGVyIGNsYXNzIGluIHRoaXMgY2FzZSAqLwotCQlpZiAoIShjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJBIikgfHwgY2xhenpOYW1lLmVxdWFscyhzdXBlck5hbWUgKyAiVyIpKSkgewotCQkJb3V0cHV0KCJcdHNldCIpOwotCQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0LCAoIik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dGxuKCIgKilscFN0cnVjdCk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZVNldEZpZWxkcyhzdXBlcmNsYXp6KTsKLQkJfQotCX0KLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlGaWVsZERhdGEgZmllbGREYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShmaWVsZCk7Ci0JCVN0cmluZyBleGNsdWRlID0gZmllbGREYXRhLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCX0KLQkJYm9vbGVhbiBub1dpbkNFID0gZmllbGREYXRhLmdldEZsYWcoIm5vX3dpbmNlIik7Ci0JCWlmIChub1dpbkNFKSB7Ci0JCQlvdXRwdXRsbigiI2lmbmRlZiBfV0lOMzJfV0NFIik7Ci0JCX0KLQkJQ2xhc3MgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKHR5cGUpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yID09IG51bGwgfHwgYWNjZXNzb3IubGVuZ3RoKCkgPT0gMCkgYWNjZXNzb3IgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiXHRlbnYtPlNldCIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIlx0KCplbnYpLT5TZXQiKTsKLQkJCX0KLQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMShmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiRmllbGQobHBPYmplY3QsICIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIkZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJfQotCQkJb3V0cHV0KGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXQoIiwgKCIpOwotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJb3V0cHV0KCIpbHBTdHJ1Y3QtPiIpOwotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCW91dHB1dCgiKTsiKTsKLQkJfSBlbHNlIGlmICh0eXBlLmlzQXJyYXkoKSkgewotCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCQlvdXRwdXQoIlx0Iik7CQkJCQotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCQlvdXRwdXQoIiBscE9iamVjdDEgPSAoIik7Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIillbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIikoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCQlvdXRwdXQoIkZjLiIpOwotCQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIlx0ZW52LT5TZXQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIlx0KCplbnYpLT5TZXQiKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGNvbXBvbmVudFR5cGUpKTsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihscE9iamVjdDEsIDAsIHNpemVvZihscFN0cnVjdC0+Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihlbnYsIGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXQoIikiKTsKLQkJCQlpbnQgYnl0ZUNvdW50ID0gZ2V0Qnl0ZUNvdW50KGNvbXBvbmVudFR5cGUpOwotCQkJCWlmIChieXRlQ291bnQgPiAxKSB7Ci0JCQkJCW91dHB1dCgiIC8gIik7Ci0JCQkJCW91dHB1dChTdHJpbmcudmFsdWVPZihieXRlQ291bnQpKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KCIsICgiKTsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTQodHlwZSkpOwkJCQkKLQkJCQlvdXRwdXQoIilscFN0cnVjdC0+Iik7Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXRsbigiKTsiKTsKLQkJCQlvdXRwdXQoIlx0fSIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXJyb3IoIm5vdCBkb25lIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXRsbigiXHR7Iik7Ci0JCQlvdXRwdXQoIlx0am9iamVjdCBscE9iamVjdDEgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJb3V0cHV0KGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJCW91dHB1dCgiXHRpZiAobHBPYmplY3QxICE9IE5VTEwpIHNldCIpOwotCQkJb3V0cHV0KHR5cGVOYW1lKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgbHBPYmplY3QxLCAmbHBTdHJ1Y3QtPiIpOwotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJb3V0cHV0KCJcdH0iKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCQlpZiAobm9XaW5DRSkgewotCQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQl9Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNldEZ1bmN0aW9uKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJ2b2lkIHNldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiICpscFN0cnVjdCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRpZiAoISIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmMuY2FjaGVkKSBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoZW52LCBscE9iamVjdCk7Iik7Ci0JZ2VuZXJhdGVTZXRGaWVsZHMoY2xhenopOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbnMoQ2xhc3MgY2xhenopIHsKLQlnZW5lcmF0ZUNhY2hlRnVuY3Rpb24oY2xhenopOwotCW91dHB1dGxuKCk7Ci0JZ2VuZXJhdGVHZXRGdW5jdGlvbihjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZVNldEZ1bmN0aW9uKGNsYXp6KTsKLX0KLQotYm9vbGVhbiBpZ25vcmVGaWVsZChGaWVsZCBmaWVsZCkgewotCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7Ci0JcmV0dXJuCi0JCSgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkgfHwKLQkJKChtb2RzICYgTW9kaWZpZXIuRklOQUwpICE9IDApIHx8Ci0JCSgobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsuQVRLLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLkFUSy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E3YjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsuQVRLLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0FUSz0KLUFUS19BdGtPYmplY3RGYWN0b3J5Q2xhc3Nfc2l6ZW9mPQotCi1BVEtfQXRrT2JqZWN0RmFjdG9yeV9zaXplb2Y9Ci0KLUFUS19fQVRLX0FDVElPTl9HRVRfSUZBQ0U9Ci1BVEtfX0FUS19BQ1RJT05fR0VUX0lGQUNFXzA9Ci0KLUFUS19fQVRLX0NPTVBPTkVOVF9HRVRfSUZBQ0U9Ci1BVEtfX0FUS19DT01QT05FTlRfR0VUX0lGQUNFXzA9Ci0KLUFUS19fQVRLX09CSkVDVF9GQUNUT1JZX0NMQVNTPQotQVRLX19BVEtfT0JKRUNUX0ZBQ1RPUllfQ0xBU1NfMD0KLQotQVRLX19BVEtfU0VMRUNUSU9OX0dFVF9JRkFDRT0KLUFUS19fQVRLX1NFTEVDVElPTl9HRVRfSUZBQ0VfMD0KLQotQVRLX19BVEtfVEVYVF9HRVRfSUZBQ0U9Ci1BVEtfX0FUS19URVhUX0dFVF9JRkFDRV8wPQotCi1BVEtfX0dUS19BQ0NFU1NJQkxFPQotQVRLX19HVEtfQUNDRVNTSUJMRV8wPQotCi1BVEtfX2F0a19mb2N1c190cmFja2VyX25vdGlmeT0KLUFUS19fYXRrX2ZvY3VzX3RyYWNrZXJfbm90aWZ5XzA9Y2FzdD0oQXRrT2JqZWN0ICopCi0KLUFUS19fYXRrX2dldF9kZWZhdWx0X3JlZ2lzdHJ5PQotCi1BVEtfX2F0a19vYmplY3RfYWRkX3JlbGF0aW9uc2hpcD0KLUFUS19fYXRrX29iamVjdF9hZGRfcmVsYXRpb25zaGlwXzA9Y2FzdD0oQXRrT2JqZWN0ICopCi1BVEtfX2F0a19vYmplY3RfYWRkX3JlbGF0aW9uc2hpcF8xPWNhc3Q9KEF0a1JlbGF0aW9uVHlwZSkKLUFUS19fYXRrX29iamVjdF9hZGRfcmVsYXRpb25zaGlwXzI9Y2FzdD0oQXRrT2JqZWN0ICopCi0KLUFUS19fYXRrX29iamVjdF9mYWN0b3J5X2NyZWF0ZV9hY2Nlc3NpYmxlPQotQVRLX19hdGtfb2JqZWN0X2ZhY3RvcnlfY3JlYXRlX2FjY2Vzc2libGVfMD1jYXN0PShBdGtPYmplY3RGYWN0b3J5ICopCi1BVEtfX2F0a19vYmplY3RfZmFjdG9yeV9jcmVhdGVfYWNjZXNzaWJsZV8xPWNhc3Q9KEdPYmplY3QgKikKLQotQVRLX19hdGtfb2JqZWN0X2ZhY3RvcnlfZ2V0X2FjY2Vzc2libGVfdHlwZT0KLUFUS19fYXRrX29iamVjdF9mYWN0b3J5X2dldF9hY2Nlc3NpYmxlX3R5cGVfMD1jYXN0PShBdGtPYmplY3RGYWN0b3J5ICopCi0KLUFUS19fYXRrX29iamVjdF9pbml0aWFsaXplPQotQVRLX19hdGtfb2JqZWN0X2luaXRpYWxpemVfMD1jYXN0PShBdGtPYmplY3QgKikKLUFUS19fYXRrX29iamVjdF9pbml0aWFsaXplXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLUFUS19fYXRrX29iamVjdF9yZWZfcmVsYXRpb25fc2V0PQotQVRLX19hdGtfb2JqZWN0X3JlZl9yZWxhdGlvbl9zZXRfMD1jYXN0PShBdGtPYmplY3QgKikKLQotQVRLX19hdGtfcmVnaXN0cnlfZ2V0X2ZhY3Rvcnk9Ci1BVEtfX2F0a19yZWdpc3RyeV9nZXRfZmFjdG9yeV8wPWNhc3Q9KEF0a1JlZ2lzdHJ5ICopCi1BVEtfX2F0a19yZWdpc3RyeV9nZXRfZmFjdG9yeV8xPWNhc3Q9KEdUeXBlKQotCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlPQotQVRLX19hdGtfcmVnaXN0cnlfc2V0X2ZhY3RvcnlfdHlwZV8wPWNhc3Q9KEF0a1JlZ2lzdHJ5ICopCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlXzE9Y2FzdD0oR1R5cGUpCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlXzI9Y2FzdD0oR1R5cGUpCi0KLUFUS19fYXRrX3JlbGF0aW9uX3NldF9nZXRfbl9yZWxhdGlvbnM9Ci1BVEtfX2F0a19yZWxhdGlvbl9zZXRfZ2V0X25fcmVsYXRpb25zXzA9Y2FzdD0oQXRrUmVsYXRpb25TZXQgKikKLQotQVRLX19hdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbj0KLUFUS19fYXRrX3JlbGF0aW9uX3NldF9nZXRfcmVsYXRpb25fMD1jYXN0PShBdGtSZWxhdGlvblNldCAqKQotQVRLX19hdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbl8xPQotCi1BVEtfX2F0a19yZWxhdGlvbl9zZXRfcmVtb3ZlPQotQVRLX19hdGtfcmVsYXRpb25fc2V0X3JlbW92ZV8wPWNhc3Q9KEF0a1JlbGF0aW9uU2V0ICopCi1BVEtfX2F0a19yZWxhdGlvbl9zZXRfcmVtb3ZlXzE9Y2FzdD0oQXRrUmVsYXRpb24gKikKLQotQVRLX19hdGtfc3RhdGVfc2V0X2FkZF9zdGF0ZT0KLUFUS19fYXRrX3N0YXRlX3NldF9hZGRfc3RhdGVfMD1jYXN0PShBdGtTdGF0ZVNldCAqKQotQVRLX19hdGtfc3RhdGVfc2V0X2FkZF9zdGF0ZV8xPWNhc3Q9KEF0a1N0YXRlVHlwZSkKLQotQVRLX19hdGtfc3RhdGVfc2V0X25ldz0KLQotQVRLX18xY2FsbF9fSUk9Ci1BVEtfXzFjYWxsX19JSV8wPQotQVRLX18xY2FsbF9fSUlfMT0KLQotQVRLX18xY2FsbF9fSUlJPQotQVRLX18xY2FsbF9fSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlfMT0KLUFUS19fMWNhbGxfX0lJSV8yPQotCi1BVEtfXzFjYWxsX19JSUlJPQotQVRLX18xY2FsbF9fSUlJSV8wPQotQVRLX18xY2FsbF9fSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSV8yPQotQVRLX18xY2FsbF9fSUlJSV8zPQotCi1BVEtfXzFjYWxsX19JSUlJST0KLUFUS19fMWNhbGxfX0lJSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSUlfMj0KLUFUS19fMWNhbGxfX0lJSUlJXzM9Ci1BVEtfXzFjYWxsX19JSUlJSV80PQotCi1BVEtfXzFjYWxsX19JSUlJSUk9Ci1BVEtfXzFjYWxsX19JSUlJSUlfMD0KLUFUS19fMWNhbGxfX0lJSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSUlJXzI9Ci1BVEtfXzFjYWxsX19JSUlJSUlfMz0KLUFUS19fMWNhbGxfX0lJSUlJSV80PQotQVRLX18xY2FsbF9fSUlJSUlJXzU9Ci0KLUFUS19fMWNhbGxfX0lJSUlJSUk9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzE9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzI9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzM9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzQ9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzU9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzY9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtBY3Rpb25JZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtBY3Rpb25JZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtDb21wb25lbnRJZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtDb21wb25lbnRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtIeXBlcnRleHRJZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtIeXBlcnRleHRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RDbGFzc18yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RDbGFzc18yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RGYWN0b3J5Q2xhc3NfMj0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RGYWN0b3J5Q2xhc3NfMl8wPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtTZWxlY3Rpb25JZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtTZWxlY3Rpb25JZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtUZXh0SWZhY2VfMj0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtUZXh0SWZhY2VfMl8wPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrQWN0aW9uSWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrQ29tcG9uZW50SWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrSHlwZXJ0ZXh0SWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0Q2xhc3NfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18yST0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18ySV8wPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0RmFjdG9yeUNsYXNzXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrU2VsZWN0aW9uSWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8yST0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8ySV8wPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrVGV4dElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0d0a0FjY2Vzc2libGVfMkk9Ci1BVEtfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlXzJJXzA9Ci1BVEtfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlXzJJXzE9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlPQotQXRrQWN0aW9uSWZhY2VfZG9fYWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrQWN0aW9uSWZhY2VfZ2V0X25fYWN0aW9ucz1jYXN0PShnaW50ICgqKSgpKQotQXRrQWN0aW9uSWZhY2VfZ2V0X2Rlc2NyaXB0aW9uPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX2dldF9uYW1lPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX2dldF9rZXliaW5kaW5nPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX3NldF9kZXNjcmlwdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlPQotQXRrQ29tcG9uZW50SWZhY2VfYWRkX2ZvY3VzX2hhbmRsZXI9Y2FzdD0oZ3VpbnQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9jb250YWlucz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3JlZl9hY2Nlc3NpYmxlX2F0X3BvaW50PWNhc3Q9KEF0a09iamVjdCAqKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9nZXRfZXh0ZW50cz1jYXN0PSh2b2lkICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X3Bvc2l0aW9uPWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9nZXRfc2l6ZT1jYXN0PSh2b2lkICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ3JhYl9mb2N1cz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3JlbW92ZV9mb2N1c19oYW5kbGVyPWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9zZXRfZXh0ZW50cz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3NldF9wb3NpdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3NldF9zaXplPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X2xheWVyPWNhc3Q9KEF0a0xheWVyICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X21kaV96b3JkZXI9Y2FzdD0oZ2ludCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlPQotQXRrSHlwZXJ0ZXh0SWZhY2VfZ2V0X2xpbms9Y2FzdD0oQXRrSHlwZXJsaW5rICooKikoKSkKLUF0a0h5cGVydGV4dElmYWNlX2dldF9uX2xpbmtzPWNhc3Q9KGdpbnQgKCopKCkpCi1BdGtIeXBlcnRleHRJZmFjZV9nZXRfbGlua19pbmRleD1jYXN0PShnaW50ICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0Q2xhc3M9Ci1BdGtPYmplY3RDbGFzc19nZXRfbmFtZT1jYXN0PShHX0NPTlNUX1JFVFVSTiBnY2hhciAqKCopKCkpCi1BdGtPYmplY3RDbGFzc19nZXRfZGVzY3JpcHRpb249Y2FzdD0oR19DT05TVF9SRVRVUk4gZ2NoYXIgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X3BhcmVudD1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X25fY2hpbGRyZW49Y2FzdD0oZ2ludCAoKikoKSkKLUF0a09iamVjdENsYXNzX3JlZl9jaGlsZD1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X2luZGV4X2luX3BhcmVudD1jYXN0PShnaW50ICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfcmVmX3JlbGF0aW9uX3NldD1jYXN0PShBdGtSZWxhdGlvblNldCAqKCopKCkpCi1BdGtPYmplY3RDbGFzc19nZXRfcm9sZT1jYXN0PShBdGtSb2xlICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X2xheWVyPWNhc3Q9KEF0a0xheWVyICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X21kaV96b3JkZXI9Y2FzdD0oZ2ludCAoKikoKSkKLUF0a09iamVjdENsYXNzX3JlZl9zdGF0ZV9zZXQ9Y2FzdD0oQXRrU3RhdGVTZXQgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X25hbWU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX3NldF9kZXNjcmlwdGlvbj1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X3BhcmVudD1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X3JvbGU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2Nvbm5lY3RfcHJvcGVydHlfY2hhbmdlX2hhbmRsZXI9Y2FzdD0oZ3VpbnQgKCopKCkpCi1BdGtPYmplY3RDbGFzc19yZW1vdmVfcHJvcGVydHlfY2hhbmdlX2hhbmRsZXI9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2luaXRpYWxpemU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2NoaWxkcmVuX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2ZvY3VzX2V2ZW50PWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtPYmplY3RDbGFzc19wcm9wZXJ0eV9jaGFuZ2U9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX3N0YXRlX2NoYW5nZT1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfdmlzaWJsZV9kYXRhX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzcz0KLUF0a09iamVjdEZhY3RvcnlDbGFzc19jcmVhdGVfYWNjZXNzaWJsZT1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0RmFjdG9yeUNsYXNzX2ludmFsaWRhdGU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdEZhY3RvcnlDbGFzc19nZXRfYWNjZXNzaWJsZV90eXBlPWNhc3Q9KEdUeXBlICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrU2VsZWN0aW9uSWZhY2U9Ci1BdGtTZWxlY3Rpb25JZmFjZV9hZGRfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfY2xlYXJfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfcmVmX3NlbGVjdGlvbj1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfZ2V0X3NlbGVjdGlvbl9jb3VudD1jYXN0PShnaW50ICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfaXNfY2hpbGRfc2VsZWN0ZWQ9Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtTZWxlY3Rpb25JZmFjZV9yZW1vdmVfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2Vfc2VsZWN0X2FsbF9zZWxlY3Rpb249Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtTZWxlY3Rpb25JZmFjZV9zZWxlY3Rpb25fY2hhbmdlZD1jYXN0PSh2b2lkICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrVGV4dElmYWNlPQotQXRrVGV4dElmYWNlX2dldF90ZXh0PWNhc3Q9KGdjaGFyICooKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfdGV4dF9hZnRlcl9vZmZzZXQ9Y2FzdD0oZ2NoYXIgKigqKSgpKQotQXRrVGV4dElmYWNlX2dldF90ZXh0X2F0X29mZnNldD1jYXN0PShnY2hhciAqKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X2NoYXJhY3Rlcl9hdF9vZmZzZXQ9Y2FzdD0oZ3VuaWNoYXIgKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X3RleHRfYmVmb3JlX29mZnNldD1jYXN0PShnY2hhciAqKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X2NhcmV0X29mZnNldD1jYXN0PShnaW50ICgqKSgpKQotQXRrVGV4dElmYWNlX2dldF9ydW5fYXR0cmlidXRlcz1jYXN0PShBdGtBdHRyaWJ1dGVTZXQgKigqKSgpKQotQXRrVGV4dElmYWNlX2dldF9kZWZhdWx0X2F0dHJpYnV0ZXM9Y2FzdD0oQXRrQXR0cmlidXRlU2V0ICooKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfY2hhcmFjdGVyX2V4dGVudHM9Y2FzdD0odm9pZCAoKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfY2hhcmFjdGVyX2NvdW50PWNhc3Q9KGdpbnQgKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X29mZnNldF9hdF9wb2ludD1jYXN0PShnaW50ICgqKSgpKQotQXRrVGV4dElmYWNlX2dldF9uX3NlbGVjdGlvbnM9Y2FzdD0oZ2ludCAoKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfc2VsZWN0aW9uPWNhc3Q9KGdjaGFyICooKikoKSkKLUF0a1RleHRJZmFjZV9hZGRfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrVGV4dElmYWNlX3JlbW92ZV9zZWxlY3Rpb249Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtUZXh0SWZhY2Vfc2V0X3NlbGVjdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a1RleHRJZmFjZV9zZXRfY2FyZXRfb2Zmc2V0PWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrVGV4dElmYWNlX3RleHRfY2hhbmdlZD1jYXN0PSh2b2lkICgqKSgpKQotQXRrVGV4dElmYWNlX3RleHRfY2FyZXRfbW92ZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUF0a1RleHRJZmFjZV90ZXh0X3NlbGVjdGlvbl9jaGFuZ2VkPWNhc3Q9KHZvaWQgKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlPQotR3RrQWNjZXNzaWJsZV93aWRnZXQ9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjYzVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXNcblwKLSAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpIFZlcnNpb24gMi4xIHRoYXRcblwKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIChsZ3BsLXYyMS50eHQpLiAgVGhlIExHUEwgaXMgYWxzb1xuXAotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWwuICBJZiB0aGUgdmVyc2lvblxuXAotICogb2YgdGhlIExHUEwgYXQgaHR0cDovL3d3dy5nbnUub3JnIGlzIGRpZmZlcmVudCB0byB0aGUgdmVyc2lvbiBvZlxuXAotICogdGhlIExHUEwgYWNjb21wYW55aW5nIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCB0aGVyZSBpcyBhbnkgY29uZmxpY3RcblwKLSAqIGJldHdlZW4gdGhlIHR3byBsaWNlbnNlIHZlcnNpb25zLCB0aGUgdGVybXMgb2YgdGhlIExHUEwgYWNjb21wYW55aW5nXG5cCi0gKiB0aGlzIGRpc3RyaWJ1dGlvbiBzaGFsbCBnb3Zlcm4uXG5cCi0gKiBcblwKLSAqIENvbnRyaWJ1dG9yczpcblwKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cblwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYWlyby5DYWlyby5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYWlyby5DYWlyby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFiZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8uQ2Fpcm8ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fQ2Fpcm89Ci1DYWlyb19jYWlyb19hcHBlbmRfcGF0aD0KLUNhaXJvX2NhaXJvX2FwcGVuZF9wYXRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fYXBwZW5kX3BhdGhfMT1jYXN0PShjYWlyb19wYXRoX3QgKikKLQotQ2Fpcm9fY2Fpcm9fYXJjPQotQ2Fpcm9fY2Fpcm9fYXJjXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fYXJjXzE9Ci1DYWlyb19jYWlyb19hcmNfMj0KLUNhaXJvX2NhaXJvX2FyY18zPQotQ2Fpcm9fY2Fpcm9fYXJjXzQ9Ci1DYWlyb19jYWlyb19hcmNfNT0KLQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlPQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzE9Ci1DYWlyb19jYWlyb19hcmNfbmVnYXRpdmVfMj0KLUNhaXJvX2NhaXJvX2FyY19uZWdhdGl2ZV8zPQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzQ9Ci1DYWlyb19jYWlyb19hcmNfbmVnYXRpdmVfNT0KLQotQ2Fpcm9fY2Fpcm9fY2xpcD0KLUNhaXJvX2NhaXJvX2NsaXBfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NsaXBfcHJlc2VydmU9Ci1DYWlyb19jYWlyb19jbGlwX3ByZXNlcnZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jbG9zZV9wYXRoPQotQ2Fpcm9fY2Fpcm9fY2xvc2VfcGF0aF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fY29weV9wYWdlPQotQ2Fpcm9fY2Fpcm9fY29weV9wYWdlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jb3B5X3BhdGg9Ci1DYWlyb19jYWlyb19jb3B5X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NvcHlfcGF0aF9mbGF0PQotQ2Fpcm9fY2Fpcm9fY29weV9wYXRoX2ZsYXRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NyZWF0ZT0KLUNhaXJvX2NhaXJvX2NyZWF0ZV8wPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG89Ci1DYWlyb19jYWlyb19jdXJ2ZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2N1cnZlX3RvXzE9Ci1DYWlyb19jYWlyb19jdXJ2ZV90b18yPQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fMz0KLUNhaXJvX2NhaXJvX2N1cnZlX3RvXzQ9Ci1DYWlyb19jYWlyb19jdXJ2ZV90b181PQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fNj0KLQotQ2Fpcm9fY2Fpcm9fZGVzdHJveT0KLUNhaXJvX2NhaXJvX2Rlc3Ryb3lfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyPQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl8xPQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfMj0KLQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2U9Ci1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyX2Rpc3RhbmNlXzE9Ci1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZV8yPQotCi1DYWlyb19jYWlyb19maWxsPQotQ2Fpcm9fY2Fpcm9fZmlsbF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzPQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzE9Ci1DYWlyb19jYWlyb19maWxsX2V4dGVudHNfMj0KLUNhaXJvX2NhaXJvX2ZpbGxfZXh0ZW50c18zPQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzQ9Ci0KLUNhaXJvX2NhaXJvX2ZpbGxfcHJlc2VydmU9Ci1DYWlyb19jYWlyb19maWxsX3ByZXNlcnZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19mb250X2V4dGVudHM9Ci1DYWlyb19jYWlyb19mb250X2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19mb250X2V4dGVudHNfMT0KLQotQ2Fpcm9fY2Fpcm9fZm9udF9leHRlbnRzX3Rfc2l6ZW9mPQotCi1DYWlyb19jYWlyb19mb250X29wdGlvbnNfY3JlYXRlPQotCi1DYWlyb19jYWlyb19mb250X29wdGlvbnNfZGVzdHJveT0KLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19kZXN0cm95XzA9Y2FzdD1jYWlyb19mb250X29wdGlvbnNfdCAqCi0KLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19nZXRfYW50aWFsaWFzPQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX2dldF9hbnRpYWxpYXNfMD1jYXN0PWNhaXJvX2ZvbnRfb3B0aW9uc190ICoKLQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXM9Ci1DYWlyb19jYWlyb19mb250X29wdGlvbnNfc2V0X2FudGlhbGlhc18wPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXNfMT0KLQotQ2Fpcm9fY2Fpcm9fZ2V0X2FudGlhbGlhcz0KLUNhaXJvX2NhaXJvX2dldF9hbnRpYWxpYXNfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9jdXJyZW50X3BvaW50PQotQ2Fpcm9fY2Fpcm9fZ2V0X2N1cnJlbnRfcG9pbnRfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nZXRfY3VycmVudF9wb2ludF8xPQotQ2Fpcm9fY2Fpcm9fZ2V0X2N1cnJlbnRfcG9pbnRfMj0KLQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZpbGxfcnVsZT0KLUNhaXJvX2NhaXJvX2dldF9maWxsX3J1bGVfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19nZXRfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfZm9udF9tYXRyaXg9Ci1DYWlyb19jYWlyb19nZXRfZm9udF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nZXRfZm9udF9tYXRyaXhfMT1jYXN0PWNhaXJvX21hdHJpeF90ICoKLQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfb3B0aW9ucz0KLUNhaXJvX2NhaXJvX2dldF9mb250X29wdGlvbnNfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfb3B0aW9uc18xPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotCi1DYWlyb19jYWlyb19nZXRfbGluZV9jYXA9Ci1DYWlyb19jYWlyb19nZXRfbGluZV9jYXBfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9saW5lX2pvaW49Ci1DYWlyb19jYWlyb19nZXRfbGluZV9qb2luXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbGluZV93aWR0aD0KLUNhaXJvX2NhaXJvX2dldF9saW5lX3dpZHRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbWF0cml4PQotQ2Fpcm9fY2Fpcm9fZ2V0X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2dldF9tYXRyaXhfMT1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbWl0ZXJfbGltaXQ9Ci1DYWlyb19jYWlyb19nZXRfbWl0ZXJfbGltaXRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9vcGVyYXRvcj0KLUNhaXJvX2NhaXJvX2dldF9vcGVyYXRvcl8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X3NvdXJjZT0KLUNhaXJvX2NhaXJvX2dldF9zb3VyY2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF90YXJnZXQ9Ci1DYWlyb19jYWlyb19nZXRfdGFyZ2V0XzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfdG9sZXJhbmNlPQotQ2Fpcm9fY2Fpcm9fZ2V0X3RvbGVyYW5jZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50cz0KLUNhaXJvX2NhaXJvX2dseXBoX2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nbHlwaF9leHRlbnRzXzE9Y2FzdD0oY2Fpcm9fZ2x5cGhfdCAqKQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50c18yPQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50c18zPWNhc3Q9Y2Fpcm9fdGV4dF9leHRlbnRzX3QgKgotCi1DYWlyb19jYWlyb19nbHlwaF9wYXRoPQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfcGF0aF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2dseXBoX3BhdGhfMT1jYXN0PShjYWlyb19nbHlwaF90ICopCi1DYWlyb19jYWlyb19nbHlwaF9wYXRoXzI9Ci0KLUNhaXJvX2NhaXJvX2lkZW50aXR5X21hdHJpeD0KLUNhaXJvX2NhaXJvX2lkZW50aXR5X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGU9Ci1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV8wPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfMT0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlXzI9Ci0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfMD1jYXN0PWNoYXIgKgotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfMT0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhXzI9Ci1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YV8zPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfND0KLQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0PQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0XzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGhfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9faW5fZmlsbD0KLUNhaXJvX2NhaXJvX2luX2ZpbGxfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19pbl9maWxsXzE9Ci1DYWlyb19jYWlyb19pbl9maWxsXzI9Ci0KLUNhaXJvX2NhaXJvX2luX3N0cm9rZT0KLUNhaXJvX2NhaXJvX2luX3N0cm9rZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2luX3N0cm9rZV8xPQotQ2Fpcm9fY2Fpcm9faW5fc3Ryb2tlXzI9Ci0KLUNhaXJvX2NhaXJvX2xpbmVfdG89Ci1DYWlyb19jYWlyb19saW5lX3RvXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fbGluZV90b18xPQotQ2Fpcm9fY2Fpcm9fbGluZV90b18yPQotCi1DYWlyb19jYWlyb19tYXNrPQotQ2Fpcm9fY2Fpcm9fbWFza18wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19tYXNrXzE9Y2FzdD1jYWlyb19wYXR0ZXJuX3QgKgotCi1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2U9Ci1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2VfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fbWFza19zdXJmYWNlXzE9Y2FzdD1jYWlyb19zdXJmYWNlX3QgKgotQ2Fpcm9fY2Fpcm9fbWFza19zdXJmYWNlXzI9Ci1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2VfMz0KLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXQ9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF8xPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfMj0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0XzM9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF80PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfNT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0XzY9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X2lkZW50aXR5PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfaWRlbnRpdHlfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF9yb3RhdGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF9yb3RhdGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfcm90YXRlXzE9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3NjYWxlPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfc2NhbGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfc2NhbGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3NjYWxlXzI9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZV8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF90cmFuc2xhdGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZV8yPQotCi1DYWlyb19jYWlyb19tYXRyaXhfaW52ZXJ0PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2ludmVydF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi0KLUNhaXJvX2NhaXJvX21hdHJpeF9tdWx0aXBseT0KLUNhaXJvX2NhaXJvX21hdHJpeF9tdWx0aXBseV8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfbXVsdGlwbHlfMT1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X211bHRpcGx5XzI9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3JvdGF0ZT0KLUNhaXJvX2NhaXJvX21hdHJpeF9yb3RhdGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3JvdGF0ZV8xPQotCi1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3NjYWxlXzE9Ci1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGVfMj0KLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZT0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2Zvcm1fZGlzdGFuY2VfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZV8xPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZV8yPQotCi1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50XzE9Ci1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50XzI9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNsYXRlXzA9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGVfMj0KLQotQ2Fpcm9fY2Fpcm9fbW92ZV90bz0KLUNhaXJvX2NhaXJvX21vdmVfdG9fMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19tb3ZlX3RvXzE9Ci1DYWlyb19jYWlyb19tb3ZlX3RvXzI9Ci0KLUNhaXJvX2NhaXJvX25ld19wYXRoPQotQ2Fpcm9fY2Fpcm9fbmV3X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3BhaW50PQotQ2Fpcm9fY2Fpcm9fcGFpbnRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3BhaW50X3dpdGhfYWxwaGE9Ci1DYWlyb19jYWlyb19wYWludF93aXRoX2FscGhhXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYV8xPQotCi1DYWlyb19jYWlyb19wYXRoX2RhdGFfdF9zaXplb2Y9Ci0KLUNhaXJvX2NhaXJvX3BhdGhfZGVzdHJveT0KLUNhaXJvX2NhaXJvX3BhdGhfZGVzdHJveV8wPWNhc3Q9Y2Fpcm9fcGF0aF90ICoKLQotQ2Fpcm9fY2Fpcm9fcGF0aF90X3NpemVvZj0KLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2I9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYl8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JfMT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiXzI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYl8zPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JfND0KLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhXzA9Y2FzdD0oY2Fpcm9fcGF0dGVybl90ICopCi1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmFfMT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYV8yPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhXzM9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmFfND0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYV81PQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9mb3Jfc3VyZmFjZT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcj0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcl8wPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyXzE9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXJfMj0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcl8zPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWw9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWxfMD0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbF8xPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsXzI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWxfMz0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbF80PQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsXzU9Ci0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZGVzdHJveT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZGVzdHJveV8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2dldF9leHRlbmQ9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2dldF9leHRlbmRfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyXzA9Y2FzdD0oY2Fpcm9fcGF0dGVybl90ICopCi0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZ2V0X21hdHJpeD0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZ2V0X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4XzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3JlZmVyZW5jZV8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9leHRlbmQ9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9leHRlbmRfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X2V4dGVuZF8xPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9maWx0ZXI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9maWx0ZXJfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X2ZpbHRlcl8xPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9tYXRyaXg9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9tYXRyaXhfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X21hdHJpeF8xPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZT0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV8xPQotQ2Fpcm9fY2Fpcm9fcmVjdGFuZ2xlXzI9Ci1DYWlyb19jYWlyb19yZWN0YW5nbGVfMz0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV80PQotCi1DYWlyb19jYWlyb19yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19yZWZlcmVuY2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90bz0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b18xPQotQ2Fpcm9fY2Fpcm9fcmVsX2N1cnZlX3RvXzI9Ci1DYWlyb19jYWlyb19yZWxfY3VydmVfdG9fMz0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b180PQotQ2Fpcm9fY2Fpcm9fcmVsX2N1cnZlX3RvXzU9Ci1DYWlyb19jYWlyb19yZWxfY3VydmVfdG9fNj0KLQotQ2Fpcm9fY2Fpcm9fcmVsX2xpbmVfdG89Ci1DYWlyb19jYWlyb19yZWxfbGluZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlbF9saW5lX3RvXzE9Ci1DYWlyb19jYWlyb19yZWxfbGluZV90b18yPQotCi1DYWlyb19jYWlyb19yZWxfbW92ZV90bz0KLUNhaXJvX2NhaXJvX3JlbF9tb3ZlX3RvXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcmVsX21vdmVfdG9fMT0KLUNhaXJvX2NhaXJvX3JlbF9tb3ZlX3RvXzI9Ci0KLUNhaXJvX2NhaXJvX3Jlc2V0X2NsaXA9Ci1DYWlyb19jYWlyb19yZXNldF9jbGlwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19yZXN0b3JlPQotQ2Fpcm9fY2Fpcm9fcmVzdG9yZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fcm90YXRlPQotQ2Fpcm9fY2Fpcm9fcm90YXRlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcm90YXRlXzE9Ci0KLUNhaXJvX2NhaXJvX3NhdmU9Ci1DYWlyb19jYWlyb19zYXZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19zY2FsZT0KLUNhaXJvX2NhaXJvX3NjYWxlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2NhbGVfMT0KLUNhaXJvX2NhaXJvX3NjYWxlXzI9Ci0KLUNhaXJvX2NhaXJvX3NlbGVjdF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19zZWxlY3RfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8xPQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8yPQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8zPQotCi1DYWlyb19jYWlyb19zZXRfYW50aWFsaWFzPQotQ2Fpcm9fY2Fpcm9fc2V0X2FudGlhbGlhc18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9hbnRpYWxpYXNfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2Rhc2g9Ci1DYWlyb19jYWlyb19zZXRfZGFzaF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9kYXNoXzE9Ci1DYWlyb19jYWlyb19zZXRfZGFzaF8yPQotQ2Fpcm9fY2Fpcm9fc2V0X2Rhc2hfMz0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2ZpbGxfcnVsZT0KLUNhaXJvX2NhaXJvX3NldF9maWxsX3J1bGVfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfZmlsbF9ydWxlXzE9Ci0KLUNhaXJvX2NhaXJvX3NldF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19zZXRfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfZmFjZV8xPWNhc3Q9Y2Fpcm9fZm9udF9mYWNlX3QgKgotCi1DYWlyb19jYWlyb19zZXRfZm9udF9tYXRyaXg9Ci1DYWlyb19jYWlyb19zZXRfZm9udF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfZm9udF9tYXRyaXhfMT1jYXN0PWNhaXJvX21hdHJpeF90ICoKLQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfb3B0aW9ucz0KLUNhaXJvX2NhaXJvX3NldF9mb250X29wdGlvbnNfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfb3B0aW9uc18xPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotCi1DYWlyb19jYWlyb19zZXRfZm9udF9zaXplPQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfc2l6ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9mb250X3NpemVfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfY2FwPQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfY2FwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfY2FwXzE9Ci0KLUNhaXJvX2NhaXJvX3NldF9saW5lX2pvaW49Ci1DYWlyb19jYWlyb19zZXRfbGluZV9qb2luXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfam9pbl8xPQotCi1DYWlyb19jYWlyb19zZXRfbGluZV93aWR0aD0KLUNhaXJvX2NhaXJvX3NldF9saW5lX3dpZHRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfd2lkdGhfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X21hdHJpeD0KLUNhaXJvX2NhaXJvX3NldF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfbWF0cml4XzE9Y2FzdD1jYWlyb19tYXRyaXhfdCAqCi0KLUNhaXJvX2NhaXJvX3NldF9taXRlcl9saW1pdD0KLUNhaXJvX2NhaXJvX3NldF9taXRlcl9saW1pdF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9taXRlcl9saW1pdF8xPQotCi1DYWlyb19jYWlyb19zZXRfb3BlcmF0b3I9Ci1DYWlyb19jYWlyb19zZXRfb3BlcmF0b3JfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfb3BlcmF0b3JfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZT0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV8xPWNhc3Q9Y2Fpcm9fcGF0dGVybl90ICoKLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2I9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYl8wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYl8xPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JfMj0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiXzM9Ci0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYT0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYV8wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYmFfMT0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYV8yPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhXzM9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYmFfND0KLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlXzA9Y2FzdD1jYWlyb190ICoKLUNhaXJvX2NhaXJvX3NldF9zb3VyY2Vfc3VyZmFjZV8xPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLUNhaXJvX2NhaXJvX3NldF9zb3VyY2Vfc3VyZmFjZV8yPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlXzM9Ci0KLUNhaXJvX2NhaXJvX3NldF90b2xlcmFuY2U9Ci1DYWlyb19jYWlyb19zZXRfdG9sZXJhbmNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X3RvbGVyYW5jZV8xPQotCi1DYWlyb19jYWlyb19zaG93X2dseXBocz0KLUNhaXJvX2NhaXJvX3Nob3dfZ2x5cGhzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2hvd19nbHlwaHNfMT1jYXN0PShjYWlyb19nbHlwaF90ICopCi1DYWlyb19jYWlyb19zaG93X2dseXBoc18yPQotCi1DYWlyb19jYWlyb19zaG93X3BhZ2U9Ci1DYWlyb19jYWlyb19zaG93X3BhZ2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3Nob3dfdGV4dD0KLUNhaXJvX2NhaXJvX3Nob3dfdGV4dF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3Nob3dfdGV4dF8xPQotCi1DYWlyb19jYWlyb19zdGF0dXM9Ci1DYWlyb19jYWlyb19zdGF0dXNfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3N0YXR1c190b19zdHJpbmc9Ci1DYWlyb19jYWlyb19zdGF0dXNfdG9fc3RyaW5nXzA9Ci0KLUNhaXJvX2NhaXJvX3N0cm9rZT0KLUNhaXJvX2NhaXJvX3N0cm9rZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3Ryb2tlX2V4dGVudHM9Ci1DYWlyb19jYWlyb19zdHJva2VfZXh0ZW50c18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3N0cm9rZV9leHRlbnRzXzE9Ci1DYWlyb19jYWlyb19zdHJva2VfZXh0ZW50c18yPQotQ2Fpcm9fY2Fpcm9fc3Ryb2tlX2V4dGVudHNfMz0KLUNhaXJvX2NhaXJvX3N0cm9rZV9leHRlbnRzXzQ9Ci0KLUNhaXJvX2NhaXJvX3N0cm9rZV9wcmVzZXJ2ZT0KLUNhaXJvX2NhaXJvX3N0cm9rZV9wcmVzZXJ2ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9jcmVhdGVfc2ltaWxhcj0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMT0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMj0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJfMz0KLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9kZXN0cm95PQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9kZXN0cm95XzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfZmluaXNoPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9maW5pc2hfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9nZXRfdXNlcl9kYXRhPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9nZXRfdXNlcl9kYXRhXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19zdXJmYWNlX2dldF91c2VyX2RhdGFfMT1jYXN0PWNhaXJvX3VzZXJfZGF0YV9rZXlfdCAqCi0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfcmVmZXJlbmNlPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2VfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldD0KLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2RldmljZV9vZmZzZXRfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2RldmljZV9vZmZzZXRfMT0KLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2RldmljZV9vZmZzZXRfMj0KLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGFfMT1jYXN0PWNhaXJvX3VzZXJfZGF0YV9rZXlfdCAqCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGFfMj1jYXN0PXZvaWQgKgotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhXzM9Y2FzdD1jYWlyb19kZXN0cm95X2Z1bmNfdAotCi1DYWlyb19jYWlyb190ZXh0X2V4dGVudHM9Ci1DYWlyb19jYWlyb190ZXh0X2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb190ZXh0X2V4dGVudHNfMT0KLUNhaXJvX2NhaXJvX3RleHRfZXh0ZW50c18yPWNhc3Q9Y2Fpcm9fdGV4dF9leHRlbnRzX3QgKgotCi1DYWlyb19jYWlyb190ZXh0X3BhdGg9Ci1DYWlyb19jYWlyb190ZXh0X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb190ZXh0X3BhdGhfMT0KLQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtPQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtXzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlPQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlXzE9Ci1DYWlyb19jYWlyb190cmFuc2xhdGVfMj0KLQotQ2Fpcm9fY2Fpcm9fdXNlcl90b19kZXZpY2U9Ci1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlXzE9Ci1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV8yPQotCi1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV9kaXN0YW5jZT0KLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlX2Rpc3RhbmNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2VfMT0KLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlX2Rpc3RhbmNlXzI9Ci0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9jcmVhdGU9Ci1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlXzA9Y2FzdD0oRGlzcGxheSAqKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8xPWNhc3Q9KERyYXdhYmxlKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8yPWNhc3Q9KFZpc3VhbCAqKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8zPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV80PQotCi1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXA9Ci1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXBfMT1jYXN0PVBpeG1hcAotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV9mb3JfYml0bWFwXzI9Y2FzdD0oU2NyZWVuICoKLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9jcmVhdGVfZm9yX2JpdG1hcF8zPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV9mb3JfYml0bWFwXzQ9Ci0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZT0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZV8wPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZV8xPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX3NldF9zaXplXzI9Ci0KLUNhaXJvX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMWRhdGFfMXRfMklJPQotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMD1jYXN0PXZvaWQgKgotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMj1jYXN0PXNpemVfdAotCi1DYWlyb19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFwYXRoXzF0XzJJST0KLUNhaXJvX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMXRfMklJXzA9Y2FzdD0odm9pZCAqKQotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1DYWlyb19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFwYXRoXzF0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ2Fpcm9fbWVtbW92ZV9fXzNESUk9Ci1DYWlyb19tZW1tb3ZlX19fM0RJSV8wPWNhc3Q9KHZvaWQgKikKLUNhaXJvX21lbW1vdmVfX18zRElJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ2Fpcm9fbWVtbW92ZV9fXzNESUlfMj1jYXN0PShzaXplX3QpCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFmb250XzFleHRlbnRzXzF0PQotY2Fpcm9fZm9udF9leHRlbnRzX3RfYXNjZW50PQotY2Fpcm9fZm9udF9leHRlbnRzX3RfZGVzY2VudD0KLWNhaXJvX2ZvbnRfZXh0ZW50c190X2hlaWdodD0KLWNhaXJvX2ZvbnRfZXh0ZW50c190X21heF94X2FkdmFuY2U9Ci1jYWlyb19mb250X2V4dGVudHNfdF9tYXhfeV9hZHZhbmNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMWRhdGFfMXQ9Ci1jYWlyb19wYXRoX2RhdGFfdF90eXBlPWFjY2Vzc29yPWhlYWRlci50eXBlCi1jYWlyb19wYXRoX2RhdGFfdF9sZW5ndGg9YWNjZXNzb3I9aGVhZGVyLmxlbmd0aAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMXQ9Ci1jYWlyb19wYXRoX3Rfc3RhdHVzPQotY2Fpcm9fcGF0aF90X2RhdGE9Y2FzdD1jYWlyb19wYXRoX2RhdGFfdCAqCi1jYWlyb19wYXRoX3RfbnVtX2RhdGE9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiZTdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKipcblwKLSAqIFZlcnNpb246IE1QTCAxLjFcblwKLSAqXG5cCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb25cblwKLSAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuXAotICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXAotICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvXG5cCi0gKlxuXAotICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcyxcblwKLSAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZVxuXAotICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGVcblwKLSAqIExpY2Vuc2UuXG5cCi0gKlxuXAotICogQ29udHJpYnV0b3Iocyk6XG5cCi0gKlxuXAotICogSUJNXG5cCi0gKiAtICBCaW5kaW5nIHRvIHBlcm1pdCBpbnRlcmZhY2luZyBiZXR3ZWVuIENhaXJvIGFuZCBTV1RcblwKLSAqIC0gIENvcHlyaWdodCAoQykgMjAwNSBJQk0gQ29ycC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi0gKlxuXAotICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi9cbgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg3ZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQUVEZXNjPQotQUVEZXNjX2Rlc2NyaXB0b3JUeXBlPWNhc3Q9KERlc2NUeXBlKQotQUVEZXNjX2RhdGFIYW5kbGU9Y2FzdD0oQUVEYXRhU3RvcmFnZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmQ9Ci1BVFNMYXlvdXRSZWNvcmRfZ2x5cGhJRD0KLUFUU0xheW91dFJlY29yZF9mbGFncz0KLUFUU0xheW91dFJlY29yZF9vcmlnaW5hbE9mZnNldD0KLUFUU0xheW91dFJlY29yZF9yZWFsUG9zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZD0KLUFUU1RyYXBlem9pZF91cHBlckxlZnRfeD1hY2Nlc3Nvcj11cHBlckxlZnQueAotQVRTVHJhcGV6b2lkX3VwcGVyTGVmdF95PWFjY2Vzc29yPXVwcGVyTGVmdC55Ci1BVFNUcmFwZXpvaWRfdXBwZXJSaWdodF94PWFjY2Vzc29yPXVwcGVyUmlnaHQueAotQVRTVHJhcGV6b2lkX3VwcGVyUmlnaHRfeT1hY2Nlc3Nvcj11cHBlclJpZ2h0LnkKLUFUU1RyYXBlem9pZF9sb3dlclJpZ2h0X3g9YWNjZXNzb3I9bG93ZXJSaWdodC54Ci1BVFNUcmFwZXpvaWRfbG93ZXJSaWdodF95PWFjY2Vzc29yPWxvd2VyUmlnaHQueQotQVRTVHJhcGV6b2lkX2xvd2VyTGVmdF94PWFjY2Vzc29yPWxvd2VyTGVmdC54Ci1BVFNUcmFwZXpvaWRfbG93ZXJMZWZ0X3k9YWNjZXNzb3I9bG93ZXJMZWZ0LnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNVQ2FyZXQ9Ci1BVFNVQ2FyZXRfZlg9Ci1BVFNVQ2FyZXRfZlk9Ci1BVFNVQ2FyZXRfZkRlbHRhWD0KLUFUU1VDYXJldF9mRGVsdGFZPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWI9Ci1BVFNVVGFiX3RhYlBvc2l0aW9uPQotQVRTVVRhYl90YWJUeXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VVbmhpZ2hsaWdodERhdGE9Ci1BVFNVVW5oaWdobGlnaHREYXRhX2RhdGFUeXBlPQotQVRTVVVuaGlnaGxpZ2h0RGF0YV9yZWQ9YWNjZXNzb3I9dW5oaWdobGlnaHREYXRhLmJhY2tncm91bmRDb2xvci5yZWQKLUFUU1VVbmhpZ2hsaWdodERhdGFfZ3JlZW49YWNjZXNzb3I9dW5oaWdobGlnaHREYXRhLmJhY2tncm91bmRDb2xvci5ncmVlbgotQVRTVVVuaGlnaGxpZ2h0RGF0YV9ibHVlPWFjY2Vzc29yPXVuaGlnaGxpZ2h0RGF0YS5iYWNrZ3JvdW5kQ29sb3IuYmx1ZQotQVRTVVVuaGlnaGxpZ2h0RGF0YV9hbHBoYT1hY2Nlc3Nvcj11bmhpZ2hsaWdodERhdGEuYmFja2dyb3VuZENvbG9yLmFscGhhCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWM9Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY192ZXJzaW9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfbW92YWJsZT0KLUFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX2hlbHBCdXR0b249Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19kZWZhdWx0VGV4dD1jYXN0PShDRlN0cmluZ1JlZikKLUFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX2NhbmNlbFRleHQ9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19vdGhlclRleHQ9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19kZWZhdWx0QnV0dG9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfY2FuY2VsQnV0dG9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfcG9zaXRpb249Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19mbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9CaXRNYXA9Ci1CaXRNYXBfYmFzZUFkZHI9Y2FzdD0odm9pZCAqKQotQml0TWFwX3Jvd0J5dGVzPQotQml0TWFwX3RvcD1hY2Nlc3Nvcj1ib3VuZHMudG9wCi1CaXRNYXBfbGVmdD1hY2Nlc3Nvcj1ib3VuZHMubGVmdAotQml0TWFwX2JvdHRvbT1hY2Nlc3Nvcj1ib3VuZHMuYm90dG9tCi1CaXRNYXBfcmlnaHQ9YWNjZXNzb3I9Ym91bmRzLnJpZ2h0Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0ZSYW5nZT0KLUNGUmFuZ2VfbG9jYXRpb249Y2FzdD0oQ0ZJbmRleCkKLUNGUmFuZ2VfbGVuZ3RoPWNhc3Q9KENGSW5kZXgpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dGdW5jdGlvbkNhbGxiYWNrcz0KLUNHRnVuY3Rpb25DYWxsYmFja3NfdmVyc2lvbj0KLUNHRnVuY3Rpb25DYWxsYmFja3NfZXZhbHVhdGU9Y2FzdD1DR0Z1bmN0aW9uRXZhbHVhdGVDYWxsYmFjawotQ0dGdW5jdGlvbkNhbGxiYWNrc19yZWxlYXNlSW5mbz1jYXN0PUNHRnVuY3Rpb25SZWxlYXNlSW5mb0NhbGxiYWNrCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudD0KLUNHUGF0aEVsZW1lbnRfdHlwZT1jYXN0PUNHUGF0aEVsZW1lbnRUeXBlCi1DR1BhdGhFbGVtZW50X3BvaW50cz1jYXN0PUNHUG9pbnQgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUGF0dGVybkNhbGxiYWNrcz0KLUNHUGF0dGVybkNhbGxiYWNrc192ZXJzaW9uPQotQ0dQYXR0ZXJuQ2FsbGJhY2tzX2RyYXdQYXR0ZXJuPWNhc3Q9Q0dQYXR0ZXJuRHJhd1BhdHRlcm5DYWxsYmFjawotQ0dQYXR0ZXJuQ2FsbGJhY2tzX3JlbGVhc2VJbmZvPWNhc3Q9Q0dQYXR0ZXJuUmVsZWFzZUluZm9DYWxsYmFjawotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnQ9Ci1DR1BvaW50X3g9Y2FzdD0oZmxvYXQpCi1DR1BvaW50X3k9Y2FzdD0oZmxvYXQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0PQotQ0dSZWN0X3g9YWNjZXNzb3I9b3JpZ2luLngsY2FzdD0oZmxvYXQpCi1DR1JlY3RfeT1hY2Nlc3Nvcj1vcmlnaW4ueSxjYXN0PShmbG9hdCkKLUNHUmVjdF93aWR0aD1hY2Nlc3Nvcj1zaXplLndpZHRoLGNhc3Q9KGZsb2F0KQotQ0dSZWN0X2hlaWdodD1hY2Nlc3Nvcj1zaXplLmhlaWdodCxjYXN0PShmbG9hdCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db2xvclBpY2tlckluZm89Ci1Db2xvclBpY2tlckluZm9fcHJvZmlsZT1hY2Nlc3Nvcj10aGVDb2xvci5wcm9maWxlLGNhc3Q9KENNUHJvZmlsZUhhbmRsZSkKLUNvbG9yUGlja2VySW5mb19yZWQ9YWNjZXNzb3I9dGhlQ29sb3IuY29sb3IucmdiLnJlZCxjYXN0PShVSW50MTYpCi1Db2xvclBpY2tlckluZm9fZ3JlZW49YWNjZXNzb3I9dGhlQ29sb3IuY29sb3IucmdiLmdyZWVuLGNhc3Q9KFVJbnQxNikKLUNvbG9yUGlja2VySW5mb19ibHVlPWFjY2Vzc29yPXRoZUNvbG9yLmNvbG9yLnJnYi5ibHVlLGNhc3Q9KFVJbnQxNikKLUNvbG9yUGlja2VySW5mb19kc3RQcm9maWxlPWNhc3Q9KENNUHJvZmlsZUhhbmRsZSkKLUNvbG9yUGlja2VySW5mb19mbGFncz1jYXN0PShVSW50MzIpCi1Db2xvclBpY2tlckluZm9fcGxhY2VXaGVyZT1jYXN0PShEaWFsb2dQbGFjZW1lbnRTcGVjKQotQ29sb3JQaWNrZXJJbmZvX2g9YWNjZXNzb3I9ZGlhbG9nT3JpZ2luLmgsY2FzdD0oc2hvcnQpCi1Db2xvclBpY2tlckluZm9fdj1hY2Nlc3Nvcj1kaWFsb2dPcmlnaW4udixjYXN0PShzaG9ydCkKLUNvbG9yUGlja2VySW5mb19waWNrZXJUeXBlPWNhc3Q9KE9TVHlwZSkKLUNvbG9yUGlja2VySW5mb19ldmVudFByb2M9Y2FzdD0oVXNlckV2ZW50VVBQKQotQ29sb3JQaWNrZXJJbmZvX2NvbG9yUHJvYz1jYXN0PShDb2xvckNoYW5nZWRVUFApCi1Db2xvclBpY2tlckluZm9fY29sb3JQcm9jRGF0YT1jYXN0PShVSW50MzIpCi1Db2xvclBpY2tlckluZm9fcHJvbXB0PWNhc3Q9KFN0cjI1NSkKLUNvbG9yUGlja2VySW5mb19lZGl0TWVudUlEPWFjY2Vzc29yPW1JbmZvLmVkaXRNZW51SUQsY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX2N1dEl0ZW09YWNjZXNzb3I9bUluZm8uY3V0SXRlbSxjYXN0PShTSW50MTYpCi1Db2xvclBpY2tlckluZm9fY29weUl0ZW09YWNjZXNzb3I9bUluZm8uY29weUl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX3Bhc3RlSXRlbT1hY2Nlc3Nvcj1tSW5mby5wYXN0ZUl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX2NsZWFySXRlbT1hY2Nlc3Nvcj1tSW5mby5jbGVhckl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX3VuZG9JdGVtPWFjY2Vzc29yPW1JbmZvLnVuZG9JdGVtLGNhc3Q9KFNJbnQxNikKLUNvbG9yUGlja2VySW5mb19uZXdDb2xvckNob3Nlbj1jYXN0PShCb29sZWFuKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mbz0KLUNvbnRyb2xCdXR0b25Db250ZW50SW5mb19jb250ZW50VHlwZT1jYXN0PShDb250cm9sQ29udGVudFR5cGUpCi1Db250cm9sQnV0dG9uQ29udGVudEluZm9faWNvblJlZj1hY2Nlc3Nvcj11Lmljb25SZWYsY2FzdD0odm9pZCAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlYz0KLUNvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY19zZWxTdGFydD0KLUNvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY19zZWxFbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlYz0KLUNvbnRyb2xGb250U3R5bGVSZWNfZmxhZ3M9Ci1Db250cm9sRm9udFN0eWxlUmVjX2ZvbnQ9Ci1Db250cm9sRm9udFN0eWxlUmVjX3NpemU9Ci1Db250cm9sRm9udFN0eWxlUmVjX3N0eWxlPQotQ29udHJvbEZvbnRTdHlsZVJlY19tb2RlPQotQ29udHJvbEZvbnRTdHlsZVJlY19qdXN0PQotQ29udHJvbEZvbnRTdHlsZVJlY19mb3JlQ29sb3JfcmVkPWFjY2Vzc29yPWZvcmVDb2xvci5yZWQKLUNvbnRyb2xGb250U3R5bGVSZWNfZm9yZUNvbG9yX2dyZWVuPWFjY2Vzc29yPWZvcmVDb2xvci5ncmVlbgotQ29udHJvbEZvbnRTdHlsZVJlY19mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1mb3JlQ29sb3IuYmx1ZQotQ29udHJvbEZvbnRTdHlsZVJlY19iYWNrQ29sb3JfcmVkPWFjY2Vzc29yPWJhY2tDb2xvci5yZWQKLUNvbnRyb2xGb250U3R5bGVSZWNfYmFja0NvbG9yX2dyZWVuPWFjY2Vzc29yPWJhY2tDb2xvci5ncmVlbgotQ29udHJvbEZvbnRTdHlsZVJlY19iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1iYWNrQ29sb3IuYmx1ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xLaW5kPQotQ29udHJvbEtpbmRfc2lnbmF0dXJlPQotQ29udHJvbEtpbmRfa2luZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiRW50cnk9Ci1Db250cm9sVGFiRW50cnlfaWNvbj1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm8gKikKLUNvbnRyb2xUYWJFbnRyeV9uYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotQ29udHJvbFRhYkVudHJ5X2VuYWJsZWQ9Y2FzdD0oQm9vbGVhbikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxPQotQ29udHJvbFRhYkluZm9SZWNWMV92ZXJzaW9uPWNhc3Q9KFNJbnQxNikKLUNvbnRyb2xUYWJJbmZvUmVjVjFfaWNvblN1aXRlSUQ9Y2FzdD0oU0ludDE2KQotQ29udHJvbFRhYkluZm9SZWNWMV9uYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcj0KLUN1cnNvcl9kYXRhPQotQ3Vyc29yX21hc2s9Ci1DdXJzb3JfaG90U3BvdF92PWFjY2Vzc29yPWhvdFNwb3QudgotQ3Vyc29yX2hvdFNwb3RfaD1hY2Nlc3Nvcj1ob3RTcG90LmgKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3NlckNhbGxiYWNrcz0KLURhdGFCcm93c2VyQ2FsbGJhY2tzX3ZlcnNpb249Y2FzdD0oVUludDMyKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfaXRlbURhdGFDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLml0ZW1EYXRhQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVVQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2l0ZW1Db21wYXJlQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5pdGVtQ29tcGFyZUNhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbUNvbXBhcmVVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtTm90aWZpY2F0aW9uVVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfYWRkRHJhZ0l0ZW1DYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmFkZERyYWdJdGVtQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJBZGREcmFnSXRlbVVQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2FjY2VwdERyYWdDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmFjY2VwdERyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckFjY2VwdERyYWdVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9yZWNlaXZlRHJhZ0NhbGxiYWNrPWFjY2Vzc29yPXUudjEucmVjZWl2ZURyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclJlY2VpdmVEcmFnVVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfcG9zdFByb2Nlc3NEcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5wb3N0UHJvY2Vzc0RyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclBvc3RQcm9jZXNzRHJhZ1VQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2l0ZW1IZWxwQ29udGVudENhbGxiYWNrPWFjY2Vzc29yPXUudjEuaXRlbUhlbHBDb250ZW50Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtSGVscENvbnRlbnRVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9nZXRDb250ZXh0dWFsTWVudUNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZ2V0Q29udGV4dHVhbE1lbnVDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckdldENvbnRleHR1YWxNZW51VVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfc2VsZWN0Q29udGV4dHVhbE1lbnVDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLnNlbGVjdENvbnRleHR1YWxNZW51Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJTZWxlY3RDb250ZXh0dWFsTWVudVVQUCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrcz0KLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3ZlcnNpb249Ci1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV9kcmF3SXRlbUNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZHJhd0l0ZW1DYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckRyYXdJdGVtVVBQKQotRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfdjFfZWRpdFRleHRDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmVkaXRUZXh0Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJFZGl0SXRlbVVQUCkKLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3YxX2hpdFRlc3RDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmhpdFRlc3RDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckhpdFRlc3RVUFApCi1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV90cmFja2luZ0NhbGxiYWNrPWFjY2Vzc29yPXUudjEudHJhY2tpbmdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclRyYWNraW5nVVBQKQotRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfdjFfZHJhZ1JlZ2lvbkNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZHJhZ1JlZ2lvbkNhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbURyYWdSZ25VUFApCi1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV9hY2NlcHREcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5hY2NlcHREcmFnQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtQWNjZXB0RHJhZ1VQUCkKLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3YxX3JlY2VpdmVEcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5yZWNlaXZlRHJhZ0NhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbVJlY2VpdmVEcmFnVVBQKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0RhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjPQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfcHJvcGVydHlEZXNjX3Byb3BlcnR5SUQ9YWNjZXNzb3I9cHJvcGVydHlEZXNjLnByb3BlcnR5SUQsY2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfcHJvcGVydHlEZXNjX3Byb3BlcnR5VHlwZT1hY2Nlc3Nvcj1wcm9wZXJ0eURlc2MucHJvcGVydHlUeXBlLGNhc3Q9KE9TVHlwZSkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX3Byb3BlcnR5RGVzY19wcm9wZXJ0eUZsYWdzPWFjY2Vzc29yPXByb3BlcnR5RGVzYy5wcm9wZXJ0eUZsYWdzLGNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlGbGFncykKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfdmVyc2lvbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLnZlcnNpb24sY2FzdD0oVUludDMyKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19taW5pbXVtV2lkdGg9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5taW5pbXVtV2lkdGgsY2FzdD0oVUludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19tYXhpbXVtV2lkdGg9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5tYXhpbXVtV2lkdGgsY2FzdD0oVUludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY190aXRsZU9mZnNldD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLnRpdGxlT2Zmc2V0LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfdGl0bGVTdHJpbmc9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy50aXRsZVN0cmluZyxjYXN0PShDRlN0cmluZ1JlZikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfaW5pdGlhbE9yZGVyPWFjY2Vzc29yPWhlYWRlckJ0bkRlc2MuaW5pdGlhbE9yZGVyLGNhc3Q9KERhdGFCcm93c2VyU29ydE9yZGVyKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfZmxhZ3M9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZmxhZ3MsY2FzdD0oU0ludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfZm9udD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb250LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX3NpemU9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuc2l6ZSxjYXN0PShTSW50MTYpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9zdHlsZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5zdHlsZSxjYXN0PShTSW50MTYpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9tb2RlPWFjY2Vzc29yPWhlYWRlckJ0bkRlc2MuYnRuRm9udFN0eWxlLm1vZGUsY2FzdD0oU0ludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfanVzdD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5qdXN0LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2ZvcmVDb2xvcl9yZWQ9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZm9yZUNvbG9yLnJlZCxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2ZvcmVDb2xvcl9ncmVlbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuZ3JlZW4sY2FzdD0odW5zaWduZWQgc2hvcnQpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuYmx1ZSxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2JhY2tDb2xvcl9yZWQ9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuYmFja0NvbG9yLnJlZCxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2JhY2tDb2xvcl9ncmVlbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuZ3JlZW4sY2FzdD0odW5zaWduZWQgc2hvcnQpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuYmx1ZSxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuQ29udGVudEluZm9fY29udGVudFR5cGU9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby5jb250ZW50VHlwZSxjYXN0PShDb250cm9sQ29udGVudFR5cGUpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkNvbnRlbnRJbmZvX2ljb25SZWY9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby51Lmljb25SZWYsY2FzdD0oSWNvblJlZikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYz0KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX3ZlcnNpb249Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19taW5pbXVtV2lkdGg9Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19tYXhpbXVtV2lkdGg9Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY190aXRsZU9mZnNldD0KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX3RpdGxlU3RyaW5nPWNhc3Q9KENGU3RyaW5nUmVmKQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfaW5pdGlhbE9yZGVyPQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2ZsYWdzPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mbGFncwotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2ZvbnQ9YWNjZXNzb3I9YnRuRm9udFN0eWxlLmZvbnQKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9zaXplPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5zaXplCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfc3R5bGU9YWNjZXNzb3I9YnRuRm9udFN0eWxlLnN0eWxlCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfbW9kZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUubW9kZQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2p1c3Q9YWNjZXNzb3I9YnRuRm9udFN0eWxlLmp1c3QKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfcmVkPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IucmVkCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfZm9yZUNvbG9yX2dyZWVuPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuZ3JlZW4KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUuZm9yZUNvbG9yLmJsdWUKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfcmVkPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IucmVkCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfYmFja0NvbG9yX2dyZWVuPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuZ3JlZW4KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUuYmFja0NvbG9yLmJsdWUKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkNvbnRlbnRJbmZvX2NvbnRlbnRUeXBlPWFjY2Vzc29yPWJ0bkNvbnRlbnRJbmZvLmNvbnRlbnRUeXBlCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Db250ZW50SW5mb19pY29uUmVmPWFjY2Vzc29yPWJ0bkNvbnRlbnRJbmZvLnUuaWNvblJlZixjYXN0PShJY29uUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkPQotRXZlbnRSZWNvcmRfd2hhdD1jYXN0PShFdmVudEtpbmQpCi1FdmVudFJlY29yZF9tZXNzYWdlPQotRXZlbnRSZWNvcmRfd2hlbj0KLUV2ZW50UmVjb3JkX3doZXJlX3Y9YWNjZXNzb3I9d2hlcmUudgotRXZlbnRSZWNvcmRfd2hlcmVfaD1hY2Nlc3Nvcj13aGVyZS5oCi1FdmVudFJlY29yZF9tb2RpZmllcnM9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udEluZm89Ci1Gb250SW5mb19hc2NlbnQ9Ci1Gb250SW5mb19kZXNjZW50PQotRm9udEluZm9fd2lkTWF4PQotRm9udEluZm9fbGVhZGluZz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Gb250U2VsZWN0aW9uUURTdHlsZT0KLUZvbnRTZWxlY3Rpb25RRFN0eWxlX3ZlcnNpb249Ci1Gb250U2VsZWN0aW9uUURTdHlsZV9pbnN0YW5jZV9mb250RmFtaWx5PWFjY2Vzc29yPWluc3RhbmNlLmZvbnRGYW1pbHkKLUZvbnRTZWxlY3Rpb25RRFN0eWxlX2luc3RhbmNlX2ZvbnRTdHlsZT1hY2Nlc3Nvcj1pbnN0YW5jZS5mb250U3R5bGUKLUZvbnRTZWxlY3Rpb25RRFN0eWxlX3NpemU9Ci1Gb250U2VsZWN0aW9uUURTdHlsZV9oYXNDb2xvcj0KLUZvbnRTZWxlY3Rpb25RRFN0eWxlX3Jlc2VydmVkPQotRm9udFNlbGVjdGlvblFEU3R5bGVfY29sb3JfcmVkPWFjY2Vzc29yPWNvbG9yLnJlZAotRm9udFNlbGVjdGlvblFEU3R5bGVfY29sb3JfZ3JlZW49YWNjZXNzb3I9Y29sb3IuZ3JlZW4KLUZvbnRTZWxlY3Rpb25RRFN0eWxlX2NvbG9yX2JsdWU9YWNjZXNzb3I9Y29sb3IuYmx1ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2U9Ci1HRGV2aWNlX2dkUmVmTnVtPQotR0RldmljZV9nZElEPQotR0RldmljZV9nZFR5cGU9Ci1HRGV2aWNlX2dkSVRhYmxlPWNhc3Q9KElUYWJIYW5kbGUpCi1HRGV2aWNlX2dkUmVzUHJlZj0KLUdEZXZpY2VfZ2RTZWFyY2hQcm9jPWNhc3Q9KFNQcm9jSG5kbCkKLUdEZXZpY2VfZ2RDb21wUHJvYz1jYXN0PShDUHJvY0huZGwpCi1HRGV2aWNlX2dkRmxhZ3M9Ci1HRGV2aWNlX2dkUE1hcD1jYXN0PShQaXhNYXBIYW5kbGUpCi1HRGV2aWNlX2dkUmVmQ29uPQotR0RldmljZV9nZE5leHRHRD1jYXN0PShHREhhbmRsZSkKLUdEZXZpY2VfbGVmdD1hY2Nlc3Nvcj1nZFJlY3QubGVmdAotR0RldmljZV90b3A9YWNjZXNzb3I9Z2RSZWN0LnRvcAotR0RldmljZV9yaWdodD1hY2Nlc3Nvcj1nZFJlY3QucmlnaHQKLUdEZXZpY2VfYm90dG9tPWFjY2Vzc29yPWdkUmVjdC5ib3R0b20KLUdEZXZpY2VfZ2RNb2RlPQotR0RldmljZV9nZENDQnl0ZXM9Ci1HRGV2aWNlX2dkQ0NEZXB0aD0KLUdEZXZpY2VfZ2RDQ1hEYXRhPWNhc3Q9KEhhbmRsZSkKLUdEZXZpY2VfZ2RDQ1hNYXNrPWNhc3Q9KEhhbmRsZSkKLUdEZXZpY2VfZ2RFeHQ9Y2FzdD0oSGFuZGxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZD0KLUhJQ29tbWFuZF9hdHRyaWJ1dGVzPQotSElDb21tYW5kX2NvbW1hbmRJRD0KLUhJQ29tbWFuZF9tZW51X21lbnVSZWY9YWNjZXNzb3I9bWVudS5tZW51UmVmLGNhc3Q9KE1lbnVSZWYpCi1ISUNvbW1hbmRfbWVudV9tZW51SXRlbUluZGV4PWFjY2Vzc29yPW1lbnUubWVudUl0ZW1JbmRleCxjYXN0PShNZW51SXRlbUluZGV4KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJU2Nyb2xsQmFyVHJhY2tJbmZvPQotSElTY3JvbGxCYXJUcmFja0luZm9fdmVyc2lvbj0KLUhJU2Nyb2xsQmFyVHJhY2tJbmZvX2VuYWJsZVN0YXRlPQotSElTY3JvbGxCYXJUcmFja0luZm9fcHJlc3NTdGF0ZT0KLUhJU2Nyb2xsQmFyVHJhY2tJbmZvX3ZpZXdzaXplPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVBbmltYXRpb25GcmFtZUluZm89Ci1ISVRoZW1lQW5pbWF0aW9uRnJhbWVJbmZvX2luZGV4PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVBbmltYXRpb25UaW1lSW5mbz0KLUhJVGhlbWVBbmltYXRpb25UaW1lSW5mb19zdGFydD0KLUhJVGhlbWVBbmltYXRpb25UaW1lSW5mb19jdXJyZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVCYWNrZ3JvdW5kRHJhd0luZm89Ci1ISVRoZW1lQmFja2dyb3VuZERyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lQmFja2dyb3VuZERyYXdJbmZvX3N0YXRlPQotSElUaGVtZUJhY2tncm91bmREcmF3SW5mb19raW5kPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVCdXR0b25EcmF3SW5mbz0KLUhJVGhlbWVCdXR0b25EcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX3N0YXRlPQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX2tpbmQ9Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fdmFsdWU9Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fYWRvcm5tZW50PQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX3RpbWU9YWNjZXNzb3I9YW5pbWF0aW9uLnRpbWUKLUhJVGhlbWVCdXR0b25EcmF3SW5mb19mcmFtZT1hY2Nlc3Nvcj1hbmltYXRpb24uZnJhbWUKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lRnJhbWVEcmF3SW5mbz0KLUhJVGhlbWVGcmFtZURyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lRnJhbWVEcmF3SW5mb19zdGF0ZT0KLUhJVGhlbWVGcmFtZURyYXdJbmZvX2tpbmQ9Ci1ISVRoZW1lRnJhbWVEcmF3SW5mb19pc0ZvY3VzZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUdyb3VwQm94RHJhd0luZm89Ci1ISVRoZW1lR3JvdXBCb3hEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZUdyb3VwQm94RHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lR3JvdXBCb3hEcmF3SW5mb19raW5kPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVHcm93Qm94RHJhd0luZm89Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX2tpbmQ9Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX3N0YXRlPQotSElUaGVtZUdyb3dCb3hEcmF3SW5mb19kaXJlY3Rpb249Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX3NpemU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVBvcHVwQXJyb3dEcmF3SW5mbz0KLUhJVGhlbWVQb3B1cEFycm93RHJhd0luZm9fdmVyc2lvbj0KLUhJVGhlbWVQb3B1cEFycm93RHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lUG9wdXBBcnJvd0RyYXdJbmZvX29yaWVudGF0aW9uPQotSElUaGVtZVBvcHVwQXJyb3dEcmF3SW5mb19zaXplPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVTZXBhcmF0b3JEcmF3SW5mbz0KLUhJVGhlbWVTZXBhcmF0b3JEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVNlcGFyYXRvckRyYXdJbmZvX3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVUYWJEcmF3SW5mbz0KLUhJVGhlbWVUYWJEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVRhYkRyYXdJbmZvX3N0eWxlPQotSElUaGVtZVRhYkRyYXdJbmZvX2RpcmVjdGlvbj0KLUhJVGhlbWVUYWJEcmF3SW5mb19zaXplPQotSElUaGVtZVRhYkRyYXdJbmZvX2Fkb3JubWVudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lVGFiUGFuZURyYXdJbmZvPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb19zdGF0ZT0KLUhJVGhlbWVUYWJQYW5lRHJhd0luZm9fZGlyZWN0aW9uPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb19zaXplPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVUZXh0SW5mbz0KLUhJVGhlbWVUZXh0SW5mb192ZXJzaW9uPQotSElUaGVtZVRleHRJbmZvX3N0YXRlPQotSElUaGVtZVRleHRJbmZvX2ZvbnRJRD0KLUhJVGhlbWVUZXh0SW5mb19ob3Jpem9udGFsRmx1c2huZXNzPQotSElUaGVtZVRleHRJbmZvX3ZlcnRpY2FsRmx1c2huZXNzPQotSElUaGVtZVRleHRJbmZvX29wdGlvbnM9Ci1ISVRoZW1lVGV4dEluZm9fdHJ1bmNhdGlvblBvc2l0aW9uPQotSElUaGVtZVRleHRJbmZvX3RydW5jYXRpb25NYXhMaW5lcz0KLUhJVGhlbWVUZXh0SW5mb190cnVuY2F0aW9uSGFwcGVuZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVRyYWNrRHJhd0luZm89Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVRyYWNrRHJhd0luZm9fa2luZD1jYXN0PVRoZW1lVHJhY2tLaW5kCi1ISVRoZW1lVHJhY2tEcmF3SW5mb19ib3VuZHNfeD1hY2Nlc3Nvcj1ib3VuZHMub3JpZ2luLngKLUhJVGhlbWVUcmFja0RyYXdJbmZvX2JvdW5kc195PWFjY2Vzc29yPWJvdW5kcy5vcmlnaW4ueQotSElUaGVtZVRyYWNrRHJhd0luZm9fYm91bmRzX3dpZHRoPWFjY2Vzc29yPWJvdW5kcy5zaXplLndpZHRoCi1ISVRoZW1lVHJhY2tEcmF3SW5mb19ib3VuZHNfaGVpZ2h0PWFjY2Vzc29yPWJvdW5kcy5zaXplLmhlaWdodAotSElUaGVtZVRyYWNrRHJhd0luZm9fbWluPQotSElUaGVtZVRyYWNrRHJhd0luZm9fbWF4PQotSElUaGVtZVRyYWNrRHJhd0luZm9fdmFsdWU9Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19yZXNlcnZlZD0KLUhJVGhlbWVUcmFja0RyYXdJbmZvX2F0dHJpYnV0ZXM9Y2FzdD1UaGVtZVRyYWNrQXR0cmlidXRlcwotSElUaGVtZVRyYWNrRHJhd0luZm9fZW5hYmxlU3RhdGU9Y2FzdD1UaGVtZVRyYWNrRW5hYmxlU3RhdGUKLUhJVGhlbWVUcmFja0RyYXdJbmZvX2ZpbGxlcjE9Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19zY3JvbGxiYXI9YWNjZXNzb3I9dHJhY2tJbmZvLnNjcm9sbGJhcgotSElUaGVtZVRyYWNrRHJhd0luZm9fc2xpZGVyPWFjY2Vzc29yPXRyYWNrSW5mby5zbGlkZXIKLUhJVGhlbWVUcmFja0RyYXdJbmZvX3Byb2dyZXNzPWFjY2Vzc29yPXRyYWNrSW5mby5wcm9ncmVzcwotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWM9Ci1ITUhlbHBDb250ZW50UmVjX3ZlcnNpb249Ci1ITUhlbHBDb250ZW50UmVjX2Fic0hvdFJlY3RfdG9wPWFjY2Vzc29yPWFic0hvdFJlY3QudG9wCi1ITUhlbHBDb250ZW50UmVjX2Fic0hvdFJlY3RfbGVmdD1hY2Nlc3Nvcj1hYnNIb3RSZWN0LmxlZnQKLUhNSGVscENvbnRlbnRSZWNfYWJzSG90UmVjdF9ib3R0b209YWNjZXNzb3I9YWJzSG90UmVjdC5ib3R0b20KLUhNSGVscENvbnRlbnRSZWNfYWJzSG90UmVjdF9yaWdodD1hY2Nlc3Nvcj1hYnNIb3RSZWN0LnJpZ2h0Ci1ITUhlbHBDb250ZW50UmVjX3RhZ1NpZGU9Ci1ITUhlbHBDb250ZW50UmVjX2NvbnRlbnQwX2NvbnRlbnRUeXBlPWFjY2Vzc29yPWNvbnRlbnRbMF0uY29udGVudFR5cGUKLUhNSGVscENvbnRlbnRSZWNfY29udGVudDBfdGFnQ0ZTdHJpbmc9YWNjZXNzb3I9Y29udGVudFswXS51LnRhZ0NGU3RyaW5nLGNhc3Q9KENGU3RyaW5nUmVmKQotSE1IZWxwQ29udGVudFJlY19jb250ZW50MV9jb250ZW50VHlwZT1hY2Nlc3Nvcj1jb250ZW50WzFdLmNvbnRlbnRUeXBlCi1ITUhlbHBDb250ZW50UmVjX2NvbnRlbnQxX3RhZ0NGU3RyaW5nPWFjY2Vzc29yPWNvbnRlbnRbMV0udS50YWdDRlN0cmluZyxjYXN0PShDRlN0cmluZ1JlZikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9NZW51VHJhY2tpbmdEYXRhPQotTWVudVRyYWNraW5nRGF0YV9tZW51PWNhc3Q9KE1lbnVSZWYpCi1NZW51VHJhY2tpbmdEYXRhX2l0ZW1TZWxlY3RlZD0KLU1lbnVUcmFja2luZ0RhdGFfaXRlbVVuZGVyTW91c2U9Ci1NZW51VHJhY2tpbmdEYXRhX3RvcD1hY2Nlc3Nvcj1pdGVtUmVjdC50b3AKLU1lbnVUcmFja2luZ0RhdGFfbGVmdD1hY2Nlc3Nvcj1pdGVtUmVjdC5sZWZ0Ci1NZW51VHJhY2tpbmdEYXRhX2JvdHRvbT1hY2Nlc3Nvcj1pdGVtUmVjdC5ib3R0b20KLU1lbnVUcmFja2luZ0RhdGFfcmlnaHQ9YWNjZXNzb3I9aXRlbVJlY3QucmlnaHQKLU1lbnVUcmFja2luZ0RhdGFfdmlydHVhbE1lbnVUb3A9Ci1NZW51VHJhY2tpbmdEYXRhX3ZpcnR1YWxNZW51Qm90dG9tPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX05hdkRpYWxvZ0NyZWF0aW9uT3B0aW9ucz0KLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc192ZXJzaW9uPQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX29wdGlvbkZsYWdzPWNhc3Q9KE5hdkRpYWxvZ09wdGlvbkZsYWdzKQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX2xvY2F0aW9uX2g9YWNjZXNzb3I9bG9jYXRpb24uaAotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX2xvY2F0aW9uX3Y9YWNjZXNzb3I9bG9jYXRpb24udgotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX2NsaWVudE5hbWU9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfd2luZG93VGl0bGU9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfYWN0aW9uQnV0dG9uTGFiZWw9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfY2FuY2VsQnV0dG9uTGFiZWw9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfc2F2ZUZpbGVOYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX21lc3NhZ2U9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfcHJlZmVyZW5jZUtleT0KLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc19wb3B1cEV4dGVuc2lvbj1jYXN0PShDRkFycmF5UmVmKQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX21vZGFsaXR5PWNhc3Q9KFdpbmRvd01vZGFsaXR5KQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX3BhcmVudFdpbmRvdz1jYXN0PShXaW5kb3dSZWYpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTmF2UmVwbHlSZWNvcmQ9Ci1OYXZSZXBseVJlY29yZF92ZXJzaW9uPWNhc3Q9KFVJbnQxNikKLU5hdlJlcGx5UmVjb3JkX3ZhbGlkUmVjb3JkPWNhc3Q9KEJvb2xlYW4pCi1OYXZSZXBseVJlY29yZF9yZXBsYWNpbmc9Y2FzdD0oQm9vbGVhbikKLU5hdlJlcGx5UmVjb3JkX2lzU3RhdGlvbmVyeT1jYXN0PShCb29sZWFuKQotTmF2UmVwbHlSZWNvcmRfdHJhbnNsYXRpb25OZWVkZWQ9Y2FzdD0oQm9vbGVhbikKLU5hdlJlcGx5UmVjb3JkX3NlbGVjdGlvbl9kZXNjcmlwdG9yVHlwZT1hY2Nlc3Nvcj1zZWxlY3Rpb24uZGVzY3JpcHRvclR5cGUsY2FzdD0oRGVzY1R5cGUpCi1OYXZSZXBseVJlY29yZF9zZWxlY3Rpb25fZGF0YUhhbmRsZT1hY2Nlc3Nvcj1zZWxlY3Rpb24uZGF0YUhhbmRsZSxjYXN0PShBRURhdGFTdG9yYWdlKQotTmF2UmVwbHlSZWNvcmRfa2V5U2NyaXB0PWNhc3Q9KFNjcmlwdENvZGUpCi1OYXZSZXBseVJlY29yZF9maWxlVHJhbnNsYXRpb249Y2FzdD0oRmlsZVRyYW5zbGF0aW9uU3BlY0FycmF5SGFuZGxlKQotTmF2UmVwbHlSZWNvcmRfcmVzZXJ2ZWQxPWNhc3Q9KFVJbnQzMikKLU5hdlJlcGx5UmVjb3JkX3NhdmVGaWxlTmFtZT1jYXN0PShDRlN0cmluZ1JlZikKLU5hdlJlcGx5UmVjb3JkX3NhdmVGaWxlRXh0ZW5zaW9uSGlkZGVuPWNhc3Q9KEJvb2xlYW4pCi1OYXZSZXBseVJlY29yZF9yZXNlcnZlZDI9Y2FzdD0oVUludDgpCi1OYXZSZXBseVJlY29yZF9yZXNlcnZlZD1jYXN0PShjaGFyW10pCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fT1M9Ci1PU19BRUNvdW50SXRlbXM9Ci1PU19BRUNvdW50SXRlbXNfMD1jYXN0PShjb25zdCBBRURlc2NMaXN0ICopCi1PU19BRUNvdW50SXRlbXNfMT1jYXN0PShsb25nICopCi0KLU9TX0FFR2V0TnRoUHRyPQotT1NfQUVHZXROdGhQdHJfMD1jYXN0PShjb25zdCBBRURlc2NMaXN0ICopCi1PU19BRUdldE50aFB0cl8xPQotT1NfQUVHZXROdGhQdHJfMj1jYXN0PShEZXNjVHlwZSkKLU9TX0FFR2V0TnRoUHRyXzM9Y2FzdD0oQUVLZXl3b3JkICopCi1PU19BRUdldE50aFB0cl80PWNhc3Q9KERlc2NUeXBlICopCi1PU19BRUdldE50aFB0cl81PWNhc3Q9KHZvaWQgKikKLU9TX0FFR2V0TnRoUHRyXzY9Y2FzdD0oU2l6ZSkKLU9TX0FFR2V0TnRoUHRyXzc9Y2FzdD0oU2l6ZSAqKQotCi1PU19BRUluc3RhbGxFdmVudEhhbmRsZXI9Ci1PU19BRUluc3RhbGxFdmVudEhhbmRsZXJfMD1jYXN0PUFFRXZlbnRDbGFzcwotT1NfQUVJbnN0YWxsRXZlbnRIYW5kbGVyXzE9Y2FzdD1BRUV2ZW50SUQKLU9TX0FFSW5zdGFsbEV2ZW50SGFuZGxlcl8yPWNhc3Q9KEFFRXZlbnRIYW5kbGVyVVBQKQotT1NfQUVJbnN0YWxsRXZlbnRIYW5kbGVyXzM9Y2FzdD0obG9uZykKLU9TX0FFSW5zdGFsbEV2ZW50SGFuZGxlcl80PQotCi1PU19BRVByb2Nlc3NBcHBsZUV2ZW50PQotT1NfQUVQcm9jZXNzQXBwbGVFdmVudF8wPWNhc3Q9KGNvbnN0IEV2ZW50UmVjb3JkICopCi0KLU9TX0FUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZT0KLU9TX0FUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZV8wPWNhc3Q9KEFUU0ZvbnRSZWYpCi1PU19BVFNGb250R2V0UG9zdFNjcmlwdE5hbWVfMT1jYXN0PShBVFNPcHRpb25GbGFncykKLU9TX0FUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZV8yPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0FUU1VCYXRjaEJyZWFrTGluZXM9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzE9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzI9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzM9Ci1PU19BVFNVQmF0Y2hCcmVha0xpbmVzXzQ9Y2FzdD0oSXRlbUNvdW50ICopCi0KLU9TX0FUU1VDcmVhdGVTdHlsZT0KLU9TX0FUU1VDcmVhdGVTdHlsZV8wPWNhc3Q9KEFUU1VTdHlsZSAqKQotCi1PU19BVFNVQ3JlYXRlVGV4dExheW91dD0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0XzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQgKikKLQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cj0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMD1jYXN0PShDb25zdFVuaUNoYXJBcnJheVB0cikKLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMT0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMj0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfMz0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfND0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfNT1jYXN0PShjb25zdCBVbmlDaGFyQ291bnQgKikKLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfNj1jYXN0PShBVFNVU3R5bGUgKikKLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHJfNz1jYXN0PShBVFNVVGV4dExheW91dCAqKQotCi1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXQ9Ci1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMD1jYXN0PUFUU1VUZXh0TGF5b3V0Ci1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMT1jYXN0PVVuaUNoYXJBcnJheU9mZnNldAotT1NfQVRTVURpcmVjdEdldExheW91dERhdGFBcnJheVB0ckZyb21UZXh0TGF5b3V0XzI9Y2FzdD1BVFNVRGlyZWN0RGF0YVNlbGVjdG9yCi1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMz1jYXN0PXZvaWQgKgotT1NfQVRTVURpcmVjdEdldExheW91dERhdGFBcnJheVB0ckZyb21UZXh0TGF5b3V0XzQ9Y2FzdD1JdGVtQ291bnQgKgotCi1PU19BVFNVRGlyZWN0UmVsZWFzZUxheW91dERhdGFBcnJheVB0cj0KLU9TX0FUU1VEaXJlY3RSZWxlYXNlTGF5b3V0RGF0YUFycmF5UHRyXzA9Y2FzdD1BVFNVTGluZVJlZgotT1NfQVRTVURpcmVjdFJlbGVhc2VMYXlvdXREYXRhQXJyYXlQdHJfMT1jYXN0PUFUU1VEaXJlY3REYXRhU2VsZWN0b3IKLU9TX0FUU1VEaXJlY3RSZWxlYXNlTGF5b3V0RGF0YUFycmF5UHRyXzI9Y2FzdD12b2lkICoKLQotT1NfQVRTVURpc3Bvc2VTdHlsZT0KLU9TX0FUU1VEaXNwb3NlU3R5bGVfMD1jYXN0PShBVFNVU3R5bGUpCi0KLU9TX0FUU1VEaXNwb3NlVGV4dExheW91dD0KLU9TX0FUU1VEaXNwb3NlVGV4dExheW91dF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotCi1PU19BVFNVRHJhd1RleHQ9Ci1PU19BVFNVRHJhd1RleHRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VEcmF3VGV4dF8xPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VEcmF3VGV4dF8yPWNhc3Q9KFVuaUNoYXJDb3VudCkKLU9TX0FUU1VEcmF3VGV4dF8zPWNhc3Q9KEFUU1VUZXh0TWVhc3VyZW1lbnQpCi1PU19BVFNVRHJhd1RleHRfND1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotCi1PU19BVFNVRmluZEZvbnRGcm9tTmFtZT0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzA9Y2FzdD1jb25zdCB2b2lkICoKLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzE9Ci1PU19BVFNVRmluZEZvbnRGcm9tTmFtZV8yPQotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfMz0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzQ9Ci1PU19BVFNVRmluZEZvbnRGcm9tTmFtZV81PQotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfNj1jYXN0PUFUU1VGb250SUQgKgotCi1PU19BVFNVRmluZEZvbnROYW1lPQotT1NfQVRTVUZpbmRGb250TmFtZV8wPWNhc3Q9QVRTVUZvbnRJRAotT1NfQVRTVUZpbmRGb250TmFtZV8xPQotT1NfQVRTVUZpbmRGb250TmFtZV8yPQotT1NfQVRTVUZpbmRGb250TmFtZV8zPQotT1NfQVRTVUZpbmRGb250TmFtZV80PQotT1NfQVRTVUZpbmRGb250TmFtZV81PQotT1NfQVRTVUZpbmRGb250TmFtZV82PWNhc3Q9UHRyCi1PU19BVFNVRmluZEZvbnROYW1lXzc9Y2FzdD1CeXRlQ291bnQgKgotT1NfQVRTVUZpbmRGb250TmFtZV84PWNhc3Q9SXRlbUNvdW50ICoKLQotT1NfQVRTVUdldEZvbnRJRHM9Ci1PU19BVFNVR2V0Rm9udElEc18wPWNhc3Q9QVRTVUZvbnRJRCAqCi1PU19BVFNVR2V0Rm9udElEc18xPQotT1NfQVRTVUdldEZvbnRJRHNfMj1jYXN0PUl0ZW1Db3VudCAqCi0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0k9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lJXzNJXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lJXzNJXzE9Y2FzdD0oQVRTVVRleHRNZWFzdXJlbWVudCkKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfMj1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV8zPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfND0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfNT0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfNj0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfNz1jYXN0PShBVFNUcmFwZXpvaWQgKikKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfOD1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0k9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfMT1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfMj1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfMz1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV80PQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfNT0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8yXzNJXzY9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV83PWNhc3Q9KEFUU1RyYXBlem9pZCAqKQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfOD1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfQVRTVUdldExheW91dENvbnRyb2w9Ci1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVUdldExheW91dENvbnRyb2xfMT1jYXN0PUFUU1VBdHRyaWJ1dGVUYWcKLU9TX0FUU1VHZXRMYXlvdXRDb250cm9sXzI9Ci1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF8zPWNhc3Q9QVRTVUF0dHJpYnV0ZVZhbHVlUHRyCi1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF80PWNhc3Q9Qnl0ZUNvdW50ICoKLQotT1NfQVRTVUdldExpbmVDb250cm9sPQotT1NfQVRTVUdldExpbmVDb250cm9sXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0TGluZUNvbnRyb2xfMT1jYXN0PVVuaUNoYXJBcnJheU9mZnNldAotT1NfQVRTVUdldExpbmVDb250cm9sXzI9Y2FzdD1BVFNVQXR0cmlidXRlVGFnCi1PU19BVFNVR2V0TGluZUNvbnRyb2xfMz1jYXN0PUJ5dGVDb3VudAotT1NfQVRTVUdldExpbmVDb250cm9sXzQ9Y2FzdD1BVFNVQXR0cmlidXRlVmFsdWVQdHIKLU9TX0FUU1VHZXRMaW5lQ29udHJvbF81PWNhc3Q9Qnl0ZUNvdW50ICoKLQotT1NfQVRTVUdldFNvZnRMaW5lQnJlYWtzPQotT1NfQVRTVUdldFNvZnRMaW5lQnJlYWtzXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMT1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMj1jYXN0PShVbmlDaGFyQ291bnQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMz1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfND1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQgKikKLU9TX0FUU1VHZXRTb2Z0TGluZUJyZWFrc181PWNhc3Q9KEl0ZW1Db3VudCAqKQotCi1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodD0KLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0XzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodF8xPQotT1NfQVRTVUdldFRleHRIaWdobGlnaHRfMj0KLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0XzM9Ci1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodF80PQotT1NfQVRTVUdldFRleHRIaWdobGlnaHRfNT1jYXN0PVJnbkhhbmRsZQotCi1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHM9Ci1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc18xPQotT1NfQVRTVUdldFVuanVzdGlmaWVkQm91bmRzXzI9Ci1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfMz1jYXN0PUFUU1VUZXh0TWVhc3VyZW1lbnQgKgotT1NfQVRTVUdldFVuanVzdGlmaWVkQm91bmRzXzQ9Y2FzdD1BVFNVVGV4dE1lYXN1cmVtZW50ICoKLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc181PWNhc3Q9QVRTVVRleHRNZWFzdXJlbWVudCAqCi1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfNj1jYXN0PUFUU1VUZXh0TWVhc3VyZW1lbnQgKgotCi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRocz0KLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzA9Y2FzdD1BVFNVU3R5bGUKLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzE9Y2FzdD1HbHlwaElECi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRoc18yPWNhc3Q9QVRTUXVhZHJhdGljTmV3UGF0aFVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfMz1jYXN0PUFUU1F1YWRyYXRpY0xpbmVVUFAKLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzQ9Y2FzdD1BVFNRdWFkcmF0aWNDdXJ2ZVVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfNT1jYXN0PUFUU1F1YWRyYXRpY0Nsb3NlUGF0aFVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfNj1jYXN0PXZvaWQgKgotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfNz1jYXN0PU9TU3RhdHVzICoKLQotT1NfQVRTVUhpZ2hsaWdodFRleHQ9Ci1PU19BVFNVSGlnaGxpZ2h0VGV4dF8wPWNhc3Q9QVRTVVRleHRMYXlvdXQKLU9TX0FUU1VIaWdobGlnaHRUZXh0XzE9Y2FzdD1BVFNVVGV4dE1lYXN1cmVtZW50Ci1PU19BVFNVSGlnaGxpZ2h0VGV4dF8yPWNhc3Q9QVRTVVRleHRNZWFzdXJlbWVudAotT1NfQVRTVUhpZ2hsaWdodFRleHRfMz0KLU9TX0FUU1VIaWdobGlnaHRUZXh0XzQ9Ci0KLU9TX0FUU1VOZXh0Q3Vyc29yUG9zaXRpb249Ci1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzE9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0KQotT1NfQVRTVU5leHRDdXJzb3JQb3NpdGlvbl8yPWNhc3Q9KEFUU1VDdXJzb3JNb3ZlbWVudFR5cGUpCi1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzM9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0ICopCi0KLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uPQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb25fMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uXzE9Ci1PU19BVFNVT2Zmc2V0VG9Qb3NpdGlvbl8yPQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb25fMz0KLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uXzQ9Ci1PU19BVFNVT2Zmc2V0VG9Qb3NpdGlvbl81PWNhc3Q9Qm9vbGVhbiAqCi0KLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0PQotT1NfQVRTVVBvc2l0aW9uVG9PZmZzZXRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0XzE9Ci1PU19BVFNVUG9zaXRpb25Ub09mZnNldF8yPQotT1NfQVRTVVBvc2l0aW9uVG9PZmZzZXRfMz1jYXN0PVVuaUNoYXJBcnJheU9mZnNldCAqCi1PU19BVFNVUG9zaXRpb25Ub09mZnNldF80PWNhc3Q9Qm9vbGVhbiAqCi1PU19BVFNVUG9zaXRpb25Ub09mZnNldF81PWNhc3Q9VW5pQ2hhckFycmF5T2Zmc2V0ICoKLQotT1NfQVRTVVByZXZpb3VzQ3Vyc29yUG9zaXRpb249Ci1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVByZXZpb3VzQ3Vyc29yUG9zaXRpb25fMT1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8yPWNhc3Q9KEFUU1VDdXJzb3JNb3ZlbWVudFR5cGUpCi1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8zPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCAqKQotCi1PU19BVFNVU2V0QXR0cmlidXRlcz0KLU9TX0FUU1VTZXRBdHRyaWJ1dGVzXzA9Y2FzdD0oQVRTVVN0eWxlKQotT1NfQVRTVVNldEF0dHJpYnV0ZXNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVU2V0QXR0cmlidXRlc18yPWNhc3Q9KEFUU1VBdHRyaWJ1dGVUYWcgKikKLU9TX0FUU1VTZXRBdHRyaWJ1dGVzXzM9Y2FzdD0oQnl0ZUNvdW50ICopCi1PU19BVFNVU2V0QXR0cmlidXRlc180PWNhc3Q9KEFUU1VBdHRyaWJ1dGVWYWx1ZVB0ciAqKQotCi1PU19BVFNVU2V0Rm9udEZlYXR1cmVzPQotT1NfQVRTVVNldEZvbnRGZWF0dXJlc18wPWNhc3Q9KEFUU1VTdHlsZSkKLU9TX0FUU1VTZXRGb250RmVhdHVyZXNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVU2V0Rm9udEZlYXR1cmVzXzI9Y2FzdD0oY29uc3QgQVRTVUZvbnRGZWF0dXJlVHlwZSAqKQotT1NfQVRTVVNldEZvbnRGZWF0dXJlc18zPWNhc3Q9KGNvbnN0IEFUU1VGb250RmVhdHVyZVNlbGVjdG9yICopCi0KLU9TX0FUU1VTZXRIaWdobGlnaHRpbmdNZXRob2Q9Ci1PU19BVFNVU2V0SGlnaGxpZ2h0aW5nTWV0aG9kXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0SGlnaGxpZ2h0aW5nTWV0aG9kXzE9Ci1PU19BVFNVU2V0SGlnaGxpZ2h0aW5nTWV0aG9kXzI9Ci0KLU9TX0FUU1VTZXRMYXlvdXRDb250cm9scz0KLU9TX0FUU1VTZXRMYXlvdXRDb250cm9sc18wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzE9Y2FzdD0oSXRlbUNvdW50KQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzI9Y2FzdD0oQVRTVUF0dHJpYnV0ZVRhZyAqKQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzM9Y2FzdD0oQnl0ZUNvdW50ICopCi1PU19BVFNVU2V0TGF5b3V0Q29udHJvbHNfND1jYXN0PShBVFNVQXR0cmlidXRlVmFsdWVQdHIgKikKLQotT1NfQVRTVVNldExpbmVDb250cm9scz0KLU9TX0FUU1VTZXRMaW5lQ29udHJvbHNfMD1jYXN0PUFUU1VUZXh0TGF5b3V0Ci1PU19BVFNVU2V0TGluZUNvbnRyb2xzXzE9Y2FzdD1VbmlDaGFyQXJyYXlPZmZzZXQKLU9TX0FUU1VTZXRMaW5lQ29udHJvbHNfMj1jYXN0PUl0ZW1Db3VudAotT1NfQVRTVVNldExpbmVDb250cm9sc18zPWNhc3Q9Y29uc3QgQVRTVUF0dHJpYnV0ZVRhZyAqCi1PU19BVFNVU2V0TGluZUNvbnRyb2xzXzQ9Y2FzdD1jb25zdCBCeXRlQ291bnQgKgotT1NfQVRTVVNldExpbmVDb250cm9sc181PWNhc3Q9Y29uc3QgQVRTVUF0dHJpYnV0ZVZhbHVlUHRyICoKLQotT1NfQVRTVVNldFJ1blN0eWxlPQotT1NfQVRTVVNldFJ1blN0eWxlXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0UnVuU3R5bGVfMT1jYXN0PShBVFNVU3R5bGUpCi1PU19BVFNVU2V0UnVuU3R5bGVfMj1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVU2V0UnVuU3R5bGVfMz1jYXN0PShVbmlDaGFyQ291bnQpCi0KLU9TX0FUU1VTZXRTb2Z0TGluZUJyZWFrPQotT1NfQVRTVVNldFNvZnRMaW5lQnJlYWtfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VTZXRTb2Z0TGluZUJyZWFrXzE9Ci0KLU9TX0FUU1VTZXRUYWJBcnJheT0KLU9TX0FUU1VTZXRUYWJBcnJheV8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldFRhYkFycmF5XzE9Y2FzdD1jb25zdCBBVFNVVGFiICoKLU9TX0FUU1VTZXRUYWJBcnJheV8yPQotCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbj0KLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbl8xPWNhc3Q9KENvbnN0VW5pQ2hhckFycmF5UHRyKQotT1NfQVRTVVNldFRleHRQb2ludGVyTG9jYXRpb25fMj1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbl8zPWNhc3Q9KFVuaUNoYXJDb3VudCkKLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uXzQ9Y2FzdD0oVW5pQ2hhckNvdW50KQotCi1PU19BVFNVU2V0VHJhbnNpZW50Rm9udE1hdGNoaW5nPQotT1NfQVRTVVNldFRyYW5zaWVudEZvbnRNYXRjaGluZ18wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldFRyYW5zaWVudEZvbnRNYXRjaGluZ18xPQotCi1PU19BVFNVVGV4dERlbGV0ZWQ9Ci1PU19BVFNVVGV4dERlbGV0ZWRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VUZXh0RGVsZXRlZF8xPQotT1NfQVRTVVRleHREZWxldGVkXzI9Ci0KLU9TX0FUU1VUZXh0SW5zZXJ0ZWQ9Ci1PU19BVFNVVGV4dEluc2VydGVkXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVVGV4dEluc2VydGVkXzE9Ci1PU19BVFNVVGV4dEluc2VydGVkXzI9Ci0KLU9TX0FjdGl2ZU5vbkZsb2F0aW5nV2luZG93PQotCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zPQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zXzI9Y2FzdD0oVUludDMyKQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc18zPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VySXRlbUlEICopCi1PU19BZGREYXRhQnJvd3Nlckl0ZW1zXzQ9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotCi1PU19BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uPQotT1NfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgKiksZmxhZ3M9aW5pdAotT1NfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbl8yPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uSW5kZXgpCi0KLU9TX0FkZERyYWdJdGVtRmxhdm9yPQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfMD1jYXN0PShEcmFnUmVmKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0FkZERyYWdJdGVtRmxhdm9yXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX0FkZERyYWdJdGVtRmxhdm9yXzM9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfND1jYXN0PShTaXplKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfNT1jYXN0PShGbGF2b3JGbGFncykKLQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nPQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzA9Y2FzdD0oTWVudVJlZikKLU9TX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzI9Y2FzdD0oTWVudUl0ZW1BdHRyaWJ1dGVzKQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzM9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfND1jYXN0PShNZW51SXRlbUluZGV4ICopCi0KLU9TX0F1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnM9Ci1PU19BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfQmVnaW5VcGRhdGU9Ci1PU19CZWdpblVwZGF0ZV8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfQnJpbmdUb0Zyb250PQotT1NfQnJpbmdUb0Zyb250XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19DRkFycmF5QXBwZW5kVmFsdWU9Ci1PU19DRkFycmF5QXBwZW5kVmFsdWVfMD1jYXN0PShDRk11dGFibGVBcnJheVJlZikKLU9TX0NGQXJyYXlBcHBlbmRWYWx1ZV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfQ0ZBcnJheUNyZWF0ZU11dGFibGU9Ci1PU19DRkFycmF5Q3JlYXRlTXV0YWJsZV8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZBcnJheUNyZWF0ZU11dGFibGVfMT1jYXN0PShDRkluZGV4KQotT1NfQ0ZBcnJheUNyZWF0ZU11dGFibGVfMj1jYXN0PShjb25zdCBDRkFycmF5Q2FsbEJhY2tzICopCi0KLU9TX0NGQXJyYXlHZXRDb3VudD0KLU9TX0NGQXJyYXlHZXRDb3VudF8wPWNhc3Q9KENGQXJyYXlSZWYpCi0KLU9TX0NGQXJyYXlHZXRWYWx1ZUF0SW5kZXg9Ci1PU19DRkFycmF5R2V0VmFsdWVBdEluZGV4XzA9Y2FzdD0oQ0ZBcnJheVJlZikKLU9TX0NGQXJyYXlHZXRWYWx1ZUF0SW5kZXhfMT0KLQotT1NfQ0ZEYXRhR2V0Qnl0ZXM9Ci1PU19DRkRhdGFHZXRCeXRlc18wPWNhc3Q9KENGRGF0YVJlZikKLU9TX0NGRGF0YUdldEJ5dGVzXzE9ZmxhZ3M9c3RydWN0Ci1PU19DRkRhdGFHZXRCeXRlc18yPWNhc3Q9KFVJbnQ4ICopCi0KLU9TX0NGRGF0YUdldExlbmd0aD0KLU9TX0NGRGF0YUdldExlbmd0aF8wPWNhc3Q9KENGRGF0YVJlZikKLQotT1NfQ0ZMb2NhbGVDb3B5Q3VycmVudD0KLQotT1NfQ0ZOdW1iZXJGb3JtYXR0ZXJDb3B5UHJvcGVydHk9Ci1PU19DRk51bWJlckZvcm1hdHRlckNvcHlQcm9wZXJ0eV8wPWNhc3Q9Q0ZOdW1iZXJGb3JtYXR0ZXJSZWYKLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ29weVByb3BlcnR5XzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19DRk51bWJlckZvcm1hdHRlckNyZWF0ZT0KLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ3JlYXRlXzA9Y2FzdD1DRkFsbG9jYXRvclJlZgotT1NfQ0ZOdW1iZXJGb3JtYXR0ZXJDcmVhdGVfMT1jYXN0PUNGTG9jYWxlUmVmCi1PU19DRk51bWJlckZvcm1hdHRlckNyZWF0ZV8yPWNhc3Q9Q0ZOdW1iZXJGb3JtYXR0ZXJTdHlsZQotCi1PU19DRlJlbGVhc2U9Ci1PU19DRlJlbGVhc2VfMD1jYXN0PShDRlR5cGVSZWYpCi0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzPQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXNfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzE9Y2FzdD0oY29uc3QgVUludDggKikKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzI9Y2FzdD0oQ0ZJbmRleCkKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzM9Y2FzdD0oQ0ZTdHJpbmdFbmNvZGluZykKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzXzQ9Ci0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNfX0lJST0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNfX0lJSV8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSUlJXzE9Y2FzdD0oY29uc3QgVW5pQ2hhciAqKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSUlJXzI9Y2FzdD0oQ0ZJbmRleCkKLQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSV8zQ0k9Ci1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JXzNDSV8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSV8zQ0lfMT1jYXN0PShjb25zdCBVbmlDaGFyICopCi1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JXzNDSV8yPWNhc3Q9KENGSW5kZXgpCi0KLU9TX0NGU3RyaW5nR2V0Qnl0ZXM9Ci1PU19DRlN0cmluZ0dldEJ5dGVzXzA9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlN0cmluZ0dldEJ5dGVzXzE9Y2FzdD0oQ0ZSYW5nZSAqKSxmbGFncz1zdHJ1Y3QKLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfMj1jYXN0PShDRlN0cmluZ0VuY29kaW5nKQotT1NfQ0ZTdHJpbmdHZXRCeXRlc18zPWNhc3Q9KFVJbnQ4KQotT1NfQ0ZTdHJpbmdHZXRCeXRlc180PWNhc3Q9KEJvb2xlYW4pCi1PU19DRlN0cmluZ0dldEJ5dGVzXzU9Y2FzdD0oVUludDggKikKLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfNj1jYXN0PShDRkluZGV4KQotT1NfQ0ZTdHJpbmdHZXRCeXRlc183PWNhc3Q9KENGSW5kZXggKikKLQotT1NfQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzPQotT1NfQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzXzA9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlN0cmluZ0dldENoYXJhY3RlcnNfMT1jYXN0PShDRlJhbmdlICopLGZsYWdzPXN0cnVjdAotT1NfQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzXzI9Y2FzdD0oVW5pQ2hhciAqKQotCi1PU19DRlN0cmluZ0dldExlbmd0aD0KLU9TX0NGU3RyaW5nR2V0TGVuZ3RoXzA9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX0NGU3RyaW5nR2V0U3lzdGVtRW5jb2Rpbmc9Ci0KLU9TX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoPQotT1NfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGhfMD1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoXzE9Y2FzdD0oQ0ZVUkxQYXRoU3R5bGUpCi0KLU9TX0NGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50PQotT1NfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnRfMD1jYXN0PShDRlVSTFJlZikKLQotT1NfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbj0KLU9TX0NGVVJMQ29weVBhdGhFeHRlbnNpb25fMD1jYXN0PUNGVVJMUmVmCi0KLU9TX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQ9Ci1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzE9Y2FzdD0oQ0ZVUkxSZWYpCi1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50XzM9Y2FzdD0oQm9vbGVhbikKLQotT1NfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudD0KLU9TX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnRfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnRfMT1jYXN0PShDRlVSTFJlZikKLQotT1NfQ0ZVUkxDcmVhdGVEYXRhPQotT1NfQ0ZVUkxDcmVhdGVEYXRhXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZURhdGFfMT1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMQ3JlYXRlRGF0YV8yPWNhc3Q9KENGU3RyaW5nRW5jb2RpbmcpCi1PU19DRlVSTENyZWF0ZURhdGFfMz1jYXN0PShCb29sZWFuKQotCi1PU19DRlVSTENyZWF0ZUZyb21GU1JlZj0KLU9TX0NGVVJMQ3JlYXRlRnJvbUZTUmVmXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZUZyb21GU1JlZl8xPWNhc3Q9KGNvbnN0IHN0cnVjdCBGU1JlZiAqKQotCi1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb249Ci1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25fMD1jYXN0PUNGQWxsb2NhdG9yUmVmCi1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25fMT1jYXN0PWNvbnN0IFVJbnQ4ICoKLU9TX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbl8yPQotT1NfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uXzM9Ci0KLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzPQotT1NfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXNfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzE9Y2FzdD0oY29uc3QgVUludDggKikKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzI9Y2FzdD0oQ0ZJbmRleCkKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzM9Y2FzdD0oQ0ZTdHJpbmdFbmNvZGluZykKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzQ9Y2FzdD0oQ0ZVUkxSZWYpCi0KLU9TX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoPQotT1NfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aF8yPWNhc3Q9KENGVVJMUGF0aFN0eWxlKQotT1NfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhfMz0KLQotT1NfQ0ZVUkxHZXRGU1JlZj0KLU9TX0NGVVJMR2V0RlNSZWZfMD1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMR2V0RlNSZWZfMT1jYXN0PShzdHJ1Y3QgRlNSZWYgKikKLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQ9ZmxhZ3M9bm9fZ2VuCi1PU19DR0FmZmluZVRyYW5zZm9ybUNvbmNhdF8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXRfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtQ29uY2F0XzI9Ci0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0PWZsYWdzPW5vX2dlbgotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnRfMD0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0XzE9Ci0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlXzE9Ci1PU19DR0FmZmluZVRyYW5zZm9ybU1ha2VfMj0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV8zPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlXzQ9Ci1PU19DR0FmZmluZVRyYW5zZm9ybU1ha2VfNT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV82PQotCi1PU19DR0FmZmluZVRyYW5zZm9ybVJvdGF0ZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtUm90YXRlXzA9Ci1PU19DR0FmZmluZVRyYW5zZm9ybVJvdGF0ZV8xPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Sb3RhdGVfMj0KLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1TY2FsZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMD0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMj0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMz0KLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGU9ZmxhZ3M9bm9fZ2VuCi1PU19DR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZV8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGVfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtVHJhbnNsYXRlXzI9Ci1PU19DR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZV8zPQotCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGU9Ci1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMD1jYXN0PSh2b2lkICopCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMT1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMj1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMz1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfND1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfNT1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfNj1jYXN0PShDR0ltYWdlQWxwaGFJbmZvKQotCi1PU19DR0NvbG9yQ3JlYXRlPQotT1NfQ0dDb2xvckNyZWF0ZV8wPWNhc3Q9KENHQ29sb3JTcGFjZVJlZikKLU9TX0NHQ29sb3JDcmVhdGVfMT0KLQotT1NfQ0dDb2xvclJlbGVhc2U9Ci1PU19DR0NvbG9yUmVsZWFzZV8wPWNhc3Q9Q0dDb2xvclJlZgotCi1PU19DR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0I9Ci0KLU9TX0NHQ29sb3JTcGFjZUNyZWF0ZVBhdHRlcm49Ci1PU19DR0NvbG9yU3BhY2VDcmVhdGVQYXR0ZXJuXzA9Y2FzdD1DR0NvbG9yU3BhY2VSZWYKLQotT1NfQ0dDb2xvclNwYWNlUmVsZWFzZT0KLU9TX0NHQ29sb3JTcGFjZVJlbGVhc2VfMD1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi0KLU9TX0NHQ29udGV4dEFkZEFyYz0KLU9TX0NHQ29udGV4dEFkZEFyY18wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZEFyY18xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0QWRkQXJjXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRBZGRBcmNfMz1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dEFkZEFyY180PWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0QWRkQXJjXzU9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRBZGRBcmNfNj1jYXN0PShCb29sZWFuKQotCi1PU19DR0NvbnRleHRBZGRBcmNUb1BvaW50PQotT1NfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMT0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMj0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMz0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfND0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfNT0KLQotT1NfQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQ9Ci1PU19DR0NvbnRleHRBZGRMaW5lVG9Qb2ludF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZExpbmVUb1BvaW50XzE9Ci1PU19DR0NvbnRleHRBZGRMaW5lVG9Qb2ludF8yPQotCi1PU19DR0NvbnRleHRBZGRMaW5lcz0KLU9TX0NHQ29udGV4dEFkZExpbmVzXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0QWRkTGluZXNfMT1jYXN0PShjb25zdCBDR1BvaW50ICopCi1PU19DR0NvbnRleHRBZGRMaW5lc18yPWNhc3Q9KHNpemVfdCkKLQotT1NfQ0dDb250ZXh0QWRkUGF0aD0KLU9TX0NHQ29udGV4dEFkZFBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRBZGRQYXRoXzE9Y2FzdD1DR1BhdGhSZWYKLQotT1NfQ0dDb250ZXh0QmVnaW5QYXRoPQotT1NfQ0dDb250ZXh0QmVnaW5QYXRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRDbGVhclJlY3Q9Ci1PU19DR0NvbnRleHRDbGVhclJlY3RfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRDbGVhclJlY3RfMT1jYXN0PShDR1JlY3QgKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dENsaXA9Ci1PU19DR0NvbnRleHRDbGlwXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRDbG9zZVBhdGg9Ci1PU19DR0NvbnRleHRDbG9zZVBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dENvbmNhdENUTT0KLU9TX0NHQ29udGV4dENvbmNhdENUTV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dENvbmNhdENUTV8xPWNhc3Q9KENHQWZmaW5lVHJhbnNmb3JtICopLGZsYWdzPXN0cnVjdAotCi1PU19DR0NvbnRleHREcmF3SW1hZ2U9Ci1PU19DR0NvbnRleHREcmF3SW1hZ2VfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHREcmF3SW1hZ2VfMT1jYXN0PShDR1JlY3QgKiksZmxhZ3M9c3RydWN0Ci1PU19DR0NvbnRleHREcmF3SW1hZ2VfMj1jYXN0PShDR0ltYWdlUmVmKQotCi1PU19DR0NvbnRleHREcmF3U2hhZGluZz0KLU9TX0NHQ29udGV4dERyYXdTaGFkaW5nXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0RHJhd1NoYWRpbmdfMT1jYXN0PUNHU2hhZGluZ1JlZgotCi1PU19DR0NvbnRleHRFT0NsaXA9Ci1PU19DR0NvbnRleHRFT0NsaXBfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEVPRmlsbFBhdGg9Ci1PU19DR0NvbnRleHRFT0ZpbGxQYXRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRGaWxsUGF0aD0KLU9TX0NHQ29udGV4dEZpbGxQYXRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRGaWxsUmVjdD0KLU9TX0NHQ29udGV4dEZpbGxSZWN0XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0RmlsbFJlY3RfMT1jYXN0PShDR1JlY3QgKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dEZsdXNoPQotT1NfQ0dDb250ZXh0Rmx1c2hfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEdldENUTT1mbGFncz1ub19nZW4KLU9TX0NHQ29udGV4dEdldENUTV8wPQotT1NfQ0dDb250ZXh0R2V0Q1RNXzE9Ci0KLU9TX0NHQ29udGV4dEdldEludGVycG9sYXRpb25RdWFsaXR5PQotT1NfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHlfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveD1mbGFncz1ub19nZW4KLU9TX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveF8xPQotCi1PU19DR0NvbnRleHRHZXRUZXh0UG9zaXRpb249ZmxhZ3M9bm9fZ2VuCi1PU19DR0NvbnRleHRHZXRUZXh0UG9zaXRpb25fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRHZXRUZXh0UG9zaXRpb25fMT1jYXN0PShDR1BvaW50KQotCi1PU19DR0NvbnRleHRNb3ZlVG9Qb2ludD0KLU9TX0NHQ29udGV4dE1vdmVUb1BvaW50XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0TW92ZVRvUG9pbnRfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dE1vdmVUb1BvaW50XzI9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFJlbGVhc2U9Ci1PU19DR0NvbnRleHRSZWxlYXNlXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRSZXN0b3JlR1N0YXRlPQotT1NfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0U2F2ZUdTdGF0ZT0KLU9TX0NHQ29udGV4dFNhdmVHU3RhdGVfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dFNjYWxlQ1RNPQotT1NfQ0dDb250ZXh0U2NhbGVDVE1fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTY2FsZUNUTV8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2NhbGVDVE1fMj1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udD0KLU9TX0NHQ29udGV4dFNlbGVjdEZvbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZWxlY3RGb250XzE9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udF8yPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udF8zPWNhc3Q9KENHVGV4dEVuY29kaW5nKQotCi1PU19DR0NvbnRleHRTZXRBbHBoYT0KLU9TX0NHQ29udGV4dFNldEFscGhhXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0QWxwaGFfMT0KLQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yPQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yXzE9Y2FzdD0oY29uc3QgZmxvYXQgKikKLQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yU3BhY2U9Ci1PU19DR0NvbnRleHRTZXRGaWxsQ29sb3JTcGFjZV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldEZpbGxDb2xvclNwYWNlXzE9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotCi1PU19DR0NvbnRleHRTZXRGaWxsUGF0dGVybj0KLU9TX0NHQ29udGV4dFNldEZpbGxQYXR0ZXJuXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0RmlsbFBhdHRlcm5fMT1jYXN0PUNHUGF0dGVyblJlZgotT1NfQ0dDb250ZXh0U2V0RmlsbFBhdHRlcm5fMj0KLQotT1NfQ0dDb250ZXh0U2V0Rm9udD0KLU9TX0NHQ29udGV4dFNldEZvbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRGb250XzE9Y2FzdD0oQ0dGb250UmVmKQotCi1PU19DR0NvbnRleHRTZXRGb250U2l6ZT0KLU9TX0NHQ29udGV4dFNldEZvbnRTaXplXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0Rm9udFNpemVfMT1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHk9Ci1PU19DR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5XzE9Ci0KLU9TX0NHQ29udGV4dFNldExpbmVDYXA9Ci1PU19DR0NvbnRleHRTZXRMaW5lQ2FwXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZUNhcF8xPQotCi1PU19DR0NvbnRleHRTZXRMaW5lRGFzaD0KLU9TX0NHQ29udGV4dFNldExpbmVEYXNoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZURhc2hfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldExpbmVEYXNoXzI9Y2FzdD0oY29uc3QgZmxvYXQgKikKLU9TX0NHQ29udGV4dFNldExpbmVEYXNoXzM9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTZXRMaW5lSm9pbj0KLU9TX0NHQ29udGV4dFNldExpbmVKb2luXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZUpvaW5fMT0KLQotT1NfQ0dDb250ZXh0U2V0TGluZVdpZHRoPQotT1NfQ0dDb250ZXh0U2V0TGluZVdpZHRoXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0TGluZVdpZHRoXzE9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcj0KLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3JfMz1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl80PWNhc3Q9KGZsb2F0KQotCi1PU19DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcj0KLU9TX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3JfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcl8zPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3JfND1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50PQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50XzE9Ci0KLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcz0KLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc18wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc18xPQotCi1PU19DR0NvbnRleHRTZXRTaG91bGRTbW9vdGhGb250cz0KLU9TX0NHQ29udGV4dFNldFNob3VsZFNtb290aEZvbnRzXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0U2hvdWxkU21vb3RoRm9udHNfMT0KLQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlQ29sb3I9Ci1PU19DR0NvbnRleHRTZXRTdHJva2VDb2xvcl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFN0cm9rZUNvbG9yXzE9Y2FzdD0oY29uc3QgZmxvYXQgKikKLQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlQ29sb3JTcGFjZT0KLU9TX0NHQ29udGV4dFNldFN0cm9rZUNvbG9yU3BhY2VfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRTdHJva2VDb2xvclNwYWNlXzE9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotCi1PU19DR0NvbnRleHRTZXRTdHJva2VQYXR0ZXJuPQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlUGF0dGVybl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFN0cm9rZVBhdHRlcm5fMT1jYXN0PUNHUGF0dGVyblJlZgotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlUGF0dGVybl8yPQotCi1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGU9Ci1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGVfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGVfMT1jYXN0PShDR1RleHREcmF3aW5nTW9kZSkKLQotT1NfQ0dDb250ZXh0U2V0VGV4dE1hdHJpeD0KLU9TX0NHQ29udGV4dFNldFRleHRNYXRyaXhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRUZXh0TWF0cml4XzE9Y2FzdD0oQ0dBZmZpbmVUcmFuc2Zvcm0gKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbj0KLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbl8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uXzI9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFNob3dUZXh0PQotT1NfQ0dDb250ZXh0U2hvd1RleHRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTaG93VGV4dF8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX0NHQ29udGV4dFNob3dUZXh0XzI9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQ9Ci1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnRfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNob3dUZXh0QXRQb2ludF8yPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50XzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50XzQ9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTdHJva2VQYXRoPQotT1NfQ0dDb250ZXh0U3Ryb2tlUGF0aF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0U3Ryb2tlUmVjdD0KLU9TX0NHQ29udGV4dFN0cm9rZVJlY3RfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTdHJva2VSZWN0XzE9Y2FzdD0oQ0dSZWN0ICopLGZsYWdzPXN0cnVjdAotCi1PU19DR0NvbnRleHRTeW5jaHJvbml6ZT0KLU9TX0NHQ29udGV4dFN5bmNocm9uaXplXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE09Ci1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE1fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE1fMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFRyYW5zbGF0ZUNUTV8yPWNhc3Q9KGZsb2F0KQotCi1PU19DR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhPQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YV8wPWNhc3Q9KHZvaWQgKikKLU9TX0NHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGFfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19DR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhXzI9Y2FzdD0oc2l6ZV90KQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YV8zPWNhc3Q9KHZvaWQgKikKLQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoVVJMPQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoVVJMXzA9Y2FzdD1DRlVSTFJlZgotCi1PU19DR0RhdGFQcm92aWRlclJlbGVhc2U9Ci1PU19DR0RhdGFQcm92aWRlclJlbGVhc2VfMD1jYXN0PShDR0RhdGFQcm92aWRlclJlZikKLQotT1NfQ0dEaXNwbGF5QmFzZUFkZHJlc3M9Ci1PU19DR0Rpc3BsYXlCYXNlQWRkcmVzc18wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWw9Ci1PU19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWxfMD1jYXN0PShDR0RpcmVjdERpc3BsYXlJRCkKLQotT1NfQ0dEaXNwbGF5Qml0c1BlclNhbXBsZT0KLU9TX0NHRGlzcGxheUJpdHNQZXJTYW1wbGVfMD1jYXN0PShDR0RpcmVjdERpc3BsYXlJRCkKLQotT1NfQ0dEaXNwbGF5Qnl0ZXNQZXJSb3c9Ci1PU19DR0Rpc3BsYXlCeXRlc1BlclJvd18wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlQaXhlbHNIaWdoPQotT1NfQ0dEaXNwbGF5UGl4ZWxzSGlnaF8wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlQaXhlbHNXaWRlPQotT1NfQ0dEaXNwbGF5UGl4ZWxzV2lkZV8wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0ZvbnRDcmVhdGVXaXRoUGxhdGZvcm1Gb250PQotT1NfQ0dGb250Q3JlYXRlV2l0aFBsYXRmb3JtRm9udF8wPQotCi1PU19DR0ZvbnRSZWxlYXNlPQotT1NfQ0dGb250UmVsZWFzZV8wPWNhc3Q9KENHRm9udFJlZikKLQotT1NfQ0dGdW5jdGlvbkNyZWF0ZT0KLU9TX0NHRnVuY3Rpb25DcmVhdGVfMD1jYXN0PXZvaWQgKgotT1NfQ0dGdW5jdGlvbkNyZWF0ZV8xPWNhc3Q9c2l6ZV90Ci1PU19DR0Z1bmN0aW9uQ3JlYXRlXzI9Y2FzdD1jb25zdCBmbG9hdCAqCi1PU19DR0Z1bmN0aW9uQ3JlYXRlXzM9Y2FzdD1zaXplX3QKLU9TX0NHRnVuY3Rpb25DcmVhdGVfND1jYXN0PWNvbnN0IGZsb2F0ICoKLU9TX0NHRnVuY3Rpb25DcmVhdGVfNT1jYXN0PWNvbnN0IENHRnVuY3Rpb25DYWxsYmFja3MgKgotCi1PU19DR0Z1bmN0aW9uUmVsZWFzZT0KLU9TX0NHRnVuY3Rpb25SZWxlYXNlXzA9Y2FzdD1DR0Z1bmN0aW9uUmVmCi0KLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdD0KLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdF8wPWZsYWdzPXN0cnVjdAotT1NfQ0dHZXREaXNwbGF5c1dpdGhSZWN0XzE9Y2FzdD1DR0Rpc3BsYXlDb3VudAotT1NfQ0dHZXREaXNwbGF5c1dpdGhSZWN0XzI9Y2FzdD0oQ0dEaXJlY3REaXNwbGF5SUQgKikKLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdF8zPWNhc3Q9Q0dEaXNwbGF5Q291bnQgKgotCi1PU19DR0ltYWdlQ3JlYXRlPQotT1NfQ0dJbWFnZUNyZWF0ZV8wPWNhc3Q9KHNpemVfdCkKLU9TX0NHSW1hZ2VDcmVhdGVfMT1jYXN0PShzaXplX3QpCi1PU19DR0ltYWdlQ3JlYXRlXzI9Y2FzdD0oc2l6ZV90KQotT1NfQ0dJbWFnZUNyZWF0ZV8zPWNhc3Q9KHNpemVfdCkKLU9TX0NHSW1hZ2VDcmVhdGVfND1jYXN0PShzaXplX3QpCi1PU19DR0ltYWdlQ3JlYXRlXzU9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotT1NfQ0dJbWFnZUNyZWF0ZV82PWNhc3Q9KENHSW1hZ2VBbHBoYUluZm8pCi1PU19DR0ltYWdlQ3JlYXRlXzc9Y2FzdD0oQ0dEYXRhUHJvdmlkZXJSZWYpCi1PU19DR0ltYWdlQ3JlYXRlXzg9Y2FzdD0oY29uc3QgZmxvYXQgKikKLU9TX0NHSW1hZ2VDcmVhdGVfOT1jYXN0PShCb29sZWFuKQotT1NfQ0dJbWFnZUNyZWF0ZV8xMD1jYXN0PShDR0NvbG9yUmVuZGVyaW5nSW50ZW50KQotCi1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXI9Ci1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXJfMD1jYXN0PUNHRGF0YVByb3ZpZGVyUmVmCi1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXJfMT0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoSlBFR0RhdGFQcm92aWRlcl8yPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhKUEVHRGF0YVByb3ZpZGVyXzM9Ci0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoUE5HRGF0YVByb3ZpZGVyPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhQTkdEYXRhUHJvdmlkZXJfMD1jYXN0PUNHRGF0YVByb3ZpZGVyUmVmCi1PU19DR0ltYWdlQ3JlYXRlV2l0aFBOR0RhdGFQcm92aWRlcl8xPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhQTkdEYXRhUHJvdmlkZXJfMj0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoUE5HRGF0YVByb3ZpZGVyXzM9Ci0KLU9TX0NHSW1hZ2VHZXRBbHBoYUluZm89Ci1PU19DR0ltYWdlR2V0QWxwaGFJbmZvXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldEJpdHNQZXJDb21wb25lbnQ9Ci1PU19DR0ltYWdlR2V0Qml0c1BlckNvbXBvbmVudF8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRCaXRzUGVyUGl4ZWw9Ci1PU19DR0ltYWdlR2V0Qml0c1BlclBpeGVsXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldEJ5dGVzUGVyUm93PQotT1NfQ0dJbWFnZUdldEJ5dGVzUGVyUm93XzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldENvbG9yU3BhY2U9Ci1PU19DR0ltYWdlR2V0Q29sb3JTcGFjZV8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRIZWlnaHQ9Ci1PU19DR0ltYWdlR2V0SGVpZ2h0XzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZUdldFdpZHRoPQotT1NfQ0dJbWFnZUdldFdpZHRoXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfQ0dJbWFnZVJlbGVhc2U9Ci1PU19DR0ltYWdlUmVsZWFzZV8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHUGF0aEFkZEFyYz0KLU9TX0NHUGF0aEFkZEFyY18wPWNhc3Q9Q0dNdXRhYmxlUGF0aFJlZgotT1NfQ0dQYXRoQWRkQXJjXzE9Y2FzdD0oY29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKikKLU9TX0NHUGF0aEFkZEFyY18yPQotT1NfQ0dQYXRoQWRkQXJjXzM9Ci1PU19DR1BhdGhBZGRBcmNfND0KLU9TX0NHUGF0aEFkZEFyY181PQotT1NfQ0dQYXRoQWRkQXJjXzY9Ci1PU19DR1BhdGhBZGRBcmNfNz0KLQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50PQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50XzA9Y2FzdD0oQ0dNdXRhYmxlUGF0aFJlZikKLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF8xPWNhc3Q9KGNvbnN0IENHQWZmaW5lVHJhbnNmb3JtICopCi1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfMj0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF8zPQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50XzQ9Ci1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfNT0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF82PQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50Xzc9Ci0KLU9TX0NHUGF0aEFkZExpbmVUb1BvaW50PQotT1NfQ0dQYXRoQWRkTGluZVRvUG9pbnRfMD1jYXN0PUNHTXV0YWJsZVBhdGhSZWYKLU9TX0NHUGF0aEFkZExpbmVUb1BvaW50XzE9Y2FzdD1jb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqCi1PU19DR1BhdGhBZGRMaW5lVG9Qb2ludF8yPQotT1NfQ0dQYXRoQWRkTGluZVRvUG9pbnRfMz0KLQotT1NfQ0dQYXRoQWRkUGF0aD0KLU9TX0NHUGF0aEFkZFBhdGhfMD1jYXN0PShDR011dGFibGVQYXRoUmVmKQotT1NfQ0dQYXRoQWRkUGF0aF8xPWNhc3Q9Y29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKgotT1NfQ0dQYXRoQWRkUGF0aF8yPWNhc3Q9Q0dQYXRoUmVmCi0KLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnQ9Ci1PU19DR1BhdGhBZGRRdWFkQ3VydmVUb1BvaW50XzA9Y2FzdD0oQ0dNdXRhYmxlUGF0aFJlZikKLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnRfMT1jYXN0PShjb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqKQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF8yPQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF8zPQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF80PQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF81PQotCi1PU19DR1BhdGhBZGRSZWN0PQotT1NfQ0dQYXRoQWRkUmVjdF8wPWNhc3Q9KENHTXV0YWJsZVBhdGhSZWYpCi1PU19DR1BhdGhBZGRSZWN0XzE9Y2FzdD1jb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqCi1PU19DR1BhdGhBZGRSZWN0XzI9ZmxhZ3M9c3RydWN0Ci0KLU9TX0NHUGF0aEFwcGx5PQotT1NfQ0dQYXRoQXBwbHlfMD1jYXN0PUNHUGF0aFJlZgotT1NfQ0dQYXRoQXBwbHlfMT1jYXN0PXZvaWQgKgotT1NfQ0dQYXRoQXBwbHlfMj1jYXN0PUNHUGF0aEFwcGxpZXJGdW5jdGlvbgotCi1PU19DR1BhdGhDbG9zZVN1YnBhdGg9Ci1PU19DR1BhdGhDbG9zZVN1YnBhdGhfMD1jYXN0PShDR011dGFibGVQYXRoUmVmKQotCi1PU19DR1BhdGhDcmVhdGVNdXRhYmxlPQotCi1PU19DR1BhdGhHZXRCb3VuZGluZ0JveD1mbGFncz1ub19nZW4KLU9TX0NHUGF0aEdldEJvdW5kaW5nQm94XzA9Y2FzdD1DR1BhdGhSZWYKLU9TX0NHUGF0aEdldEJvdW5kaW5nQm94XzE9Ci0KLU9TX0NHUGF0aEdldEN1cnJlbnRQb2ludD1mbGFncz1ub19nZW4KLU9TX0NHUGF0aEdldEN1cnJlbnRQb2ludF8wPWNhc3Q9Q0dQYXRoUmVmCi1PU19DR1BhdGhHZXRDdXJyZW50UG9pbnRfMT0KLQotT1NfQ0dQYXRoSXNFbXB0eT0KLU9TX0NHUGF0aElzRW1wdHlfMD1jYXN0PUNHUGF0aFJlZgotCi1PU19DR1BhdGhNb3ZlVG9Qb2ludD0KLU9TX0NHUGF0aE1vdmVUb1BvaW50XzA9Y2FzdD1DR011dGFibGVQYXRoUmVmCi1PU19DR1BhdGhNb3ZlVG9Qb2ludF8xPWNhc3Q9Y29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKgotT1NfQ0dQYXRoTW92ZVRvUG9pbnRfMj0KLU9TX0NHUGF0aE1vdmVUb1BvaW50XzM9Ci0KLU9TX0NHUGF0aFJlbGVhc2U9Ci1PU19DR1BhdGhSZWxlYXNlXzA9Y2FzdD1DR1BhdGhSZWYKLQotT1NfQ0dQYXR0ZXJuQ3JlYXRlPQotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzA9Y2FzdD12b2lkICoKLU9TX0NHUGF0dGVybkNyZWF0ZV8xPWZsYWdzPXN0cnVjdAotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzI9Y2FzdD1DR0FmZmluZVRyYW5zZm9ybSAqLGZsYWdzPXN0cnVjdAotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzM9Ci1PU19DR1BhdHRlcm5DcmVhdGVfND0KLU9TX0NHUGF0dGVybkNyZWF0ZV81PWNhc3Q9Q0dQYXR0ZXJuVGlsaW5nCi1PU19DR1BhdHRlcm5DcmVhdGVfNj0KLU9TX0NHUGF0dGVybkNyZWF0ZV83PWNhc3Q9KGNvbnN0IENHUGF0dGVybkNhbGxiYWNrcyAqKQotCi1PU19DR1BhdHRlcm5SZWxlYXNlPQotT1NfQ0dQYXR0ZXJuUmVsZWFzZV8wPWNhc3Q9Q0dQYXR0ZXJuUmVmCi0KLU9TX0NHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybT1mbGFncz1ub19nZW4KLU9TX0NHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybV8wPQotT1NfQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtXzE9Ci1PU19DR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm1fMj0KLQotT1NfQ0dQb3N0S2V5Ym9hcmRFdmVudD0KLU9TX0NHUG9zdEtleWJvYXJkRXZlbnRfMD1jYXN0PShDR0NoYXJDb2RlKQotT1NfQ0dQb3N0S2V5Ym9hcmRFdmVudF8xPWNhc3Q9Q0dLZXlDb2RlCi1PU19DR1Bvc3RLZXlib2FyZEV2ZW50XzI9Y2FzdD1ib29sZWFuX3QKLQotT1NfQ0dQb3N0TW91c2VFdmVudD0KLU9TX0NHUG9zdE1vdXNlRXZlbnRfMD1mbGFncz1zdHJ1Y3QKLU9TX0NHUG9zdE1vdXNlRXZlbnRfMT1jYXN0PWJvb2xlYW5fdAotT1NfQ0dQb3N0TW91c2VFdmVudF8yPQotT1NfQ0dQb3N0TW91c2VFdmVudF8zPWNhc3Q9Ym9vbGVhbl90Ci1PU19DR1Bvc3RNb3VzZUV2ZW50XzQ9Y2FzdD1ib29sZWFuX3QKLU9TX0NHUG9zdE1vdXNlRXZlbnRfNT1jYXN0PWJvb2xlYW5fdAotCi1PU19DR1JlY3RDb250YWluc1BvaW50PQotT1NfQ0dSZWN0Q29udGFpbnNQb2ludF8wPWZsYWdzPXN0cnVjdAotT1NfQ0dSZWN0Q29udGFpbnNQb2ludF8xPWZsYWdzPXN0cnVjdAotCi1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbD0KLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzA9Y2FzdD1DR0NvbG9yU3BhY2VSZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzE9ZmxhZ3M9c3RydWN0Ci1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbF8yPWZsYWdzPXN0cnVjdAotT1NfQ0dTaGFkaW5nQ3JlYXRlQXhpYWxfMz1jYXN0PUNHRnVuY3Rpb25SZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzQ9Ci1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbF81PQotCi1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWw9Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfMD1jYXN0PUNHQ29sb3JTcGFjZVJlZgotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzE9ZmxhZ3M9c3RydWN0Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfMj0KLU9TX0NHU2hhZGluZ0NyZWF0ZVJhZGlhbF8zPWZsYWdzPXN0cnVjdAotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzQ9Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfNT1jYXN0PUNHRnVuY3Rpb25SZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZVJhZGlhbF82PQotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzc9Ci0KLU9TX0NHU2hhZGluZ1JlbGVhc2U9Ci1PU19DR1NoYWRpbmdSZWxlYXNlXzA9Y2FzdD1DR1NoYWRpbmdSZWYKLQotT1NfQ0dXYXJwTW91c2VDdXJzb3JQb3NpdGlvbj0KLU9TX0NHV2FycE1vdXNlQ3Vyc29yUG9zaXRpb25fMD1mbGFncz1zdHJ1Y3QKLQotT1NfQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbj0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMD0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMT0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMj0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMz0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fND0KLQotT1NfQ1BTU2V0UHJvY2Vzc05hbWU9Ci1PU19DUFNTZXRQcm9jZXNzTmFtZV8wPQotT1NfQ1BTU2V0UHJvY2Vzc05hbWVfMT0KLQotT1NfQ2FsY01lbnVTaXplPQotT1NfQ2FsY01lbnVTaXplXzA9Y2FzdD1NZW51UmVmCi0KLU9TX0NhbGxOZXh0RXZlbnRIYW5kbGVyPQotT1NfQ2FsbE5leHRFdmVudEhhbmRsZXJfMD1jYXN0PShFdmVudEhhbmRsZXJDYWxsUmVmKQotT1NfQ2FsbE5leHRFdmVudEhhbmRsZXJfMT1jYXN0PShFdmVudFJlZikKLQotT1NfQ2FuY2VsTWVudVRyYWNraW5nPQotT1NfQ2FuY2VsTWVudVRyYWNraW5nXzA9Y2FzdD1NZW51UmVmCi1PU19DYW5jZWxNZW51VHJhY2tpbmdfMT0KLU9TX0NhbmNlbE1lbnVUcmFja2luZ18yPQotCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzPQotT1NfQ2hhbmdlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9V2luZG93UmVmCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzE9Y2FzdD1XaW5kb3dBdHRyaWJ1dGVzCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzI9Y2FzdD1XaW5kb3dBdHRyaWJ1dGVzCi0KLU9TX0NoYXJXaWR0aD0KLU9TX0NoYXJXaWR0aF8wPWNhc3Q9KENoYXJQYXJhbWV0ZXIpCi0KLU9TX0NsZWFyQ3VycmVudFNjcmFwPQotCi1PU19DbGVhcktleWJvYXJkRm9jdXM9Ci1PU19DbGVhcktleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0NsZWFyTWVudUJhcj0KLQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uPQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyPQotT1NfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX0Nsb3NlUG9seT0KLQotT1NfQ2xvc2VSZ249Ci1PU19DbG9zZVJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfQ29sbGFwc2VXaW5kb3c9Ci1PU19Db2xsYXBzZVdpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NvbGxhcHNlV2luZG93XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZD0KLU9TX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmRfMD1jYXN0PShFdmVudFJlZikKLU9TX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmRfMT1jYXN0PShFdmVudFJlY29yZCAqKQotCi1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGU9Ci1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGVfMD1jYXN0PVRleHRUb1VuaWNvZGVJbmZvCi1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGVfMT1jYXN0PUNvbnN0U3RyMjU1UGFyYW0KLU9TX0NvbnZlcnRGcm9tUFN0cmluZ1RvVW5pY29kZV8yPQotT1NfQ29udmVydEZyb21QU3RyaW5nVG9Vbmljb2RlXzM9Y2FzdD1CeXRlQ291bnQgKgotT1NfQ29udmVydEZyb21QU3RyaW5nVG9Vbmljb2RlXzQ9Ci0KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZz0KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZ18wPWNhc3Q9VW5pY29kZVRvVGV4dEluZm8KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZ18xPQotT1NfQ29udmVydEZyb21Vbmljb2RlVG9QU3RyaW5nXzI9Y2FzdD1Db25zdFVuaUNoYXJBcnJheVB0cgotT1NfQ29udmVydEZyb21Vbmljb2RlVG9QU3RyaW5nXzM9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotCi1PU19Db3B5Qml0cz0KLU9TX0NvcHlCaXRzXzA9Y2FzdD0oY29uc3QgQml0TWFwICopCi1PU19Db3B5Qml0c18xPWNhc3Q9KGNvbnN0IEJpdE1hcCAqKQotT1NfQ29weUJpdHNfMj1jYXN0PShjb25zdCBSZWN0ICopCi1PU19Db3B5Qml0c18zPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlCaXRzXzQ9Y2FzdD0oc2hvcnQpCi1PU19Db3B5Qml0c181PWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmc9Ci1PU19Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZ18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0NvcHlEZWVwTWFzaz0KLU9TX0NvcHlEZWVwTWFza18wPWNhc3Q9KGNvbnN0IEJpdE1hcCAqKQotT1NfQ29weURlZXBNYXNrXzE9Y2FzdD0oY29uc3QgQml0TWFwICopCi1PU19Db3B5RGVlcE1hc2tfMj1jYXN0PShjb25zdCBCaXRNYXAgKikKLU9TX0NvcHlEZWVwTWFza18zPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlEZWVwTWFza180PWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlEZWVwTWFza181PWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlEZWVwTWFza182PWNhc3Q9KHNob3J0KQotT1NfQ29weURlZXBNYXNrXzc9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19Db3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZz0KLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nXzA9Y2FzdD0oTWVudVJlZikKLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nXzI9Y2FzdD0oQ0ZTdHJpbmdSZWYgKikKLQotT1NfQ29weVJnbj0KLU9TX0NvcHlSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19Db3B5UmduXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19Db3VudERyYWdJdGVtRmxhdm9ycz0KLU9TX0NvdW50RHJhZ0l0ZW1GbGF2b3JzXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0NvdW50RHJhZ0l0ZW1GbGF2b3JzXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19Db3VudERyYWdJdGVtRmxhdm9yc18yPWNhc3Q9KFVJbnQxNiAqKQotCi1PU19Db3VudERyYWdJdGVtcz0KLU9TX0NvdW50RHJhZ0l0ZW1zXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0NvdW50RHJhZ0l0ZW1zXzE9Y2FzdD0oVUludDE2ICopCi0KLU9TX0NvdW50TWVudUl0ZW1zPQotT1NfQ291bnRNZW51SXRlbXNfMD1jYXN0PShNZW51UmVmKQotCi1PU19Db3VudFN1YkNvbnRyb2xzPQotT1NfQ291bnRTdWJDb250cm9sc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Db3VudFN1YkNvbnRyb2xzXzE9Y2FzdD0oVUludDE2ICopCi0KLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbD0KLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzM9Y2FzdD0oQ29udHJvbEJldmVsVGhpY2tuZXNzKQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzQ9Y2FzdD0oQ29udHJvbEJldmVsQnV0dG9uQmVoYXZpb3IpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfNT1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfNj1jYXN0PShTSW50MTYpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfNz1jYXN0PShDb250cm9sQmV2ZWxCdXR0b25NZW51QmVoYXZpb3IpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfOD1jYXN0PShDb250cm9sQmV2ZWxCdXR0b25NZW51UGxhY2VtZW50KQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzk9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVDR0NvbnRleHRGb3JQb3J0PQotT1NfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydF8xPWNhc3Q9KENHQ29udGV4dFJlZiAqKQotCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2w9Ci1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF8zPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF80PWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVDaGVja0JveENvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbD0KLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8yPWNhc3Q9KERhdGFCcm93c2VyVmlld1N0eWxlKQotT1NfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sPQotT1NfQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMT0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMz0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfND0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUV2ZW50PQotT1NfQ3JlYXRlRXZlbnRfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NyZWF0ZUV2ZW50XzE9Y2FzdD0oVUludDMyKQotT1NfQ3JlYXRlRXZlbnRfMj1jYXN0PShVSW50MzIpCi1PU19DcmVhdGVFdmVudF8zPWNhc3Q9KEV2ZW50VGltZSkKLU9TX0NyZWF0ZUV2ZW50XzQ9Y2FzdD0oRXZlbnRBdHRyaWJ1dGVzKQotT1NfQ3JlYXRlRXZlbnRfNT1jYXN0PShFdmVudFJlZiAqKQotCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2w9Ci1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUdyb3VwQm94Q29udHJvbF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfND1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUljb25Db250cm9sPQotT1NfQ3JlYXRlSWNvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVJY29uQ29udHJvbF8xPQotT1NfQ3JlYXRlSWNvbkNvbnRyb2xfMj0KLU9TX0NyZWF0ZUljb25Db250cm9sXzM9Ci1PU19DcmVhdGVJY29uQ29udHJvbF80PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbD0KLU9TX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2xfMD1jYXN0PVdpbmRvd1JlZgotT1NfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbF8xPWNhc3Q9Y29uc3QgUmVjdCAqCi1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzI9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzM9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzQ9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzU9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzY9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVOZXdNZW51PQotT1NfQ3JlYXRlTmV3TWVudV8wPWNhc3Q9KE1lbnVJRCkKLU9TX0NyZWF0ZU5ld01lbnVfMT1jYXN0PShNZW51QXR0cmlidXRlcykKLU9TX0NyZWF0ZU5ld01lbnVfMj1jYXN0PShNZW51UmVmICopCi0KLU9TX0NyZWF0ZU5ld1dpbmRvdz0KLU9TX0NyZWF0ZU5ld1dpbmRvd18wPWNhc3Q9KFdpbmRvd0NsYXNzKQotT1NfQ3JlYXRlTmV3V2luZG93XzE9Y2FzdD0oV2luZG93QXR0cmlidXRlcykKLU9TX0NyZWF0ZU5ld1dpbmRvd18yPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZU5ld1dpbmRvd18zPWNhc3Q9KFdpbmRvd1JlZiAqKQotCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbD0KLU9TX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbF8yPWNhc3Q9KENvbnRyb2xQb3B1cEFycm93T3JpZW50YXRpb24pCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbF8zPWNhc3Q9KENvbnRyb2xQb3B1cEFycm93U2l6ZSkKLU9TX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sXzQ9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfMT0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sXzM9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfND0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF81PQotT1NfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sXzY9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfNz0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF84PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sPQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzE9Ci1PU19DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2xfMj0KLU9TX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbF8zPQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzQ9Ci1PU19DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2xfNT0KLU9TX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbF82PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVQdXNoQnV0dG9uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sPQotT1NfQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMT0KLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMz1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm8gKikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfND1jYXN0PShDb250cm9sUHVzaEJ1dHRvbkljb25BbGlnbm1lbnQpCi1PU19DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sXzU9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbF8zPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbF80PWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZVJvb3RDb250cm9sPQotT1NfQ3JlYXRlUm9vdENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVSb290Q29udHJvbF8xPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbD0KLU9TX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzE9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzI9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzM9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzQ9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzU9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzY9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzc9Y2FzdD0oQ29udHJvbEFjdGlvblVQUCkKLU9TX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2xfOD1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2w9Ci1PU19DcmVhdGVTZXBhcmF0b3JDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbF8xPQotT1NfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbF8yPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbD0KLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF8yPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfMz1jYXN0PShTSW50MzIpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzQ9Y2FzdD0oU0ludDMyKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF81PWNhc3Q9KENvbnRyb2xTbGlkZXJPcmllbnRhdGlvbikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfNj1jYXN0PShVSW50MTYpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzc9Y2FzdD0oQm9vbGVhbikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfOD1jYXN0PShDb250cm9sQWN0aW9uVVBQKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF85PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU3RhbmRhcmRBbGVydD0KLU9TX0NyZWF0ZVN0YW5kYXJkQWxlcnRfMD1jYXN0PShBbGVydFR5cGUpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzM9Y2FzdD0oY29uc3QgQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWMgKikKLU9TX0NyZWF0ZVN0YW5kYXJkQWxlcnRfND1jYXN0PShEaWFsb2dSZWYgKikKLQotT1NfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2w9Ci1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVN0YXRpY1RleHRDb250cm9sXzE9Ci1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2xfMz1jYXN0PShjb25zdCBDb250cm9sRm9udFN0eWxlUmVjICopCi1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF80PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlVGFic0NvbnRyb2w9Ci1PU19DcmVhdGVUYWJzQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlVGFic0NvbnRyb2xfMj1jYXN0PShDb250cm9sVGFiU2l6ZSkKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzM9Y2FzdD0oQ29udHJvbFRhYkRpcmVjdGlvbikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzQ9Y2FzdD0oVUludDE2KQotT1NfQ3JlYXRlVGFic0NvbnRyb2xfNT1jYXN0PShjb25zdCBDb250cm9sVGFiRW50cnkgKikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzY9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2Rpbmc9Ci1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2RpbmdfMD1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2RpbmdfMT1jYXN0PShUZXh0VG9Vbmljb2RlSW5mbyAqKQotCi1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2Rpbmc9Ci1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2RpbmdfMD1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2RpbmdfMT1jYXN0PShVbmljb2RlVG9UZXh0SW5mbyAqKQotCi1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2w9Ci1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2xfMT0KLU9TX0NyZWF0ZVVzZXJQYW5lQ29udHJvbF8yPQotT1NfQ3JlYXRlVXNlclBhbmVDb250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVXaW5kb3dHcm91cD0KLU9TX0NyZWF0ZVdpbmRvd0dyb3VwXzA9Y2FzdD0oV2luZG93R3JvdXBBdHRyaWJ1dGVzKQotT1NfQ3JlYXRlV2luZG93R3JvdXBfMT1jYXN0PShXaW5kb3dHcm91cFJlZiAqKQotCi1PU19ETUdldEZpcnN0U2NyZWVuRGV2aWNlPQotT1NfRE1HZXRGaXJzdFNjcmVlbkRldmljZV8wPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX0RNR2V0TmV4dFNjcmVlbkRldmljZT0KLU9TX0RNR2V0TmV4dFNjcmVlbkRldmljZV8wPWNhc3Q9KEdESGFuZGxlKQotT1NfRE1HZXROZXh0U2NyZWVuRGV2aWNlXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlc18wPQotT1NfRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzXzE9Ci1PU19EYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXNfMj0KLQotT1NfRGF0YUJyb3dzZXJHZXRBdHRyaWJ1dGVzPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyR2V0QXR0cmlidXRlc18wPQotT1NfRGF0YUJyb3dzZXJHZXRBdHRyaWJ1dGVzXzE9Ci0KLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljXzA9Ci1PU19EYXRhQnJvd3NlckdldE1ldHJpY18xPQotT1NfRGF0YUJyb3dzZXJHZXRNZXRyaWNfMj0KLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljXzM9Ci0KLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljPWZsYWdzPWR5bmFtaWMKLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljXzA9Ci1PU19EYXRhQnJvd3NlclNldE1ldHJpY18xPQotT1NfRGF0YUJyb3dzZXJTZXRNZXRyaWNfMj0KLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljXzM9Ci0KLU9TX0RlbGV0ZUdsb2JhbFJlZj1mbGFncz1ub19nZW4KLU9TX0RlbGV0ZUdsb2JhbFJlZl8wPQotCi1PU19EZWxldGVNZW51PQotT1NfRGVsZXRlTWVudV8wPWNhc3Q9KE1lbnVJRCkKLQotT1NfRGVsZXRlTWVudUl0ZW09Ci1PU19EZWxldGVNZW51SXRlbV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19EZWxldGVNZW51SXRlbV8xPWNhc3Q9KHNob3J0KQotCi1PU19EZWxldGVNZW51SXRlbXM9Ci1PU19EZWxldGVNZW51SXRlbXNfMD1jYXN0PShNZW51UmVmKQotT1NfRGVsZXRlTWVudUl0ZW1zXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX0RlbGV0ZU1lbnVJdGVtc18yPWNhc3Q9KEl0ZW1Db3VudCkKLQotT1NfRGlmZlJnbj0KLU9TX0RpZmZSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19EaWZmUmduXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfRGlmZlJnbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfRGlzYWJsZUNvbnRyb2w9Ci1PU19EaXNhYmxlQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0Rpc2FibGVNZW51Q29tbWFuZD0KLU9TX0Rpc2FibGVNZW51Q29tbWFuZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19EaXNhYmxlTWVudUNvbW1hbmRfMT1jYXN0PShNZW51Q29tbWFuZCkKLQotT1NfRGlzYWJsZU1lbnVJdGVtPQotT1NfRGlzYWJsZU1lbnVJdGVtXzA9Y2FzdD0oTWVudVJlZikKLU9TX0Rpc2FibGVNZW51SXRlbV8xPWNhc3Q9KE1lbnVJdGVtSW5kZXgpCi0KLU9TX0Rpc3Bvc2VDb250cm9sPQotT1NfRGlzcG9zZUNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19EaXNwb3NlRHJhZz0KLU9TX0Rpc3Bvc2VEcmFnXzA9Y2FzdD0oRHJhZ1JlZikKLQotT1NfRGlzcG9zZUdXb3JsZD0KLU9TX0Rpc3Bvc2VHV29ybGRfMD1jYXN0PShHV29ybGRQdHIpCi0KLU9TX0Rpc3Bvc2VIYW5kbGU9Ci1PU19EaXNwb3NlSGFuZGxlXzA9Y2FzdD0oSGFuZGxlKQotCi1PU19EaXNwb3NlTWVudT0KLU9TX0Rpc3Bvc2VNZW51XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfRGlzcG9zZVB0cj0KLU9TX0Rpc3Bvc2VQdHJfMD1jYXN0PShQdHIpCi0KLU9TX0Rpc3Bvc2VSZ249Ci1PU19EaXNwb3NlUmduXzA9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19EaXNwb3NlVGV4dFRvVW5pY29kZUluZm89Ci1PU19EaXNwb3NlVGV4dFRvVW5pY29kZUluZm9fMD1jYXN0PVRleHRUb1VuaWNvZGVJbmZvICoKLQotT1NfRGlzcG9zZVVuaWNvZGVUb1RleHRJbmZvPQotT1NfRGlzcG9zZVVuaWNvZGVUb1RleHRJbmZvXzA9Y2FzdD1Vbmljb2RlVG9UZXh0SW5mbyAqCi0KLU9TX0Rpc3Bvc2VXaW5kb3c9Ci1PU19EaXNwb3NlV2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19EcmF3Q29udHJvbEluQ3VycmVudFBvcnQ9Ci1PU19EcmF3Q29udHJvbEluQ3VycmVudFBvcnRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19EcmF3TWVudUJhcj0KLQotT1NfRHJhd1RleHQ9Ci1PU19EcmF3VGV4dF8wPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX0RyYXdUZXh0XzE9Y2FzdD0oc2hvcnQpCi1PU19EcmF3VGV4dF8yPWNhc3Q9KHNob3J0KQotCi1PU19EcmF3VGhlbWVCdXR0b249Ci1PU19EcmF3VGhlbWVCdXR0b25fMD1jYXN0PShSZWN0ICopCi1PU19EcmF3VGhlbWVCdXR0b25fMT1jYXN0PShUaGVtZUJ1dHRvbktpbmQpCi1PU19EcmF3VGhlbWVCdXR0b25fMj1jYXN0PShjb25zdCBUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19EcmF3VGhlbWVCdXR0b25fMz1jYXN0PShjb25zdCBUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19EcmF3VGhlbWVCdXR0b25fND1jYXN0PShUaGVtZUVyYXNlVVBQKQotT1NfRHJhd1RoZW1lQnV0dG9uXzU9Y2FzdD0oVGhlbWVCdXR0b25EcmF3VVBQKQotT1NfRHJhd1RoZW1lQnV0dG9uXzY9Y2FzdD0oVUludDMyKQotCi1PU19EcmF3VGhlbWVFZGl0VGV4dEZyYW1lPQotT1NfRHJhd1RoZW1lRWRpdFRleHRGcmFtZV8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWVfMT1jYXN0PShUaGVtZURyYXdTdGF0ZSkKLQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0PQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0XzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfRHJhd1RoZW1lUG9wdXBBcnJvdz0KLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfMD0KLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfMT1jYXN0PVRoZW1lQXJyb3dPcmllbnRhdGlvbgotT1NfRHJhd1RoZW1lUG9wdXBBcnJvd18yPWNhc3Q9KFRoZW1lUG9wdXBBcnJvd1NpemUpCi1PU19EcmF3VGhlbWVQb3B1cEFycm93XzM9Y2FzdD0oVGhlbWVEcmF3U3RhdGUpCi1PU19EcmF3VGhlbWVQb3B1cEFycm93XzQ9Y2FzdD0oVGhlbWVFcmFzZVVQUCkKLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfNT1jYXN0PShVSW50MzIpCi0KLU9TX0RyYXdUaGVtZVNlcGFyYXRvcj0KLU9TX0RyYXdUaGVtZVNlcGFyYXRvcl8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0RyYXdUaGVtZVNlcGFyYXRvcl8xPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotCi1PU19EcmF3VGhlbWVUZXh0Qm94PQotT1NfRHJhd1RoZW1lVGV4dEJveF8wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfRHJhd1RoZW1lVGV4dEJveF8xPWNhc3Q9KFRoZW1lRm9udElEKQotT1NfRHJhd1RoZW1lVGV4dEJveF8yPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotT1NfRHJhd1RoZW1lVGV4dEJveF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19EcmF3VGhlbWVUZXh0Qm94XzQ9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfRHJhd1RoZW1lVGV4dEJveF81PWNhc3Q9KFNJbnQxNikKLU9TX0RyYXdUaGVtZVRleHRCb3hfNj1jYXN0PSh2b2lkICopCi0KLU9TX0VtYmVkQ29udHJvbD0KLU9TX0VtYmVkQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19FbWJlZENvbnRyb2xfMT1jYXN0PShDb250cm9sUmVmKQotCi1PU19FbXB0eVJlY3Q9Ci1PU19FbXB0eVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0VtcHR5UmduPQotT1NfRW1wdHlSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0VuYWJsZUNvbnRyb2w9Ci1PU19FbmFibGVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfRW5hYmxlTWVudUNvbW1hbmQ9Ci1PU19FbmFibGVNZW51Q29tbWFuZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19FbmFibGVNZW51Q29tbWFuZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19FbmFibGVNZW51SXRlbT0KLU9TX0VuYWJsZU1lbnVJdGVtXzA9Y2FzdD0oTWVudVJlZikKLU9TX0VuYWJsZU1lbnVJdGVtXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfRW5kVXBkYXRlPQotT1NfRW5kVXBkYXRlXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19FcXVhbFJlY3Q9Ci1PU19FcXVhbFJlY3RfMD0KLU9TX0VxdWFsUmVjdF8xPQotCi1PU19FcmFzZVJlY3Q9Ci1PU19FcmFzZVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0VyYXNlUmduPQotT1NfRXJhc2VSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0ZNQ3JlYXRlRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3I9Ci1PU19GTUNyZWF0ZUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yXzA9Y2FzdD0oRk1Gb250RmFtaWx5KQotT1NfRk1DcmVhdGVGb250RmFtaWx5SW5zdGFuY2VJdGVyYXRvcl8xPWNhc3Q9KEZNRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IgKikKLQotT1NfRk1DcmVhdGVGb250RmFtaWx5SXRlcmF0b3I9Ci1PU19GTUNyZWF0ZUZvbnRGYW1pbHlJdGVyYXRvcl8wPWNhc3Q9KGNvbnN0IEZNRmlsdGVyICopCi1PU19GTUNyZWF0ZUZvbnRGYW1pbHlJdGVyYXRvcl8xPWNhc3Q9KHZvaWQgKikKLU9TX0ZNQ3JlYXRlRm9udEZhbWlseUl0ZXJhdG9yXzI9Y2FzdD0oT3B0aW9uQml0cykKLU9TX0ZNQ3JlYXRlRm9udEZhbWlseUl0ZXJhdG9yXzM9Y2FzdD0oRk1Gb250RmFtaWx5SXRlcmF0b3IgKikKLQotT1NfRk1EaXNwb3NlRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3I9Ci1PU19GTURpc3Bvc2VGb250RmFtaWx5SW5zdGFuY2VJdGVyYXRvcl8wPWNhc3Q9KEZNRm9udEZhbWlseUluc3RhbmNlSXRlcmF0b3IgKikKLQotT1NfRk1EaXNwb3NlRm9udEZhbWlseUl0ZXJhdG9yPQotT1NfRk1EaXNwb3NlRm9udEZhbWlseUl0ZXJhdG9yXzA9Y2FzdD0oRk1Gb250RmFtaWx5SXRlcmF0b3IgKikKLQotT1NfRk1HZXRBVFNGb250UmVmRnJvbUZvbnQ9Ci1PU19GTUdldEFUU0ZvbnRSZWZGcm9tRm9udF8wPQotCi1PU19GTUdldEZvbnRGYW1pbHlGcm9tTmFtZT0KLU9TX0ZNR2V0Rm9udEZhbWlseUZyb21OYW1lXzA9Y2FzdD0oQ29uc3RTdHIyNTVQYXJhbSkKLQotT1NfRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udD0KLU9TX0ZNR2V0Rm9udEZhbWlseUluc3RhbmNlRnJvbUZvbnRfMD1jYXN0PUZNRm9udAotT1NfRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udF8xPWNhc3Q9Rk1Gb250RmFtaWx5ICoKLU9TX0ZNR2V0Rm9udEZhbWlseUluc3RhbmNlRnJvbUZvbnRfMj1jYXN0PUZNRm9udFN0eWxlICoKLQotT1NfRk1HZXRGb250RmFtaWx5TmFtZT0KLU9TX0ZNR2V0Rm9udEZhbWlseU5hbWVfMD1jYXN0PUZNRm9udEZhbWlseQotT1NfRk1HZXRGb250RmFtaWx5TmFtZV8xPWNhc3Q9KHVuc2lnbmVkIGNoYXIgKikKLQotT1NfRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZT0KLU9TX0ZNR2V0Rm9udEZyb21Gb250RmFtaWx5SW5zdGFuY2VfMD1jYXN0PShGTUZvbnRGYW1pbHkpCi1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzE9Y2FzdD0oRk1Gb250U3R5bGUpCi1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzI9Y2FzdD0oRk1Gb250ICopCi1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzM9Y2FzdD0oRk1Gb250U3R5bGUgKikKLQotT1NfRk1HZXROZXh0Rm9udEZhbWlseT0KLU9TX0ZNR2V0TmV4dEZvbnRGYW1pbHlfMD1jYXN0PShGTUZvbnRGYW1pbHlJdGVyYXRvciAqKQotT1NfRk1HZXROZXh0Rm9udEZhbWlseV8xPWNhc3Q9KEZNRm9udEZhbWlseSAqKQotCi1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2U9Ci1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2VfMD1jYXN0PShGTUZvbnRGYW1pbHlJbnN0YW5jZUl0ZXJhdG9yICopCi1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2VfMT1jYXN0PShGTUZvbnQgKikKLU9TX0ZNR2V0TmV4dEZvbnRGYW1pbHlJbnN0YW5jZV8yPWNhc3Q9KEZNRm9udFN0eWxlICopCi1PU19GTUdldE5leHRGb250RmFtaWx5SW5zdGFuY2VfMz1jYXN0PShGTUZvbnRTaXplICopCi0KLU9TX0ZQSXNGb250UGFuZWxWaXNpYmxlPQotCi1PU19GUFNob3dIaWRlRm9udFBhbmVsPQotCi1PU19GU0dldENhdGFsb2dJbmZvPQotT1NfRlNHZXRDYXRhbG9nSW5mb18wPWNhc3Q9KEZTUmVmICopCi1PU19GU0dldENhdGFsb2dJbmZvXzE9Y2FzdD0oRlNDYXRhbG9nSW5mb0JpdG1hcCkKLU9TX0ZTR2V0Q2F0YWxvZ0luZm9fMj1jYXN0PShGU0NhdGFsb2dJbmZvICopCi1PU19GU0dldENhdGFsb2dJbmZvXzM9Y2FzdD0oSEZTVW5pU3RyMjU1ICopCi1PU19GU0dldENhdGFsb2dJbmZvXzQ9Y2FzdD0oRlNTcGVjICopCi1PU19GU0dldENhdGFsb2dJbmZvXzU9Y2FzdD0oRlNSZWYgKikKLQotT1NfRlNwR2V0RkluZm89Ci1PU19GU3BHZXRGSW5mb18wPWNhc3Q9KEZTU3BlYyAqKQotT1NfRlNwR2V0RkluZm9fMT1jYXN0PShGSW5mbyAqKQotCi1PU19GU3BNYWtlRlNSZWY9Ci1PU19GU3BNYWtlRlNSZWZfMD1jYXN0PShjb25zdCBGU1NwZWMgKikKLU9TX0ZTcE1ha2VGU1JlZl8xPWNhc3Q9KEZTUmVmICopCi0KLU9TX0ZldGNoRm9udEluZm89Ci1PU19GZXRjaEZvbnRJbmZvXzA9Ci1PU19GZXRjaEZvbnRJbmZvXzE9Ci1PU19GZXRjaEZvbnRJbmZvXzI9Ci1PU19GZXRjaEZvbnRJbmZvXzM9Ci0KLU9TX0ZpbmRXaW5kb3c9Ci1PU19GaW5kV2luZG93XzA9Y2FzdD0oUG9pbnQgKiksZmxhZ3M9c3RydWN0Ci1PU19GaW5kV2luZG93XzE9Y2FzdD0oV2luZG93UmVmICopCi0KLU9TX0ZpeDJMb25nPQotT1NfRml4MkxvbmdfMD0KLQotT1NfRml4Mlg9Ci1PU19GaXgyWF8wPWNhc3Q9Rml4ZWQKLQotT1NfRnJhbWVPdmFsPQotT1NfRnJhbWVPdmFsXzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19GcmFtZVBvbHk9Ci1PU19GcmFtZVBvbHlfMD1jYXN0PShQb2x5SGFuZGxlKQotCi1PU19GcmFtZVJlY3Q9Ci1PU19GcmFtZVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0ZyYW1lUm91bmRSZWN0PQotT1NfRnJhbWVSb3VuZFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi1PU19GcmFtZVJvdW5kUmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfRnJhbWVSb3VuZFJlY3RfMj1jYXN0PShzaG9ydCkKLQotT1NfRnJvbnRXaW5kb3c9Ci0KLU9TX0dlc3RhbHQ9Ci1PU19HZXN0YWx0XzA9Y2FzdD1PU1R5cGUKLU9TX0dlc3RhbHRfMT1jYXN0PWxvbmcgKgotCi1PU19HZXRBcHBGb250PQotCi1PU19HZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0PQotCi1PU19HZXRBdmFpbGFibGVXaW5kb3dBdHRyaWJ1dGVzPQotT1NfR2V0QXZhaWxhYmxlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9KFdpbmRvd0NsYXNzKQotCi1PU19HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcz0KLU9TX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzXzA9Y2FzdD0oR0RIYW5kbGUpCi1PU19HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0QmVzdENvbnRyb2xSZWN0PQotT1NfR2V0QmVzdENvbnRyb2xSZWN0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldEJlc3RDb250cm9sUmVjdF8xPWNhc3Q9KFJlY3QgKikKLU9TX0dldEJlc3RDb250cm9sUmVjdF8yPWNhc3Q9KFNJbnQxNiAqKQotCi1PU19HZXRDYXJldFRpbWU9Ci0KLU9TX0dldENsaXA9Ci1PU19HZXRDbGlwXzA9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19HZXRDb250cm9sMzJCaXRNYXhpbXVtPQotT1NfR2V0Q29udHJvbDMyQml0TWF4aW11bV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2wzMkJpdE1pbmltdW09Ci1PU19HZXRDb250cm9sMzJCaXRNaW5pbXVtXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q29udHJvbDMyQml0VmFsdWU9Ci1PU19HZXRDb250cm9sMzJCaXRWYWx1ZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2xCb3VuZHM9Ci1PU19HZXRDb250cm9sQm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xCb3VuZHNfMT1jYXN0PShSZWN0ICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfMz1jYXN0PShTaXplKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfNT0KLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRm9udFN0eWxlUmVjXzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xGb250U3R5bGVSZWNfMl8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xGb250U3R5bGVSZWNfMl8zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRm9udFN0eWxlUmVjXzJfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJPQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV8zPWNhc3Q9KFNpemUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJXzU9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zST0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNCXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNCXzNJXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfMj1jYXN0PShSZXNUeXBlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfMz1jYXN0PShTaXplKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfND1jYXN0PSh2b2lkICopCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zSV81PWNhc3Q9KFNpemUgKikKLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zSV8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zSV8zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJPQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM1NfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM1NfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV8zPWNhc3Q9KFNpemUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJXzU9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRDb250cm9sRXZlbnRUYXJnZXQ9Ci1PU19HZXRDb250cm9sRXZlbnRUYXJnZXRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sRmVhdHVyZXM9Ci1PU19HZXRDb250cm9sRmVhdHVyZXNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbEZlYXR1cmVzXzE9Y2FzdD1VSW50MzIgKgotCi1PU19HZXRDb250cm9sS2luZD0KLU9TX0dldENvbnRyb2xLaW5kXzA9Y2FzdD1Db250cm9sUmVmCi1PU19HZXRDb250cm9sS2luZF8xPQotCi1PU19HZXRDb250cm9sT3duZXI9Ci1PU19HZXRDb250cm9sT3duZXJfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sUHJvcGVydHk9Ci1PU19HZXRDb250cm9sUHJvcGVydHlfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbFByb3BlcnR5XzE9Ci1PU19HZXRDb250cm9sUHJvcGVydHlfMj0KLU9TX0dldENvbnRyb2xQcm9wZXJ0eV8zPQotT1NfR2V0Q29udHJvbFByb3BlcnR5XzQ9Y2FzdD1VSW50MzIgKgotT1NfR2V0Q29udHJvbFByb3BlcnR5XzU9Y2FzdD12b2lkICoKLQotT1NfR2V0Q29udHJvbFJlZmVyZW5jZT0KLU9TX0dldENvbnRyb2xSZWZlcmVuY2VfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sUmVnaW9uPQotT1NfR2V0Q29udHJvbFJlZ2lvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sUmVnaW9uXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfR2V0Q29udHJvbFJlZ2lvbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfR2V0Q29udHJvbFZhbHVlPQotT1NfR2V0Q29udHJvbFZhbHVlXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q29udHJvbFZpZXdTaXplPQotT1NfR2V0Q29udHJvbFZpZXdTaXplXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q3VycmVudEV2ZW50QnV0dG9uU3RhdGU9Ci0KLU9TX0dldEN1cnJlbnRFdmVudEtleU1vZGlmaWVycz0KLQotT1NfR2V0Q3VycmVudEV2ZW50TG9vcD0KLQotT1NfR2V0Q3VycmVudEV2ZW50UXVldWU9Ci0KLU9TX0dldEN1cnJlbnRQcm9jZXNzPQotT1NfR2V0Q3VycmVudFByb2Nlc3NfMD1jYXN0PShQcm9jZXNzU2VyaWFsTnVtYmVyICopCi0KLU9TX0dldEN1cnJlbnRTY3JhcD0KLU9TX0dldEN1cnJlbnRTY3JhcF8wPWNhc3Q9KFNjcmFwUmVmICopCi0KLU9TX0dldERhdGFCcm93c2VyQ2FsbGJhY2tzPQotT1NfR2V0RGF0YUJyb3dzZXJDYWxsYmFja3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJDYWxsYmFja3NfMT1jYXN0PShEYXRhQnJvd3NlckNhbGxiYWNrcyAqKQotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudD0KLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50XzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudF8yPWNhc3Q9KEJvb2xlYW4pCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudF8zPWNhc3Q9KERhdGFCcm93c2VySXRlbVN0YXRlKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnRfND1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlPQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbURhdGFCdXR0b25WYWx1ZV8xPWNhc3Q9VGhlbWVCdXR0b25WYWx1ZSAqCi0KLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHM9Ci1PU19HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfMj1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzXzM9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eVBhcnQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzXzQ9Y2FzdD0oUmVjdCAqKQotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZT0KLU9TX0dldERhdGFCcm93c2VySXRlbVN0YXRlXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbVN0YXRlXzE9Ci1PU19HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZV8yPWNhc3Q9RGF0YUJyb3dzZXJJdGVtU3RhdGUgKgotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1zPQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1zXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1zXzI9Y2FzdD0oQm9vbGVhbikKLU9TX0dldERhdGFCcm93c2VySXRlbXNfMz1jYXN0PShEYXRhQnJvd3Nlckl0ZW1TdGF0ZSkKLU9TX0dldERhdGFCcm93c2VySXRlbXNfND1jYXN0PShIYW5kbGUpCi0KLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uPQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW5fMD1jYXN0PUNvbnRyb2xSZWYKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCAqKQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW5fMj1jYXN0PUJvb2xlYW4gKgotCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0PQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0XzE9Y2FzdD1VSW50MTYgKgotCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYz0KLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzI9Y2FzdD0oRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2MgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzPQotT1NfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyUHJvcGVydHlGbGFnc18xPWNhc3Q9RGF0YUJyb3dzZXJQcm9wZXJ0eUlECi1PU19HZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NfMj1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldD0KLU9TX0dldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldF8xPQotCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uPQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzE9Y2FzdD0oVUludDMyICopCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yPQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JfMT1jYXN0PShVSW50MzIgKikKLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3M9Ci1PU19HZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3NfMT1jYXN0PURhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MgKgotCi1PU19HZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eT0KLU9TX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5XzE9Y2FzdD1EYXRhQnJvd3NlclByb3BlcnR5SUQgKgotCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uPQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMj1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkluZGV4ICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEPQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSURfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSURfMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld1Jvd0luZGV4KQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSURfMj1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCAqKQotCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3c9Ci1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93XzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dJbmRleCkKLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18yPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aD0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGhfMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbklEKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoXzI9Y2FzdD0oVUludDE2ICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0PQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHRfMT1jYXN0PShVSW50MTYgKikKLQotT1NfR2V0RGJsVGltZT0KLQotT1NfR2V0RGVmRm9udFNpemU9Ci0KLU9TX0dldERldmljZUxpc3Q9Ci0KLU9TX0dldERyYWdBbGxvd2FibGVBY3Rpb25zPQotT1NfR2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMT1jYXN0PShEcmFnQWN0aW9ucyAqKQotCi1PU19HZXREcmFnRHJvcEFjdGlvbj0KLU9TX0dldERyYWdEcm9wQWN0aW9uXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0dldERyYWdEcm9wQWN0aW9uXzE9Y2FzdD0oRHJhZ0FjdGlvbnMgKikKLQotT1NfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXI9Ci1PU19HZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcl8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcl8xPQotT1NfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXJfMj1jYXN0PShEcmFnSXRlbVJlZiAqKQotCi1PU19HZXREcmFnTW9kaWZpZXJzPQotT1NfR2V0RHJhZ01vZGlmaWVyc18wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnTW9kaWZpZXJzXzE9Y2FzdD0oU0ludDE2ICopCi1PU19HZXREcmFnTW9kaWZpZXJzXzI9Y2FzdD0oU0ludDE2ICopCi1PU19HZXREcmFnTW9kaWZpZXJzXzM9Y2FzdD0oU0ludDE2ICopCi0KLU9TX0dldERyYWdNb3VzZT0KLU9TX0dldERyYWdNb3VzZV8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnTW91c2VfMT1jYXN0PShQb2ludCAqKQotT1NfR2V0RHJhZ01vdXNlXzI9Y2FzdD0oUG9pbnQgKikKLQotT1NfR2V0RXZlbnRDbGFzcz0KLU9TX0dldEV2ZW50Q2xhc3NfMD1jYXN0PShFdmVudFJlZikKLQotT1NfR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0PQotCi1PU19HZXRFdmVudEtpbmQ9Ci1PU19HZXRFdmVudEtpbmRfMD1jYXN0PShFdmVudFJlZikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMj0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfMD1jYXN0PUV2ZW50UmVmCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzE9Y2FzdD1FdmVudFBhcmFtTmFtZQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMl8yPWNhc3Q9RXZlbnRQYXJhbVR5cGUKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfMz1jYXN0PUV2ZW50UGFyYW1UeXBlICoKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzU9Y2FzdD1VSW50MzIgKgotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMl82PWNhc3Q9dm9pZCAqCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzM9Y2FzdD0oRXZlbnRQYXJhbVR5cGUgKikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzY9Y2FzdD0odm9pZCAqKQotCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzQ9Y2FzdD0oVUludDMyKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMj0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfNT1jYXN0PShVSW50MzIgKikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0I9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0JfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNCXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNCXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0M9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNDXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ18zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ180PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNDXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ182PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0k9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0lfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNJXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNJXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1M9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNTXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU18zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU180PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNTXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU182PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRUaW1lPQotT1NfR2V0RXZlbnRUaW1lXzA9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0dldEZsYXZvckRhdGE9Ci1PU19HZXRGbGF2b3JEYXRhXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0dldEZsYXZvckRhdGFfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0dldEZsYXZvckRhdGFfMj1jYXN0PShGbGF2b3JUeXBlKQotT1NfR2V0Rmxhdm9yRGF0YV8zPWNhc3Q9KHZvaWQgKikKLU9TX0dldEZsYXZvckRhdGFfND1jYXN0PShTaXplICopCi1PU19HZXRGbGF2b3JEYXRhXzU9Ci0KLU9TX0dldEZsYXZvckRhdGFTaXplPQotT1NfR2V0Rmxhdm9yRGF0YVNpemVfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0Rmxhdm9yRGF0YVNpemVfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0dldEZsYXZvckRhdGFTaXplXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX0dldEZsYXZvckRhdGFTaXplXzM9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRGbGF2b3JUeXBlPQotT1NfR2V0Rmxhdm9yVHlwZV8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXRGbGF2b3JUeXBlXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19HZXRGbGF2b3JUeXBlXzI9Ci1PU19HZXRGbGF2b3JUeXBlXzM9Y2FzdD0oRmxhdm9yVHlwZSAqKQotCi1PU19HZXRGb250SW5mbz0KLU9TX0dldEZvbnRJbmZvXzA9Y2FzdD0oRm9udEluZm8gKikKLQotT1NfR2V0R0RldmljZT0KLQotT1NfR2V0R1dvcmxkPQotT1NfR2V0R1dvcmxkXzA9Y2FzdD0oQ0dyYWZQdHIgKikKLU9TX0dldEdXb3JsZF8xPWNhc3Q9KEdESGFuZGxlICopCi0KLU9TX0dldEdsb2JhbE1vdXNlPQotT1NfR2V0R2xvYmFsTW91c2VfMD1jYXN0PShQb2ludCAqKQotCi1PU19HZXRIYW5kbGVTaXplPQotT1NfR2V0SGFuZGxlU2l6ZV8wPWNhc3Q9KEhhbmRsZSkKLQotT1NfR2V0SWNvbkZhbWlseURhdGE9Ci1PU19HZXRJY29uRmFtaWx5RGF0YV8wPWNhc3Q9SWNvbkZhbWlseUhhbmRsZQotT1NfR2V0SWNvbkZhbWlseURhdGFfMT1jYXN0PU9TVHlwZQotT1NfR2V0SWNvbkZhbWlseURhdGFfMj1jYXN0PShIYW5kbGUpCi0KLU9TX0dldEljb25SZWY9Ci1PU19HZXRJY29uUmVmXzA9Y2FzdD0oU0ludDE2KQotT1NfR2V0SWNvblJlZl8xPWNhc3Q9KE9TVHlwZSkKLU9TX0dldEljb25SZWZfMj1jYXN0PShPU1R5cGUpCi1PU19HZXRJY29uUmVmXzM9Y2FzdD0oSWNvblJlZiAqKQotCi1PU19HZXRJY29uUmVmRnJvbUljb25GYW1pbHlQdHI9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0SWNvblJlZkZyb21JY29uRmFtaWx5UHRyXzA9Ci1PU19HZXRJY29uUmVmRnJvbUljb25GYW1pbHlQdHJfMT0KLU9TX0dldEljb25SZWZGcm9tSWNvbkZhbWlseVB0cl8yPQotCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQ9Ci1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEXzE9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfMj1jYXN0PShVSW50MzIpCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfMz1jYXN0PShNZW51UmVmICopCi1PU19HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSURfND1jYXN0PShNZW51SXRlbUluZGV4ICopCi0KLU9TX0dldEluZGV4ZWRTdWJDb250cm9sPQotT1NfR2V0SW5kZXhlZFN1YkNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0SW5kZXhlZFN1YkNvbnRyb2xfMT1jYXN0PShVSW50MTYpCi1PU19HZXRJbmRleGVkU3ViQ29udHJvbF8yPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfR2V0SXRlbU1hcms9Ci1PU19HZXRJdGVtTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRJdGVtTWFya18xPQotT1NfR2V0SXRlbU1hcmtfMj0KLQotT1NfR2V0S2V5Ym9hcmRGb2N1cz0KLU9TX0dldEtleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRLZXlib2FyZEZvY3VzXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRMYXN0VXNlckV2ZW50VGltZT0KLQotT1NfR2V0TUJhckhlaWdodD0KLQotT1NfR2V0TWFpbkRldmljZT0KLQotT1NfR2V0TWFpbkV2ZW50UXVldWU9Ci0KLU9TX0dldE1lbnVDb21tYW5kTWFyaz0KLU9TX0dldE1lbnVDb21tYW5kTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRNZW51Q29tbWFuZE1hcmtfMT1jYXN0PShNZW51Q29tbWFuZCkKLU9TX0dldE1lbnVDb21tYW5kTWFya18yPWNhc3Q9KFVuaUNoYXIgKikKLQotT1NfR2V0TWVudUV2ZW50VGFyZ2V0PQotT1NfR2V0TWVudUV2ZW50VGFyZ2V0XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfR2V0TWVudUZvbnQ9Ci1PU19HZXRNZW51Rm9udF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRNZW51Rm9udF8xPWNhc3Q9KFNJbnQxNiAqKQotT1NfR2V0TWVudUZvbnRfMj1jYXN0PShVSW50MTYgKikKLQotT1NfR2V0TWVudUhlaWdodD0KLU9TX0dldE1lbnVIZWlnaHRfMD1jYXN0PShNZW51UmVmKQotCi1PU19HZXRNZW51SUQ9Ci1PU19HZXRNZW51SURfMD1jYXN0PShNZW51UmVmKQotCi1PU19HZXRNZW51SXRlbUNvbW1hbmRJRD0KLU9TX0dldE1lbnVJdGVtQ29tbWFuZElEXzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldE1lbnVJdGVtQ29tbWFuZElEXzE9Y2FzdD0oU0ludDE2KQotT1NfR2V0TWVudUl0ZW1Db21tYW5kSURfMj1jYXN0PShNZW51Q29tbWFuZCAqKQotCi1PU19HZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnU9Ci1PU19HZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnVfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzE9Y2FzdD0oU0ludDE2KQotT1NfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzI9Y2FzdD0oTWVudVJlZiAqKQotCi1PU19HZXRNZW51SXRlbVJlZkNvbj0KLU9TX0dldE1lbnVJdGVtUmVmQ29uXzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldE1lbnVJdGVtUmVmQ29uXzE9Y2FzdD0oU0ludDE2KQotT1NfR2V0TWVudUl0ZW1SZWZDb25fMj1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0TWVudVRyYWNraW5nRGF0YT0KLU9TX0dldE1lbnVUcmFja2luZ0RhdGFfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0TWVudVRyYWNraW5nRGF0YV8xPQotCi1PU19HZXRNZW51V2lkdGg9Ci1PU19HZXRNZW51V2lkdGhfMD1jYXN0PShNZW51UmVmKQotCi1PU19HZXRNb3VzZT0KLU9TX0dldE1vdXNlXzA9Y2FzdD0oUG9pbnQgKikKLQotT1NfR2V0TmV4dERldmljZT0KLU9TX0dldE5leHREZXZpY2VfMD1jYXN0PShHREhhbmRsZSkKLQotT1NfR2V0UGl4Qm91bmRzPQotT1NfR2V0UGl4Qm91bmRzXzA9Y2FzdD0oUGl4TWFwSGFuZGxlKQotT1NfR2V0UGl4Qm91bmRzXzE9Y2FzdD0oUmVjdCAqKQotCi1PU19HZXRQaXhEZXB0aD0KLU9TX0dldFBpeERlcHRoXzA9Y2FzdD0oUGl4TWFwSGFuZGxlKQotCi1PU19HZXRQb3J0PQotT1NfR2V0UG9ydF8wPWNhc3Q9KEdyYWZQdHIgKikKLQotT1NfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzPQotT1NfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzXzA9Y2FzdD0oQ0dyYWZQdHIpCi0KLU9TX0dldFBvcnRCb3VuZHM9Ci1PU19HZXRQb3J0Qm91bmRzXzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19HZXRQb3J0Qm91bmRzXzE9Y2FzdD0oUmVjdCAqKQotCi1PU19HZXRQb3J0Q2xpcFJlZ2lvbj0KLU9TX0dldFBvcnRDbGlwUmVnaW9uXzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19HZXRQb3J0Q2xpcFJlZ2lvbl8xPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfR2V0UG9ydFZpc2libGVSZWdpb249Ci1PU19HZXRQb3J0VmlzaWJsZVJlZ2lvbl8wPWNhc3Q9KENHcmFmUHRyKQotT1NfR2V0UG9ydFZpc2libGVSZWdpb25fMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0dldFByZXZpb3VzV2luZG93PQotT1NfR2V0UHJldmlvdXNXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0dldFB0clNpemU9Ci1PU19HZXRQdHJTaXplXzA9Y2FzdD0oUHRyKQotCi1PU19HZXRSZWdpb25Cb3VuZHM9Ci1PU19HZXRSZWdpb25Cb3VuZHNfMD1jYXN0PShSZ25IYW5kbGUpCi1PU19HZXRSZWdpb25Cb3VuZHNfMT1jYXN0PShSZWN0ICopCi0KLU9TX0dldFJvb3RDb250cm9sPQotT1NfR2V0Um9vdENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRSb290Q29udHJvbF8xPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JDb3VudD0KLU9TX0dldFNjcmFwRmxhdm9yQ291bnRfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yQ291bnRfMT1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQj0KLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0JfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0JfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNCXzI9Y2FzdD0oU2l6ZSAqKQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQl8zPWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQz0KLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0NfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0NfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNDXzI9Y2FzdD0oU2l6ZSAqKQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQ18zPWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdD0KLU9TX0dldFNjcmFwRmxhdm9ySW5mb0xpc3RfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9ySW5mb0xpc3RfMT1jYXN0PShVSW50MzIgKikKLU9TX0dldFNjcmFwRmxhdm9ySW5mb0xpc3RfMj1jYXN0PShTY3JhcEZsYXZvckluZm8gKikKLQotT1NfR2V0U2NyYXBGbGF2b3JTaXplPQotT1NfR2V0U2NyYXBGbGF2b3JTaXplXzA9Y2FzdD0oU2NyYXBSZWYpCi1PU19HZXRTY3JhcEZsYXZvclNpemVfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19HZXRTY3JhcEZsYXZvclNpemVfMj1jYXN0PShTaXplICopCi0KLU9TX0dldFNjcmlwdE1hbmFnZXJWYXJpYWJsZT0KLU9TX0dldFNjcmlwdE1hbmFnZXJWYXJpYWJsZV8wPQotCi1PU19HZXRTdXBlckNvbnRyb2w9Ci1PU19HZXRTdXBlckNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0U3VwZXJDb250cm9sXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRUYWJDb250ZW50UmVjdD0KLU9TX0dldFRhYkNvbnRlbnRSZWN0XzA9Y2FzdD1Db250cm9sUmVmCi1PU19HZXRUYWJDb250ZW50UmVjdF8xPQotCi1PU19HZXRUaGVtZUJydXNoQXNDb2xvcj0KLU9TX0dldFRoZW1lQnJ1c2hBc0NvbG9yXzA9Ci1PU19HZXRUaGVtZUJydXNoQXNDb2xvcl8xPQotT1NfR2V0VGhlbWVCcnVzaEFzQ29sb3JfMj0KLU9TX0dldFRoZW1lQnJ1c2hBc0NvbG9yXzM9Ci0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcz0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kc18wPQotT1NfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzXzE9Ci1PU19HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHNfMj0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kc18zPQotCi1PU19HZXRUaGVtZURyYXdpbmdTdGF0ZT0KLU9TX0dldFRoZW1lRHJhd2luZ1N0YXRlXzA9Y2FzdD0oVGhlbWVEcmF3aW5nU3RhdGUgKikKLQotT1NfR2V0VGhlbWVGb250PQotT1NfR2V0VGhlbWVGb250XzA9Y2FzdD0oVGhlbWVGb250SUQpCi1PU19HZXRUaGVtZUZvbnRfMT1jYXN0PShTY3JpcHRDb2RlKQotT1NfR2V0VGhlbWVGb250XzI9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotT1NfR2V0VGhlbWVGb250XzM9Y2FzdD0oU0ludDE2ICopCi1PU19HZXRUaGVtZUZvbnRfND1jYXN0PShTdHlsZSAqKQotCi1PU19HZXRUaGVtZU1lbnVJdGVtRXh0cmE9Ci1PU19HZXRUaGVtZU1lbnVJdGVtRXh0cmFfMD0KLU9TX0dldFRoZW1lTWVudUl0ZW1FeHRyYV8xPQotT1NfR2V0VGhlbWVNZW51SXRlbUV4dHJhXzI9Ci0KLU9TX0dldFRoZW1lTWV0cmljPQotT1NfR2V0VGhlbWVNZXRyaWNfMD0KLU9TX0dldFRoZW1lTWV0cmljXzE9Ci0KLU9TX0dldFRoZW1lVGV4dENvbG9yPQotT1NfR2V0VGhlbWVUZXh0Q29sb3JfMD0KLU9TX0dldFRoZW1lVGV4dENvbG9yXzE9Ci1PU19HZXRUaGVtZVRleHRDb2xvcl8yPQotT1NfR2V0VGhlbWVUZXh0Q29sb3JfMz0KLQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9ucz0KLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMT1jYXN0PShUaGVtZUZvbnRJRCkKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMj1jYXN0PShUaGVtZURyYXdTdGF0ZSkKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfMz1jYXN0PShCb29sZWFuKQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9uc180PWNhc3Q9KFBvaW50ICopCi1PU19HZXRUaGVtZVRleHREaW1lbnNpb25zXzU9Y2FzdD0oU0ludDE2ICopCi0KLU9TX0dldFVzZXJGb2N1c0V2ZW50VGFyZ2V0PQotCi1PU19HZXRVc2VyRm9jdXNXaW5kb3c9Ci0KLU9TX0dldFdSZWZDb249Ci1PU19HZXRXUmVmQ29uXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19HZXRXaW5kb3dBY3RpdmF0aW9uU2NvcGU9Ci1PU19HZXRXaW5kb3dBY3RpdmF0aW9uU2NvcGVfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRXaW5kb3dBY3RpdmF0aW9uU2NvcGVfMT1jYXN0PShXaW5kb3dBY3RpdmF0aW9uU2NvcGUgKikKLQotT1NfR2V0V2luZG93Qm91bmRzPQotT1NfR2V0V2luZG93Qm91bmRzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93Qm91bmRzXzE9Y2FzdD0oV2luZG93UmVnaW9uQ29kZSkKLU9TX0dldFdpbmRvd0JvdW5kc18yPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0V2luZG93RGVmYXVsdEJ1dHRvbj0KLU9TX0dldFdpbmRvd0RlZmF1bHRCdXR0b25fMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRXaW5kb3dFdmVudFRhcmdldD0KLU9TX0dldFdpbmRvd0V2ZW50VGFyZ2V0XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19HZXRXaW5kb3dGcm9tUG9ydD0KLU9TX0dldFdpbmRvd0Zyb21Qb3J0XzA9Y2FzdD0oQ0dyYWZQdHIpCi0KLU9TX0dldFdpbmRvd0dyb3VwT2ZDbGFzcz0KLU9TX0dldFdpbmRvd0dyb3VwT2ZDbGFzc18wPQotCi1PU19HZXRXaW5kb3dNb2RhbGl0eT0KLU9TX0dldFdpbmRvd01vZGFsaXR5XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93TW9kYWxpdHlfMT1jYXN0PShXaW5kb3dNb2RhbGl0eSAqKQotT1NfR2V0V2luZG93TW9kYWxpdHlfMj1jYXN0PShXaW5kb3dSZWYgKikKLQotT1NfR2V0V2luZG93UG9ydD0KLU9TX0dldFdpbmRvd1BvcnRfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0dldFdpbmRvd1JlZ2lvbj0KLU9TX0dldFdpbmRvd1JlZ2lvbl8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFdpbmRvd1JlZ2lvbl8xPWNhc3Q9KFdpbmRvd1JlZ2lvbkNvZGUpCi1PU19HZXRXaW5kb3dSZWdpb25fMj1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0dldFdpbmRvd1Jlc2l6ZUxpbWl0cz0KLU9TX0dldFdpbmRvd1Jlc2l6ZUxpbWl0c18wPWNhc3Q9V2luZG93UmVmCi1PU19HZXRXaW5kb3dSZXNpemVMaW1pdHNfMT1jYXN0PUhJU2l6ZSAqCi1PU19HZXRXaW5kb3dSZXNpemVMaW1pdHNfMj1jYXN0PUhJU2l6ZSAqCi0KLU9TX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRocz0KLU9TX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRoc18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRoc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfSElDb21ib0JveEFwcGVuZFRleHRJdGVtPQotT1NfSElDb21ib0JveEFwcGVuZFRleHRJdGVtXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElDb21ib0JveEFwcGVuZFRleHRJdGVtXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISUNvbWJvQm94QXBwZW5kVGV4dEl0ZW1fMj1jYXN0PShDRkluZGV4ICopCi0KLU9TX0hJQ29tYm9Cb3hDb3B5VGV4dEl0ZW1BdEluZGV4PQotT1NfSElDb21ib0JveENvcHlUZXh0SXRlbUF0SW5kZXhfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISUNvbWJvQm94Q29weVRleHRJdGVtQXRJbmRleF8xPWNhc3Q9KENGSW5kZXgpCi1PU19ISUNvbWJvQm94Q29weVRleHRJdGVtQXRJbmRleF8yPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0hJQ29tYm9Cb3hDcmVhdGU9Ci1PU19ISUNvbWJvQm94Q3JlYXRlXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopCi1PU19ISUNvbWJvQm94Q3JlYXRlXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISUNvbWJvQm94Q3JlYXRlXzI9Y2FzdD0oY29uc3QgQ29udHJvbEZvbnRTdHlsZVJlYyAqKQotT1NfSElDb21ib0JveENyZWF0ZV8zPWNhc3Q9KENGQXJyYXlSZWYpCi1PU19ISUNvbWJvQm94Q3JlYXRlXzQ9Y2FzdD0oT3B0aW9uQml0cykKLU9TX0hJQ29tYm9Cb3hDcmVhdGVfNT1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElDb21ib0JveEdldEl0ZW1Db3VudD0KLU9TX0hJQ29tYm9Cb3hHZXRJdGVtQ291bnRfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJQ29tYm9Cb3hJbnNlcnRUZXh0SXRlbUF0SW5kZXg9Ci1PU19ISUNvbWJvQm94SW5zZXJ0VGV4dEl0ZW1BdEluZGV4XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElDb21ib0JveEluc2VydFRleHRJdGVtQXRJbmRleF8xPWNhc3Q9KENGSW5kZXgpCi1PU19ISUNvbWJvQm94SW5zZXJ0VGV4dEl0ZW1BdEluZGV4XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX0hJQ29tYm9Cb3hSZW1vdmVJdGVtQXRJbmRleD0KLU9TX0hJQ29tYm9Cb3hSZW1vdmVJdGVtQXRJbmRleF8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJQ29tYm9Cb3hSZW1vdmVJdGVtQXRJbmRleF8xPWNhc3Q9KENGSW5kZXgpCi0KLU9TX0hJT2JqZWN0Q29weUNsYXNzSUQ9Ci1PU19ISU9iamVjdENvcHlDbGFzc0lEXzA9Y2FzdD0oSElPYmplY3RSZWYpCi0KLU9TX0hJT2JqZWN0Q3JlYXRlPQotT1NfSElPYmplY3RDcmVhdGVfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0hJT2JqZWN0Q3JlYXRlXzE9Y2FzdD0oRXZlbnRSZWYpCi1PU19ISU9iamVjdENyZWF0ZV8yPWNhc3Q9KEhJT2JqZWN0UmVmICopCi0KLU9TX0hJT2JqZWN0UmVnaXN0ZXJTdWJjbGFzcz0KLU9TX0hJT2JqZWN0UmVnaXN0ZXJTdWJjbGFzc18wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISU9iamVjdFJlZ2lzdGVyU3ViY2xhc3NfMj1jYXN0PShPcHRpb25CaXRzKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzM9Y2FzdD0oRXZlbnRIYW5kbGVyVVBQKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzQ9Y2FzdD0oVUludDMyKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzU9Y2FzdD0oY29uc3QgRXZlbnRUeXBlU3BlYyAqKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzY9Y2FzdD0odm9pZCAqKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzc9Y2FzdD0oSElPYmplY3RDbGFzc1JlZiAqKQotCi1PU19ISVNjcm9sbFZpZXdDcmVhdGU9Ci1PU19ISVNjcm9sbFZpZXdDcmVhdGVfMD0KLU9TX0hJU2Nyb2xsVmlld0NyZWF0ZV8xPWNhc3Q9SElWaWV3UmVmKgotCi1PU19ISVRleHRWaWV3Q3JlYXRlPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8wPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8xPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8yPQotT1NfSElUZXh0Vmlld0NyZWF0ZV8zPWNhc3Q9SElWaWV3UmVmICoKLQotT1NfSElUZXh0Vmlld0dldFRYTk9iamVjdD0KLU9TX0hJVGV4dFZpZXdHZXRUWE5PYmplY3RfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVGhlbWVEcmF3QmFja2dyb3VuZD0KLU9TX0hJVGhlbWVEcmF3QmFja2dyb3VuZF8wPQotT1NfSElUaGVtZURyYXdCYWNrZ3JvdW5kXzE9Ci1PU19ISVRoZW1lRHJhd0JhY2tncm91bmRfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdCYWNrZ3JvdW5kXzM9Ci0KLU9TX0hJVGhlbWVEcmF3QnV0dG9uPQotT1NfSElUaGVtZURyYXdCdXR0b25fMD1jYXN0PShjb25zdCBISVJlY3QgKiksZmxhZ3M9bm9fb3V0Ci1PU19ISVRoZW1lRHJhd0J1dHRvbl8xPWNhc3Q9KGNvbnN0IEhJVGhlbWVCdXR0b25EcmF3SW5mbyAqKQotT1NfSElUaGVtZURyYXdCdXR0b25fMj1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19ISVRoZW1lRHJhd0J1dHRvbl8zPWNhc3Q9KEhJVGhlbWVPcmllbnRhdGlvbikKLU9TX0hJVGhlbWVEcmF3QnV0dG9uXzQ9Y2FzdD0oSElSZWN0ICopLGZsYWdzPW5vX2luCi0KLU9TX0hJVGhlbWVEcmF3Rm9jdXNSZWN0PQotT1NfSElUaGVtZURyYXdGb2N1c1JlY3RfMD0KLU9TX0hJVGhlbWVEcmF3Rm9jdXNSZWN0XzE9Ci1PU19ISVRoZW1lRHJhd0ZvY3VzUmVjdF8yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd0ZvY3VzUmVjdF8zPQotCi1PU19ISVRoZW1lRHJhd0ZyYW1lPQotT1NfSElUaGVtZURyYXdGcmFtZV8wPQotT1NfSElUaGVtZURyYXdGcmFtZV8xPQotT1NfSElUaGVtZURyYXdGcmFtZV8yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd0ZyYW1lXzM9Ci0KLU9TX0hJVGhlbWVEcmF3R2VuZXJpY1dlbGw9Ci1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopCi1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsXzE9Y2FzdD0oY29uc3QgSElUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsXzI9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfSElUaGVtZURyYXdHZW5lcmljV2VsbF8zPWNhc3Q9KEhJVGhlbWVPcmllbnRhdGlvbikKLQotT1NfSElUaGVtZURyYXdHcm91cEJveD0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMD0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMT0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdHcm91cEJveF8zPQotCi1PU19ISVRoZW1lRHJhd0dyb3dCb3g9Ci1PU19ISVRoZW1lRHJhd0dyb3dCb3hfMD0KLU9TX0hJVGhlbWVEcmF3R3Jvd0JveF8xPQotT1NfSElUaGVtZURyYXdHcm93Qm94XzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3R3Jvd0JveF8zPQotCi1PU19ISVRoZW1lRHJhd1BvcHVwQXJyb3c9Ci1PU19ISVRoZW1lRHJhd1BvcHVwQXJyb3dfMD0KLU9TX0hJVGhlbWVEcmF3UG9wdXBBcnJvd18xPQotT1NfSElUaGVtZURyYXdQb3B1cEFycm93XzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3UG9wdXBBcnJvd18zPQotCi1PU19ISVRoZW1lRHJhd1NlcGFyYXRvcj0KLU9TX0hJVGhlbWVEcmF3U2VwYXJhdG9yXzA9Ci1PU19ISVRoZW1lRHJhd1NlcGFyYXRvcl8xPQotT1NfSElUaGVtZURyYXdTZXBhcmF0b3JfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdTZXBhcmF0b3JfMz0KLQotT1NfSElUaGVtZURyYXdUYWI9Ci1PU19ISVRoZW1lRHJhd1RhYl8wPWNhc3Q9KGNvbnN0IEhJUmVjdCAqKSxmbGFncz1ub19vdXQKLU9TX0hJVGhlbWVEcmF3VGFiXzE9Y2FzdD0oY29uc3QgSElUaGVtZVRhYkRyYXdJbmZvICopCi1PU19ISVRoZW1lRHJhd1RhYl8yPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0hJVGhlbWVEcmF3VGFiXzM9Y2FzdD0oSElUaGVtZU9yaWVudGF0aW9uKQotT1NfSElUaGVtZURyYXdUYWJfND1jYXN0PShISVJlY3QgKiksZmxhZ3M9bm9faW4KLQotT1NfSElUaGVtZURyYXdUYWJQYW5lPQotT1NfSElUaGVtZURyYXdUYWJQYW5lXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopCi1PU19ISVRoZW1lRHJhd1RhYlBhbmVfMT1jYXN0PShjb25zdCBISVRoZW1lVGFiUGFuZURyYXdJbmZvICopCi1PU19ISVRoZW1lRHJhd1RhYlBhbmVfMj1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19ISVRoZW1lRHJhd1RhYlBhbmVfMz1jYXN0PShISVRoZW1lT3JpZW50YXRpb24pCi0KLU9TX0hJVGhlbWVEcmF3VGV4dEJveD0KLU9TX0hJVGhlbWVEcmF3VGV4dEJveF8wPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX0hJVGhlbWVEcmF3VGV4dEJveF8xPQotT1NfSElUaGVtZURyYXdUZXh0Qm94XzI9Ci1PU19ISVRoZW1lRHJhd1RleHRCb3hfMz1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdUZXh0Qm94XzQ9Ci0KLU9TX0hJVGhlbWVEcmF3VHJhY2s9Ci1PU19ISVRoZW1lRHJhd1RyYWNrXzA9Ci1PU19ISVRoZW1lRHJhd1RyYWNrXzE9Ci1PU19ISVRoZW1lRHJhd1RyYWNrXzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3VHJhY2tfMz0KLQotT1NfSElUaGVtZUdldEJ1dHRvbkJhY2tncm91bmRCb3VuZHM9Ci1PU19ISVRoZW1lR2V0QnV0dG9uQmFja2dyb3VuZEJvdW5kc18wPQotT1NfSElUaGVtZUdldEJ1dHRvbkJhY2tncm91bmRCb3VuZHNfMT0KLU9TX0hJVGhlbWVHZXRCdXR0b25CYWNrZ3JvdW5kQm91bmRzXzI9Ci0KLU9TX0hJVGhlbWVHZXRCdXR0b25Db250ZW50Qm91bmRzPQotT1NfSElUaGVtZUdldEJ1dHRvbkNvbnRlbnRCb3VuZHNfMD0KLU9TX0hJVGhlbWVHZXRCdXR0b25Db250ZW50Qm91bmRzXzE9Ci1PU19ISVRoZW1lR2V0QnV0dG9uQ29udGVudEJvdW5kc18yPQotCi1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnM9Ci1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfMD1jYXN0PUNGU3RyaW5nUmVmCi1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfMT0KLU9TX0hJVGhlbWVHZXRUZXh0RGltZW5zaW9uc18yPQotT1NfSElUaGVtZUdldFRleHREaW1lbnNpb25zXzM9Ci1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfND0KLU9TX0hJVGhlbWVHZXRUZXh0RGltZW5zaW9uc181PQotCi1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93cz0KLU9TX0hJVGhlbWVIaXRUZXN0U2Nyb2xsQmFyQXJyb3dzXzA9Ci1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93c18xPQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3NfMj0KLU9TX0hJVGhlbWVIaXRUZXN0U2Nyb2xsQmFyQXJyb3dzXzM9Ci1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93c180PQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3NfNT0KLQotT1NfSElUaGVtZUhpdFRlc3RUcmFjaz0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2tfMD0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2tfMT0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2tfMj0KLQotT1NfSElUaGVtZVNldEZpbGw9ZmxhZ3M9ZHluYW1pYwotT1NfSElUaGVtZVNldEZpbGxfMD1jYXN0PVRoZW1lQnJ1c2gKLU9TX0hJVGhlbWVTZXRGaWxsXzE9Y2FzdD12b2lkICoKLU9TX0hJVGhlbWVTZXRGaWxsXzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVTZXRGaWxsXzM9Y2FzdD1ISVRoZW1lT3JpZW50YXRpb24KLQotT1NfSElWaWV3QWRkU3Vidmlldz0KLU9TX0hJVmlld0FkZFN1YnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdBZGRTdWJ2aWV3XzE9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdDaGFuZ2VBdHRyaWJ1dGVzPQotT1NfSElWaWV3Q2hhbmdlQXR0cmlidXRlc18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NoYW5nZUF0dHJpYnV0ZXNfMT0KLU9TX0hJVmlld0NoYW5nZUF0dHJpYnV0ZXNfMj0KLQotT1NfSElWaWV3Q2hhbmdlRmVhdHVyZXM9Ci1PU19ISVZpZXdDaGFuZ2VGZWF0dXJlc18wPWNhc3Q9SElWaWV3UmVmCi1PU19ISVZpZXdDaGFuZ2VGZWF0dXJlc18xPQotT1NfSElWaWV3Q2hhbmdlRmVhdHVyZXNfMj0KLQotT1NfSElWaWV3Q2xpY2s9Ci1PU19ISVZpZXdDbGlja18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NsaWNrXzE9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0hJVmlld0NvbnZlcnRQb2ludD0KLU9TX0hJVmlld0NvbnZlcnRQb2ludF8wPWNhc3Q9KEhJUG9pbnQgKikKLU9TX0hJVmlld0NvbnZlcnRQb2ludF8xPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NvbnZlcnRQb2ludF8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3Q29udmVydFJlY3Q9Ci1PU19ISVZpZXdDb252ZXJ0UmVjdF8wPQotT1NfSElWaWV3Q29udmVydFJlY3RfMT1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdDb252ZXJ0UmVjdF8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3Q29udmVydFJlZ2lvbj0KLU9TX0hJVmlld0NvbnZlcnRSZWdpb25fMD1jYXN0PVJnbkhhbmRsZQotT1NfSElWaWV3Q29udmVydFJlZ2lvbl8xPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NvbnZlcnRSZWdpb25fMj1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0NyZWF0ZU9mZnNjcmVlbkltYWdlPQotT1NfSElWaWV3Q3JlYXRlT2Zmc2NyZWVuSW1hZ2VfMD1jYXN0PUhJVmlld1JlZgotT1NfSElWaWV3Q3JlYXRlT2Zmc2NyZWVuSW1hZ2VfMT1jYXN0PU9wdGlvbkJpdHMKLU9TX0hJVmlld0NyZWF0ZU9mZnNjcmVlbkltYWdlXzI9Y2FzdD0oSElSZWN0ICopCi1PU19ISVZpZXdDcmVhdGVPZmZzY3JlZW5JbWFnZV8zPWNhc3Q9Q0dJbWFnZVJlZiAqCi0KLU9TX0hJVmlld0ZpbmRCeUlEPQotT1NfSElWaWV3RmluZEJ5SURfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdGaW5kQnlJRF8xPWNhc3Q9KEhJVmlld0lEICopLGZsYWdzPXN0cnVjdAotT1NfSElWaWV3RmluZEJ5SURfMj1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElWaWV3R2V0Qm91bmRzPQotT1NfSElWaWV3R2V0Qm91bmRzXzA9Y2FzdD1ISVZpZXdSZWYKLU9TX0hJVmlld0dldEJvdW5kc18xPQotCi1PU19ISVZpZXdHZXRGZWF0dXJlcz0KLU9TX0hJVmlld0dldEZlYXR1cmVzXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0RmVhdHVyZXNfMT1jYXN0PUhJVmlld0ZlYXR1cmVzICoKLQotT1NfSElWaWV3R2V0Rmlyc3RTdWJ2aWV3PQotT1NfSElWaWV3R2V0Rmlyc3RTdWJ2aWV3XzA9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdHZXRGcmFtZT0KLU9TX0hJVmlld0dldEZyYW1lXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0RnJhbWVfMT1jYXN0PShISVJlY3QgKikKLQotT1NfSElWaWV3R2V0TGFzdFN1YnZpZXc9Ci1PU19ISVZpZXdHZXRMYXN0U3Vidmlld18wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3R2V0TmV4dFZpZXc9Ci1PU19ISVZpZXdHZXROZXh0Vmlld18wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3R2V0Um9vdD0KLU9TX0hJVmlld0dldFJvb3RfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50cz0KLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50c18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50c18xPWNhc3Q9KEhJU2l6ZSAqKQotT1NfSElWaWV3R2V0U2l6ZUNvbnN0cmFpbnRzXzI9Y2FzdD0oSElTaXplICopCi0KLU9TX0hJVmlld0dldFN1YnZpZXdIaXQ9Ci1PU19ISVZpZXdHZXRTdWJ2aWV3SGl0XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0U3Vidmlld0hpdF8xPWNhc3Q9KENHUG9pbnQgKikKLU9TX0hJVmlld0dldFN1YnZpZXdIaXRfMj1jYXN0PShCb29sZWFuKQotT1NfSElWaWV3R2V0U3Vidmlld0hpdF8zPWNhc3Q9KEhJVmlld1JlZiAqKQotCi1PU19ISVZpZXdHZXRTdXBlcnZpZXc9Ci1PU19ISVZpZXdHZXRTdXBlcnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0dldFZpZXdGb3JNb3VzZUV2ZW50PQotT1NfSElWaWV3R2V0Vmlld0Zvck1vdXNlRXZlbnRfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdHZXRWaWV3Rm9yTW91c2VFdmVudF8xPWNhc3Q9KEV2ZW50UmVmKQotT1NfSElWaWV3R2V0Vmlld0Zvck1vdXNlRXZlbnRfMj1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElWaWV3SXNEcmF3aW5nRW5hYmxlZD0KLU9TX0hJVmlld0lzRHJhd2luZ0VuYWJsZWRfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0lzVmlzaWJsZT0KLU9TX0hJVmlld0lzVmlzaWJsZV8wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3UmVtb3ZlRnJvbVN1cGVydmlldz0KLU9TX0hJVmlld1JlbW92ZUZyb21TdXBlcnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld1JlbmRlcj0KLU9TX0hJVmlld1JlbmRlcl8wPWNhc3Q9SElWaWV3UmVmCi0KLU9TX0hJVmlld1Njcm9sbFJlY3Q9Ci1PU19ISVZpZXdTY3JvbGxSZWN0XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2Nyb2xsUmVjdF8xPQotT1NfSElWaWV3U2Nyb2xsUmVjdF8yPQotT1NfSElWaWV3U2Nyb2xsUmVjdF8zPQotCi1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW49Ci1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW5fMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW5fMT0KLU9TX0hJVmlld1NldEJvdW5kc09yaWdpbl8yPQotCi1PU19ISVZpZXdTZXREcmF3aW5nRW5hYmxlZD0KLU9TX0hJVmlld1NldERyYXdpbmdFbmFibGVkXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0RHJhd2luZ0VuYWJsZWRfMT1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRGcmFtZT0KLU9TX0hJVmlld1NldEZyYW1lXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0RnJhbWVfMT1jYXN0PShjb25zdCBISVJlY3QgKikKLQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5PQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5SW5SZWdpb249Ci1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXlJblJlZ2lvbl8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld1NldE5lZWRzRGlzcGxheUluUmVnaW9uXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5SW5SZWdpb25fMj1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRWaXNpYmxlPQotT1NfSElWaWV3U2V0VmlzaWJsZV8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld1NldFZpc2libGVfMT1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRaT3JkZXI9Ci1PU19ISVZpZXdTZXRaT3JkZXJfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTZXRaT3JkZXJfMT1jYXN0PShISVZpZXdaT3JkZXJPcCkKLU9TX0hJVmlld1NldFpPcmRlcl8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3U2ltdWxhdGVDbGljaz0KLU9TX0hJVmlld1NpbXVsYXRlQ2xpY2tfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTaW11bGF0ZUNsaWNrXzE9Y2FzdD0oSElWaWV3UGFydENvZGUpCi1PU19ISVZpZXdTaW11bGF0ZUNsaWNrXzI9Y2FzdD0oVUludDMyKQotT1NfSElWaWV3U2ltdWxhdGVDbGlja18zPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSAqKQotCi1PU19ITG9jaz0KLU9TX0hMb2NrXzA9Y2FzdD0oSGFuZGxlKQotCi1PU19ITUdldFRhZ0RlbGF5PQotT1NfSE1HZXRUYWdEZWxheV8wPQotCi1PU19ITUhpZGVUYWc9Ci0KLU9TX0hNSW5zdGFsbENvbnRyb2xDb250ZW50Q2FsbGJhY2s9Ci1PU19ITUluc3RhbGxDb250cm9sQ29udGVudENhbGxiYWNrXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0hNSW5zdGFsbENvbnRyb2xDb250ZW50Q2FsbGJhY2tfMT1jYXN0PShITUNvbnRyb2xDb250ZW50VVBQKQotCi1PU19ITVNldFRhZ0RlbGF5PQotT1NfSE1TZXRUYWdEZWxheV8wPQotCi1PU19IVW5sb2NrPQotT1NfSFVubG9ja18wPWNhc3Q9KEhhbmRsZSkKLQotT1NfSGFuZGxlQ29udHJvbENsaWNrPQotT1NfSGFuZGxlQ29udHJvbENsaWNrXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0hhbmRsZUNvbnRyb2xDbGlja18xPWZsYWdzPXN0cnVjdAotT1NfSGFuZGxlQ29udHJvbENsaWNrXzI9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi1PU19IYW5kbGVDb250cm9sQ2xpY2tfMz1jYXN0PShDb250cm9sQWN0aW9uVVBQKQotCi1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yPQotT1NfSGFuZGxlQ29udHJvbFNldEN1cnNvcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzE9ZmxhZ3M9c3RydWN0Ci1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzI9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzM9Y2FzdD0oQm9vbGVhbiAqKQotCi1PU19IaVdvcmQ9Ci1PU19IaVdvcmRfMD0KLQotT1NfSGlkZVdpbmRvdz0KLU9TX0hpZGVXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0hpbGl0ZU1lbnU9Ci1PU19IaWxpdGVNZW51XzA9Y2FzdD0oTWVudUlEKQotCi1PU19JY29uUmVmVG9JY29uRmFtaWx5PQotT1NfSWNvblJlZlRvSWNvbkZhbWlseV8wPWNhc3Q9SWNvblJlZgotT1NfSWNvblJlZlRvSWNvbkZhbWlseV8xPWNhc3Q9SWNvblNlbGVjdG9yVmFsdWUKLU9TX0ljb25SZWZUb0ljb25GYW1pbHlfMj1jYXN0PUljb25GYW1pbHlIYW5kbGUgKgotCi1PU19Jbml0Q29udGV4dHVhbE1lbnVzPQotCi1PU19Jbml0Q3Vyc29yPQotCi1PU19Jbml0RGF0YUJyb3dzZXJDYWxsYmFja3M9Ci1PU19Jbml0RGF0YUJyb3dzZXJDYWxsYmFja3NfMD1jYXN0PShEYXRhQnJvd3NlckNhbGxiYWNrcyAqKSxmbGFncz1pbml0Ci0KLU9TX0luaXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrcz0KLU9TX0luaXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc18wPQotCi1PU19JbnNlcnRNZW51PQotT1NfSW5zZXJ0TWVudV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19JbnNlcnRNZW51XzE9Y2FzdD0oTWVudUlEKQotCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmc9Ci1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMj1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzM9Y2FzdD0oTWVudUl0ZW1BdHRyaWJ1dGVzKQotT1NfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzQ9Y2FzdD0oTWVudUNvbW1hbmQpCi0KLU9TX0luc3RhbGxFdmVudEhhbmRsZXI9Ci1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzA9Y2FzdD0oRXZlbnRUYXJnZXRSZWYpCi1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzE9Y2FzdD0oRXZlbnRIYW5kbGVyVVBQKQotT1NfSW5zdGFsbEV2ZW50SGFuZGxlcl8yPWNhc3Q9KFVJbnQzMikKLU9TX0luc3RhbGxFdmVudEhhbmRsZXJfMz1jYXN0PShjb25zdCBFdmVudFR5cGVTcGVjICopCi1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzQ9Y2FzdD0odm9pZCAqKQotT1NfSW5zdGFsbEV2ZW50SGFuZGxlcl81PWNhc3Q9KEV2ZW50SGFuZGxlclJlZiAqKQotCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyPQotT1NfSW5zdGFsbEV2ZW50TG9vcElkbGVUaW1lcl8wPWNhc3Q9KEV2ZW50TG9vcFJlZikKLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXJfMT1jYXN0PShFdmVudFRpbWVySW50ZXJ2YWwpCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyXzI9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotT1NfSW5zdGFsbEV2ZW50TG9vcElkbGVUaW1lcl8zPWNhc3Q9KEV2ZW50TG9vcElkbGVUaW1lclVQUCkKLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXJfND1jYXN0PSh2b2lkICopCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyXzU9Y2FzdD0oRXZlbnRMb29wVGltZXJSZWYgKikKLQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyPQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzA9Y2FzdD0oRXZlbnRMb29wUmVmKQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzE9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzI9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotT1NfSW5zdGFsbEV2ZW50TG9vcFRpbWVyXzM9Y2FzdD0oRXZlbnRMb29wVGltZXJVUFApCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfND1jYXN0PSh2b2lkICopCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfNT1jYXN0PShFdmVudExvb3BUaW1lclJlZiAqKQotCi1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXI9Ci1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXJfMD1jYXN0PShEcmFnUmVjZWl2ZUhhbmRsZXJVUFApCi1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXJfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnN0YWxsUmVjZWl2ZUhhbmRsZXJfMj1jYXN0PSh2b2lkICopCi0KLU9TX0luc3RhbGxUcmFja2luZ0hhbmRsZXI9Ci1PU19JbnN0YWxsVHJhY2tpbmdIYW5kbGVyXzA9Y2FzdD0oRHJhZ1RyYWNraW5nSGFuZGxlclVQUCkKLU9TX0luc3RhbGxUcmFja2luZ0hhbmRsZXJfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnN0YWxsVHJhY2tpbmdIYW5kbGVyXzI9Y2FzdD0odm9pZCAqKQotCi1PU19JbnZhbFdpbmRvd1JlY3Q9Ci1PU19JbnZhbFdpbmRvd1JlY3RfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnZhbFdpbmRvd1JlY3RfMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0ludmFsV2luZG93UmduPQotT1NfSW52YWxXaW5kb3dSZ25fMD1jYXN0PShXaW5kb3dSZWYpCi1PU19JbnZhbFdpbmRvd1Jnbl8xPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfSW52ZXJ0UmVjdD0KLU9TX0ludmVydFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0ludmVydFJnbj0KLU9TX0ludmVydFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfSXNDb250cm9sQWN0aXZlPQotT1NfSXNDb250cm9sQWN0aXZlXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfSXNDb250cm9sRW5hYmxlZD0KLU9TX0lzQ29udHJvbEVuYWJsZWRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19Jc0NvbnRyb2xWaXNpYmxlPQotT1NfSXNDb250cm9sVmlzaWJsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQ9Ci1PU19Jc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWRfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLQotT1NfSXNNZW51Q29tbWFuZEVuYWJsZWQ9Ci1PU19Jc01lbnVDb21tYW5kRW5hYmxlZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19Jc01lbnVDb21tYW5kRW5hYmxlZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19Jc01lbnVJdGVtRW5hYmxlZD0KLU9TX0lzTWVudUl0ZW1FbmFibGVkXzA9Y2FzdD0oTWVudVJlZikKLU9TX0lzTWVudUl0ZW1FbmFibGVkXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfSXNWYWxpZENvbnRyb2xIYW5kbGU9Ci1PU19Jc1ZhbGlkQ29udHJvbEhhbmRsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0lzVmFsaWRNZW51PQotT1NfSXNWYWxpZE1lbnVfMD1jYXN0PShNZW51UmVmKQotCi1PU19Jc1ZhbGlkV2luZG93UHRyPQotT1NfSXNWYWxpZFdpbmRvd1B0cl8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dBY3RpdmU9Ci1PU19Jc1dpbmRvd0FjdGl2ZV8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dDb2xsYXBzZWQ9Ci1PU19Jc1dpbmRvd0NvbGxhcHNlZF8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dWaXNpYmxlPQotT1NfSXNXaW5kb3dWaXNpYmxlXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19KTklHZXRPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi1PU19KTklHZXRPYmplY3RfMD0KLQotT1NfS2V5VHJhbnNsYXRlPQotT1NfS2V5VHJhbnNsYXRlXzA9Y2FzdD1jb25zdCB2b2lkICoKLU9TX0tleVRyYW5zbGF0ZV8xPQotT1NfS2V5VHJhbnNsYXRlXzI9Y2FzdD1VSW50MzIgKgotCi1PU19LaWxsUG9seT0KLU9TX0tpbGxQb2x5XzA9Y2FzdD0oUG9seUhhbmRsZSkKLQotT1NfTGluZVRvPQotT1NfTGluZVRvXzA9Y2FzdD0oc2hvcnQpCi1PU19MaW5lVG9fMT1jYXN0PShzaG9ydCkKLQotT1NfTG9Xb3JkPQotT1NfTG9Xb3JkXzA9Ci0KLU9TX0xvY2tQb3J0Qml0cz0KLU9TX0xvY2tQb3J0Qml0c18wPWNhc3Q9KEdyYWZQdHIpCi0KLU9TX0xvbmcyRml4PQotT1NfTG9uZzJGaXhfMD0KLQotT1NfTWVudVNlbGVjdD0KLU9TX01lbnVTZWxlY3RfMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLQotT1NfTW92ZUNvbnRyb2w9Ci1PU19Nb3ZlQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Nb3ZlQ29udHJvbF8xPWNhc3Q9KFNJbnQxNikKLU9TX01vdmVDb250cm9sXzI9Y2FzdD0oU0ludDE2KQotCi1PU19Nb3ZlVG89Ci1PU19Nb3ZlVG9fMD1jYXN0PShzaG9ydCkKLU9TX01vdmVUb18xPWNhc3Q9KHNob3J0KQotCi1PU19Nb3ZlV2luZG93PQotT1NfTW92ZVdpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX01vdmVXaW5kb3dfMT1jYXN0PShzaG9ydCkKLU9TX01vdmVXaW5kb3dfMj1jYXN0PShzaG9ydCkKLU9TX01vdmVXaW5kb3dfMz1jYXN0PShCb29sZWFuKQotCi1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2c9Ci1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2dfMD1jYXN0PShjb25zdCBOYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnMgKikKLU9TX05hdkNyZWF0ZUNob29zZUZvbGRlckRpYWxvZ18xPWNhc3Q9KE5hdkV2ZW50VVBQKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzI9Y2FzdD0oTmF2T2JqZWN0RmlsdGVyVVBQKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzM9Y2FzdD0odm9pZCAqKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzQ9Y2FzdD0oTmF2RGlhbG9nUmVmICopCi0KLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2c9Ci1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzA9Y2FzdD0oY29uc3QgTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zICopCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzE9Y2FzdD0oTmF2VHlwZUxpc3RIYW5kbGUpCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzI9Y2FzdD0oTmF2RXZlbnRVUFApCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzM9Y2FzdD0oTmF2UHJldmlld1VQUCkKLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfND1jYXN0PShOYXZPYmplY3RGaWx0ZXJVUFApCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzU9Y2FzdD0odm9pZCAqKQotT1NfTmF2Q3JlYXRlR2V0RmlsZURpYWxvZ182PWNhc3Q9KE5hdkRpYWxvZ1JlZiAqKQotCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nPQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ18wPWNhc3Q9KGNvbnN0IE5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9ucyAqKQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ18xPWNhc3Q9KE9TVHlwZSkKLU9TX05hdkNyZWF0ZVB1dEZpbGVEaWFsb2dfMj1jYXN0PShPU1R5cGUpCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzM9Y2FzdD0oTmF2RXZlbnRVUFApCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzQ9Y2FzdD0odm9pZCAqKQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ181PWNhc3Q9KE5hdkRpYWxvZ1JlZiAqKQotCi1PU19OYXZEaWFsb2dEaXNwb3NlPQotT1NfTmF2RGlhbG9nRGlzcG9zZV8wPWNhc3Q9KE5hdkRpYWxvZ1JlZikKLQotT1NfTmF2RGlhbG9nR2V0UmVwbHk9Ci1PU19OYXZEaWFsb2dHZXRSZXBseV8wPWNhc3Q9KE5hdkRpYWxvZ1JlZikKLU9TX05hdkRpYWxvZ0dldFJlcGx5XzE9Y2FzdD0oTmF2UmVwbHlSZWNvcmQgKikKLQotT1NfTmF2RGlhbG9nR2V0U2F2ZUZpbGVOYW1lPQotT1NfTmF2RGlhbG9nR2V0U2F2ZUZpbGVOYW1lXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotCi1PU19OYXZEaWFsb2dHZXRVc2VyQWN0aW9uPQotT1NfTmF2RGlhbG9nR2V0VXNlckFjdGlvbl8wPWNhc3Q9KE5hdkRpYWxvZ1JlZikKLQotT1NfTmF2RGlhbG9nUnVuPQotT1NfTmF2RGlhbG9nUnVuXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotCi1PU19OYXZEaWFsb2dTZXRGaWx0ZXJUeXBlSWRlbnRpZmllcnM9ZmxhZ3M9ZHluYW1pYwotT1NfTmF2RGlhbG9nU2V0RmlsdGVyVHlwZUlkZW50aWZpZXJzXzA9Ci1PU19OYXZEaWFsb2dTZXRGaWx0ZXJUeXBlSWRlbnRpZmllcnNfMT0KLQotT1NfTmF2RGlhbG9nU2V0U2F2ZUZpbGVOYW1lPQotT1NfTmF2RGlhbG9nU2V0U2F2ZUZpbGVOYW1lXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotT1NfTmF2RGlhbG9nU2V0U2F2ZUZpbGVOYW1lXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX05hdkdldERlZmF1bHREaWFsb2dDcmVhdGlvbk9wdGlvbnM9Ci1PU19OYXZHZXREZWZhdWx0RGlhbG9nQ3JlYXRpb25PcHRpb25zXzA9Y2FzdD0oTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zICopCi0KLU9TX05ld0NvbnRyb2w9Ci1PU19OZXdDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfTmV3Q29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX05ld0NvbnRyb2xfMj1jYXN0PShDb25zdFN0cjI1NVBhcmFtKQotT1NfTmV3Q29udHJvbF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19OZXdDb250cm9sXzQ9Y2FzdD0oU0ludDE2KQotT1NfTmV3Q29udHJvbF81PWNhc3Q9KFNJbnQxNikKLU9TX05ld0NvbnRyb2xfNj1jYXN0PShTSW50MTYpCi1PU19OZXdDb250cm9sXzc9Y2FzdD0oU0ludDE2KQotT1NfTmV3Q29udHJvbF84PWNhc3Q9KFNJbnQzMikKLQotT1NfTmV3RHJhZz0KLU9TX05ld0RyYWdfMD1jYXN0PShEcmFnUmVmICopCi0KLU9TX05ld0dXb3JsZEZyb21QdHI9Ci1PU19OZXdHV29ybGRGcm9tUHRyXzA9Y2FzdD0oR1dvcmxkUHRyICopCi1PU19OZXdHV29ybGRGcm9tUHRyXzE9Y2FzdD0odW5zaWduZWQgbG9uZykKLU9TX05ld0dXb3JsZEZyb21QdHJfMj1jYXN0PShjb25zdCBSZWN0ICopCi1PU19OZXdHV29ybGRGcm9tUHRyXzM9Y2FzdD0oQ1RhYkhhbmRsZSkKLU9TX05ld0dXb3JsZEZyb21QdHJfND1jYXN0PShHREhhbmRsZSkKLU9TX05ld0dXb3JsZEZyb21QdHJfNT1jYXN0PShHV29ybGRGbGFncykKLU9TX05ld0dXb3JsZEZyb21QdHJfNj1jYXN0PShQdHIpCi1PU19OZXdHV29ybGRGcm9tUHRyXzc9Y2FzdD0obG9uZykKLQotT1NfTmV3R2xvYmFsUmVmPWZsYWdzPW5vX2dlbgotT1NfTmV3R2xvYmFsUmVmXzA9Ci0KLU9TX05ld0hhbmRsZT0KLU9TX05ld0hhbmRsZV8wPWNhc3Q9KFNpemUpCi0KLU9TX05ld0hhbmRsZUNsZWFyPQotT1NfTmV3SGFuZGxlQ2xlYXJfMD1jYXN0PShTaXplKQotCi1PU19OZXdQdHI9Ci1PU19OZXdQdHJfMD1jYXN0PShTaXplKQotCi1PU19OZXdQdHJDbGVhcj0KLU9TX05ld1B0ckNsZWFyXzA9Y2FzdD0oU2l6ZSkKLQotT1NfTmV3UmduPQotCi1PU19PZmZzZXRSZWN0PQotT1NfT2Zmc2V0UmVjdF8wPQotT1NfT2Zmc2V0UmVjdF8xPQotT1NfT2Zmc2V0UmVjdF8yPQotCi1PU19PZmZzZXRSZ249Ci1PU19PZmZzZXRSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19PZmZzZXRSZ25fMT1jYXN0PShzaG9ydCkKLU9TX09mZnNldFJnbl8yPWNhc3Q9KHNob3J0KQotCi1PU19PcGVuRGF0YUJyb3dzZXJDb250YWluZXI9Ci1PU19PcGVuRGF0YUJyb3dzZXJDb250YWluZXJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX09wZW5Qb2x5PQotCi1PU19PcGVuUmduPQotCi1PU19QTUNyZWF0ZVBhZ2VGb3JtYXQ9Ci1PU19QTUNyZWF0ZVBhZ2VGb3JtYXRfMD1jYXN0PShQTVBhZ2VGb3JtYXQgKikKLQotT1NfUE1DcmVhdGVQcmludFNldHRpbmdzPQotT1NfUE1DcmVhdGVQcmludFNldHRpbmdzXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzICopCi0KLU9TX1BNQ3JlYXRlU2Vzc2lvbj0KLU9TX1BNQ3JlYXRlU2Vzc2lvbl8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uICopCi0KLU9TX1BNRmxhdHRlblBhZ2VGb3JtYXQ9Ci1PU19QTUZsYXR0ZW5QYWdlRm9ybWF0XzA9Y2FzdD1QTVBhZ2VGb3JtYXQKLU9TX1BNRmxhdHRlblBhZ2VGb3JtYXRfMT1jYXN0PUhhbmRsZSAqCi0KLU9TX1BNRmxhdHRlblByaW50U2V0dGluZ3M9Ci1PU19QTUZsYXR0ZW5QcmludFNldHRpbmdzXzA9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNRmxhdHRlblByaW50U2V0dGluZ3NfMT1jYXN0PUhhbmRsZSAqCi0KLU9TX1BNR2V0QWRqdXN0ZWRQYWdlUmVjdD0KLU9TX1BNR2V0QWRqdXN0ZWRQYWdlUmVjdF8wPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNR2V0QWRqdXN0ZWRQYWdlUmVjdF8xPWNhc3Q9KFBNUmVjdCAqKQotCi1PU19QTUdldEFkanVzdGVkUGFwZXJSZWN0PQotT1NfUE1HZXRBZGp1c3RlZFBhcGVyUmVjdF8wPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNR2V0QWRqdXN0ZWRQYXBlclJlY3RfMT1jYXN0PShQTVJlY3QgKikKLQotT1NfUE1HZXRDb2xsYXRlPQotT1NfUE1HZXRDb2xsYXRlXzA9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNR2V0Q29sbGF0ZV8xPQotCi1PU19QTUdldENvcGllcz0KLU9TX1BNR2V0Q29waWVzXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRDb3BpZXNfMT1jYXN0PShVSW50MzIgKikKLQotT1NfUE1HZXRGaXJzdFBhZ2U9Ci1PU19QTUdldEZpcnN0UGFnZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNR2V0Rmlyc3RQYWdlXzE9Y2FzdD0oVUludDMyICopCi0KLU9TX1BNR2V0Sm9iTmFtZUNGU3RyaW5nPQotT1NfUE1HZXRKb2JOYW1lQ0ZTdHJpbmdfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTUdldEpvYk5hbWVDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX1BNR2V0TGFzdFBhZ2U9Ci1PU19QTUdldExhc3RQYWdlXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRMYXN0UGFnZV8xPWNhc3Q9KFVJbnQzMiAqKQotCi1PU19QTUdldFBhZ2VSYW5nZT0KLU9TX1BNR2V0UGFnZVJhbmdlXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRQYWdlUmFuZ2VfMT1jYXN0PShVSW50MzIgKikKLU9TX1BNR2V0UGFnZVJhbmdlXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX1BNR2V0UmVzb2x1dGlvbj0KLU9TX1BNR2V0UmVzb2x1dGlvbl8wPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNR2V0UmVzb2x1dGlvbl8xPWNhc3Q9KFBNUmVzb2x1dGlvbiAqKQotCi1PU19QTVJlbGVhc2U9Ci1PU19QTVJlbGVhc2VfMD1jYXN0PShQTU9iamVjdCkKLQotT1NfUE1TZXNzaW9uQmVnaW5Eb2N1bWVudE5vRGlhbG9nPQotT1NfUE1TZXNzaW9uQmVnaW5Eb2N1bWVudE5vRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25CZWdpbkRvY3VtZW50Tm9EaWFsb2dfMT1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNlc3Npb25CZWdpbkRvY3VtZW50Tm9EaWFsb2dfMj1jYXN0PShQTVBhZ2VGb3JtYXQpCi0KLU9TX1BNU2Vzc2lvbkJlZ2luUGFnZU5vRGlhbG9nPQotT1NfUE1TZXNzaW9uQmVnaW5QYWdlTm9EaWFsb2dfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvbkJlZ2luUGFnZU5vRGlhbG9nXzE9Y2FzdD0oUE1QYWdlRm9ybWF0KQotT1NfUE1TZXNzaW9uQmVnaW5QYWdlTm9EaWFsb2dfMj1jYXN0PShjb25zdCBQTVJlY3QgKikKLQotT1NfUE1TZXNzaW9uQ29weURlc3RpbmF0aW9uTG9jYXRpb249Ci1PU19QTVNlc3Npb25Db3B5RGVzdGluYXRpb25Mb2NhdGlvbl8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvbkNvcHlEZXN0aW5hdGlvbkxvY2F0aW9uXzE9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNU2Vzc2lvbkNvcHlEZXN0aW5hdGlvbkxvY2F0aW9uXzI9Y2FzdD0oQ0ZVUkxSZWYgKikKLQotT1NfUE1TZXNzaW9uQ3JlYXRlUHJpbnRlckxpc3Q9Ci1PU19QTVNlc3Npb25DcmVhdGVQcmludGVyTGlzdF8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0XzE9Y2FzdD1DRkFycmF5UmVmICoKLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0XzI9Y2FzdD1DRkluZGV4ICoKLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0XzM9Y2FzdD1QTVByaW50ZXIgKgotCi1PU19QTVNlc3Npb25EZWZhdWx0UGFnZUZvcm1hdD0KLU9TX1BNU2Vzc2lvbkRlZmF1bHRQYWdlRm9ybWF0XzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25EZWZhdWx0UGFnZUZvcm1hdF8xPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLQotT1NfUE1TZXNzaW9uRGVmYXVsdFByaW50U2V0dGluZ3M9Ci1PU19QTVNlc3Npb25EZWZhdWx0UHJpbnRTZXR0aW5nc18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uRGVmYXVsdFByaW50U2V0dGluZ3NfMT1jYXN0PShQTVByaW50U2V0dGluZ3MpCi0KLU9TX1BNU2Vzc2lvbkVuZERvY3VtZW50Tm9EaWFsb2c9Ci1PU19QTVNlc3Npb25FbmREb2N1bWVudE5vRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi0KLU9TX1BNU2Vzc2lvbkVuZFBhZ2VOb0RpYWxvZz0KLU9TX1BNU2Vzc2lvbkVuZFBhZ2VOb0RpYWxvZ18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotCi1PU19QTVNlc3Npb25FcnJvcj0KLU9TX1BNU2Vzc2lvbkVycm9yXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi0KLU9TX1BNU2Vzc2lvbkdldERlc3RpbmF0aW9uVHlwZT0KLU9TX1BNU2Vzc2lvbkdldERlc3RpbmF0aW9uVHlwZV8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvbkdldERlc3RpbmF0aW9uVHlwZV8xPWNhc3Q9UE1QcmludFNldHRpbmdzCi1PU19QTVNlc3Npb25HZXREZXN0aW5hdGlvblR5cGVfMj1jYXN0PShQTURlc3RpbmF0aW9uVHlwZSAqKQotCi1PU19QTVNlc3Npb25HZXRHcmFwaGljc0NvbnRleHQ9Ci1PU19QTVNlc3Npb25HZXRHcmFwaGljc0NvbnRleHRfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvbkdldEdyYXBoaWNzQ29udGV4dF8xPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfUE1TZXNzaW9uR2V0R3JhcGhpY3NDb250ZXh0XzI9Y2FzdD0odm9pZCAqKikKLQotT1NfUE1TZXNzaW9uUGFnZVNldHVwRGlhbG9nPQotT1NfUE1TZXNzaW9uUGFnZVNldHVwRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25QYWdlU2V0dXBEaWFsb2dfMT1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTVNlc3Npb25QYWdlU2V0dXBEaWFsb2dfMj1jYXN0PShCb29sZWFuICopCi0KLU9TX1BNU2Vzc2lvblByaW50RGlhbG9nPQotT1NfUE1TZXNzaW9uUHJpbnREaWFsb2dfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvblByaW50RGlhbG9nXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1TZXNzaW9uUHJpbnREaWFsb2dfMj1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTVNlc3Npb25QcmludERpYWxvZ18zPWNhc3Q9KEJvb2xlYW4gKikKLQotT1NfUE1TZXNzaW9uU2V0Q3VycmVudFByaW50ZXI9Ci1PU19QTVNlc3Npb25TZXRDdXJyZW50UHJpbnRlcl8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvblNldEN1cnJlbnRQcmludGVyXzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19QTVNlc3Npb25TZXREZXN0aW5hdGlvbj0KLU9TX1BNU2Vzc2lvblNldERlc3RpbmF0aW9uXzA9Y2FzdD1QTVByaW50U2Vzc2lvbgotT1NfUE1TZXNzaW9uU2V0RGVzdGluYXRpb25fMT1jYXN0PVBNUHJpbnRTZXR0aW5ncwotT1NfUE1TZXNzaW9uU2V0RGVzdGluYXRpb25fMj1jYXN0PVBNRGVzdGluYXRpb25UeXBlCi1PU19QTVNlc3Npb25TZXREZXN0aW5hdGlvbl8zPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX1BNU2Vzc2lvblNldERlc3RpbmF0aW9uXzQ9Y2FzdD1DRlVSTFJlZgotCi1PU19QTVNlc3Npb25TZXREb2N1bWVudEZvcm1hdEdlbmVyYXRpb249Ci1PU19QTVNlc3Npb25TZXREb2N1bWVudEZvcm1hdEdlbmVyYXRpb25fMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvblNldERvY3VtZW50Rm9ybWF0R2VuZXJhdGlvbl8xPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfUE1TZXNzaW9uU2V0RG9jdW1lbnRGb3JtYXRHZW5lcmF0aW9uXzI9Y2FzdD0oQ0ZBcnJheVJlZikKLU9TX1BNU2Vzc2lvblNldERvY3VtZW50Rm9ybWF0R2VuZXJhdGlvbl8zPWNhc3Q9KENGVHlwZVJlZikKLQotT1NfUE1TZXNzaW9uU2V0RXJyb3I9Ci1PU19QTVNlc3Npb25TZXRFcnJvcl8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uU2V0RXJyb3JfMT0KLQotT1NfUE1TZXNzaW9uVXNlU2hlZXRzPQotT1NfUE1TZXNzaW9uVXNlU2hlZXRzXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25Vc2VTaGVldHNfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19QTVNlc3Npb25Vc2VTaGVldHNfMj1jYXN0PShQTVNoZWV0RG9uZVVQUCkKLQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQYWdlRm9ybWF0PQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQYWdlRm9ybWF0XzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25WYWxpZGF0ZVBhZ2VGb3JtYXRfMT1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTVNlc3Npb25WYWxpZGF0ZVBhZ2VGb3JtYXRfMj1jYXN0PShCb29sZWFuICopCi0KLU9TX1BNU2Vzc2lvblZhbGlkYXRlUHJpbnRTZXR0aW5ncz0KLU9TX1BNU2Vzc2lvblZhbGlkYXRlUHJpbnRTZXR0aW5nc18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQcmludFNldHRpbmdzXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQcmludFNldHRpbmdzXzI9Y2FzdD0oQm9vbGVhbiAqKQotCi1PU19QTVNldENvbGxhdGU9Ci1PU19QTVNldENvbGxhdGVfMD1jYXN0PVBNUHJpbnRTZXR0aW5ncwotT1NfUE1TZXRDb2xsYXRlXzE9Ci0KLU9TX1BNU2V0Rmlyc3RQYWdlPQotT1NfUE1TZXRGaXJzdFBhZ2VfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNldEZpcnN0UGFnZV8xPWNhc3Q9KFVJbnQzMikKLU9TX1BNU2V0Rmlyc3RQYWdlXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfUE1TZXRKb2JOYW1lQ0ZTdHJpbmc9Ci1PU19QTVNldEpvYk5hbWVDRlN0cmluZ18wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2V0Sm9iTmFtZUNGU3RyaW5nXzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19QTVNldExhc3RQYWdlPQotT1NfUE1TZXRMYXN0UGFnZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2V0TGFzdFBhZ2VfMT1jYXN0PShVSW50MzIpCi1PU19QTVNldExhc3RQYWdlXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfUE1TZXRQYWdlUmFuZ2U9Ci1PU19QTVNldFBhZ2VSYW5nZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2V0UGFnZVJhbmdlXzE9Y2FzdD0oVUludDMyKQotT1NfUE1TZXRQYWdlUmFuZ2VfMj1jYXN0PShVSW50MzIpCi0KLU9TX1BNVW5mbGF0dGVuUGFnZUZvcm1hdD0KLU9TX1BNVW5mbGF0dGVuUGFnZUZvcm1hdF8wPWNhc3Q9SGFuZGxlCi1PU19QTVVuZmxhdHRlblBhZ2VGb3JtYXRfMT1jYXN0PVBNUGFnZUZvcm1hdCAqCi0KLU9TX1BNVW5mbGF0dGVuUHJpbnRTZXR0aW5ncz0KLU9TX1BNVW5mbGF0dGVuUHJpbnRTZXR0aW5nc18wPWNhc3Q9SGFuZGxlCi1PU19QTVVuZmxhdHRlblByaW50U2V0dGluZ3NfMT1jYXN0PShQTVByaW50U2V0dGluZ3MgKikKLQotT1NfUGFpbnRPdmFsPQotT1NfUGFpbnRPdmFsXzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19QYWludFBvbHk9Ci1PU19QYWludFBvbHlfMD1jYXN0PShQb2x5SGFuZGxlKQotCi1PU19QYWludFJlY3Q9Ci1PU19QYWludFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1BhaW50Um91bmRSZWN0PQotT1NfUGFpbnRSb3VuZFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi1PU19QYWludFJvdW5kUmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfUGFpbnRSb3VuZFJlY3RfMj1jYXN0PShzaG9ydCkKLQotT1NfUGVuU2l6ZT0KLU9TX1BlblNpemVfMD1jYXN0PShzaG9ydCkKLU9TX1BlblNpemVfMT1jYXN0PShzaG9ydCkKLQotT1NfUGlja0NvbG9yPQotT1NfUGlja0NvbG9yXzA9Y2FzdD0oQ29sb3JQaWNrZXJJbmZvICopCi0KLU9TX1BvcFVwTWVudVNlbGVjdD0KLU9TX1BvcFVwTWVudVNlbGVjdF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19Qb3BVcE1lbnVTZWxlY3RfMT1jYXN0PShzaG9ydCkKLU9TX1BvcFVwTWVudVNlbGVjdF8yPWNhc3Q9KHNob3J0KQotT1NfUG9wVXBNZW51U2VsZWN0XzM9Y2FzdD0oc2hvcnQpCi0KLU9TX1Bvc3RFdmVudD0KLU9TX1Bvc3RFdmVudF8wPWNhc3Q9KEV2ZW50S2luZCkKLU9TX1Bvc3RFdmVudF8xPWNhc3Q9KFVJbnQzMikKLQotT1NfUG9zdEV2ZW50VG9RdWV1ZT0KLU9TX1Bvc3RFdmVudFRvUXVldWVfMD1jYXN0PShFdmVudFF1ZXVlUmVmKQotT1NfUG9zdEV2ZW50VG9RdWV1ZV8xPWNhc3Q9KEV2ZW50UmVmKQotT1NfUG9zdEV2ZW50VG9RdWV1ZV8yPWNhc3Q9KEV2ZW50UHJpb3JpdHkpCi0KLU9TX1B0SW5SZWN0PQotT1NfUHRJblJlY3RfMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLU9TX1B0SW5SZWN0XzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19QdEluUmduPQotT1NfUHRJblJnbl8wPWNhc3Q9KFBvaW50ICopLGZsYWdzPXN0cnVjdAotT1NfUHRJblJnbl8xPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0I9Ci1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl8wPWNhc3Q9KFNjcmFwUmVmKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0JfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl8yPWNhc3Q9KFNjcmFwRmxhdm9yRmxhZ3MpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl8zPWNhc3Q9KFNpemUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0M9Ci1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ18wPWNhc3Q9KFNjcmFwUmVmKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0NfMT1jYXN0PShTY3JhcEZsYXZvclR5cGUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ18yPWNhc3Q9KFNjcmFwRmxhdm9yRmxhZ3MpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ18zPWNhc3Q9KFNpemUpCi1PU19QdXRTY3JhcEZsYXZvcl9fSUlJSV8zQ180PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfUURCZWdpbkNHQ29udGV4dD0KLU9TX1FEQmVnaW5DR0NvbnRleHRfMD1jYXN0PShDR3JhZlB0cikKLU9TX1FEQmVnaW5DR0NvbnRleHRfMT1jYXN0PShDR0NvbnRleHRSZWYgKikKLQotT1NfUURFbmRDR0NvbnRleHQ9Ci1PU19RREVuZENHQ29udGV4dF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfUURFbmRDR0NvbnRleHRfMT1jYXN0PShDR0NvbnRleHRSZWYgKikKLQotT1NfUURGbHVzaFBvcnRCdWZmZXI9Ci1PU19RREZsdXNoUG9ydEJ1ZmZlcl8wPWNhc3Q9KENHcmFmUHRyKQotT1NfUURGbHVzaFBvcnRCdWZmZXJfMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1FER2xvYmFsVG9Mb2NhbFBvaW50PQotT1NfUURHbG9iYWxUb0xvY2FsUG9pbnRfMD1jYXN0PShDR3JhZlB0cikKLU9TX1FER2xvYmFsVG9Mb2NhbFBvaW50XzE9Y2FzdD0oUG9pbnQgKikKLQotT1NfUURMb2NhbFRvR2xvYmFsUG9pbnQ9Ci1PU19RRExvY2FsVG9HbG9iYWxQb2ludF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfUURMb2NhbFRvR2xvYmFsUG9pbnRfMT1jYXN0PShQb2ludCAqKQotCi1PU19RRFJlZ2lvblRvUmVjdHM9Ci1PU19RRFJlZ2lvblRvUmVjdHNfMD1jYXN0PVJnbkhhbmRsZQotT1NfUURSZWdpb25Ub1JlY3RzXzE9Y2FzdD1RRFJlZ2lvblBhcnNlRGlyZWN0aW9uCi1PU19RRFJlZ2lvblRvUmVjdHNfMj1jYXN0PVJlZ2lvblRvUmVjdHNVUFAKLU9TX1FEUmVnaW9uVG9SZWN0c18zPWNhc3Q9dm9pZCAqCi0KLU9TX1FEU2V0RGlydHlSZWdpb249Ci1PU19RRFNldERpcnR5UmVnaW9uXzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19RRFNldERpcnR5UmVnaW9uXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19RRFNldFBhdHRlcm5PcmlnaW49Ci1PU19RRFNldFBhdHRlcm5PcmlnaW5fMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLQotT1NfUURTd2FwVGV4dEZsYWdzPQotT1NfUURTd2FwVGV4dEZsYWdzXzA9Y2FzdD0oVUludDMyKQotCi1PU19SR0JCYWNrQ29sb3I9Ci1PU19SR0JCYWNrQ29sb3JfMD1jYXN0PShjb25zdCBSR0JDb2xvciAqKQotCi1PU19SR0JGb3JlQ29sb3I9Ci1PU19SR0JGb3JlQ29sb3JfMD1jYXN0PShjb25zdCBSR0JDb2xvciAqKQotCi1PU19SZWFkSWNvbkZpbGU9Ci1PU19SZWFkSWNvbkZpbGVfMD1jYXN0PWNvbnN0IEZTU3BlYyAqCi1PU19SZWFkSWNvbkZpbGVfMT1jYXN0PUljb25GYW1pbHlIYW5kbGUgKgotCi1PU19SZWNlaXZlTmV4dEV2ZW50PQotT1NfUmVjZWl2ZU5leHRFdmVudF8wPWNhc3Q9KFVJbnQzMikKLU9TX1JlY2VpdmVOZXh0RXZlbnRfMT1jYXN0PShjb25zdCBFdmVudFR5cGVTcGVjICopCi1PU19SZWNlaXZlTmV4dEV2ZW50XzI9Y2FzdD0oRXZlbnRUaW1lb3V0KQotT1NfUmVjZWl2ZU5leHRFdmVudF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19SZWNlaXZlTmV4dEV2ZW50XzQ9Y2FzdD0oRXZlbnRSZWYgKikKLQotT1NfUmVjdEluUmduPQotT1NfUmVjdEluUmduXzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfUmVjdEluUmduXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19SZWN0UmduPQotT1NfUmVjdFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1JlY3RSZ25fMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1JlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudD0KLQotT1NfUmVsZWFzZUV2ZW50PQotT1NfUmVsZWFzZUV2ZW50XzA9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX1JlbGVhc2VJY29uUmVmPQotT1NfUmVsZWFzZUljb25SZWZfMD1jYXN0PUljb25SZWYKLQotT1NfUmVsZWFzZU1lbnU9Ci1PU19SZWxlYXNlTWVudV8wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX1JlbGVhc2VXaW5kb3c9Ci1PU19SZWxlYXNlV2luZG93XzA9Y2FzdD1XaW5kb3dSZWYKLQotT1NfUmVsZWFzZVdpbmRvd0dyb3VwPQotT1NfUmVsZWFzZVdpbmRvd0dyb3VwXzA9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi0KLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eT0KLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19SZW1vdmVDb250cm9sUHJvcGVydHlfMT0KLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eV8yPQotCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zPQotT1NfUmVtb3ZlRGF0YUJyb3dzZXJJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzI9Y2FzdD0oVUludDMyKQotT1NfUmVtb3ZlRGF0YUJyb3dzZXJJdGVtc18zPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VySXRlbUlEICopCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzQ9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotCi1PU19SZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbj0KLU9TX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLQotT1NfUmVtb3ZlRXZlbnRIYW5kbGVyPQotT1NfUmVtb3ZlRXZlbnRIYW5kbGVyXzA9Y2FzdD0oRXZlbnRIYW5kbGVyUmVmKQotCi1PU19SZW1vdmVFdmVudExvb3BUaW1lcj0KLU9TX1JlbW92ZUV2ZW50TG9vcFRpbWVyXzA9Y2FzdD0oRXZlbnRMb29wVGltZXJSZWYpCi0KLU9TX1JlbW92ZVJlY2VpdmVIYW5kbGVyPQotT1NfUmVtb3ZlUmVjZWl2ZUhhbmRsZXJfMD1jYXN0PShEcmFnUmVjZWl2ZUhhbmRsZXJVUFApCi1PU19SZW1vdmVSZWNlaXZlSGFuZGxlcl8xPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfUmVtb3ZlVHJhY2tpbmdIYW5kbGVyPQotT1NfUmVtb3ZlVHJhY2tpbmdIYW5kbGVyXzA9Y2FzdD0oRHJhZ1RyYWNraW5nSGFuZGxlclVQUCkKLU9TX1JlbW92ZVRyYWNraW5nSGFuZGxlcl8xPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfUmVwb3NpdGlvbldpbmRvdz0KLU9TX1JlcG9zaXRpb25XaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19SZXBvc2l0aW9uV2luZG93XzE9Y2FzdD0oV2luZG93UmVmKQotT1NfUmVwb3NpdGlvbldpbmRvd18yPQotCi1PU19SZXNoYXBlQ3VzdG9tV2luZG93PQotT1NfUmVzaGFwZUN1c3RvbVdpbmRvd18wPWNhc3Q9V2luZG93UmVmCi0KLU9TX1Jlc3RvcmVBcHBsaWNhdGlvbkRvY2tUaWxlSW1hZ2U9Ci0KLU9TX1JldGFpbkV2ZW50PQotT1NfUmV0YWluRXZlbnRfMD1jYXN0PShFdmVudFJlZikKLQotT1NfUmV0YWluTWVudT0KLU9TX1JldGFpbk1lbnVfMD1jYXN0PShNZW51UmVmKQotCi1PU19SZXRhaW5XaW5kb3c9Ci1PU19SZXRhaW5XaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1JldmVhbERhdGFCcm93c2VySXRlbT0KLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19SZXZlYWxEYXRhQnJvd3Nlckl0ZW1fMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8yPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8zPWNhc3Q9KERhdGFCcm93c2VyUmV2ZWFsT3B0aW9ucykKLQotT1NfUnVuU3RhbmRhcmRBbGVydD0KLU9TX1J1blN0YW5kYXJkQWxlcnRfMD1jYXN0PShEaWFsb2dSZWYpCi1PU19SdW5TdGFuZGFyZEFsZXJ0XzE9Y2FzdD0oTW9kYWxGaWx0ZXJVUFApCi1PU19SdW5TdGFuZGFyZEFsZXJ0XzI9Y2FzdD0oRGlhbG9nSXRlbUluZGV4ICopCi0KLU9TX1Njcm9sbFJlY3Q9Ci1PU19TY3JvbGxSZWN0XzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfU2Nyb2xsUmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfU2Nyb2xsUmVjdF8yPWNhc3Q9KHNob3J0KQotT1NfU2Nyb2xsUmVjdF8zPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfU2VjdFJlY3Q9Ci1PU19TZWN0UmVjdF8wPWZsYWdzPW5vX291dAotT1NfU2VjdFJlY3RfMT1mbGFncz1ub19vdXQKLU9TX1NlY3RSZWN0XzI9ZmxhZ3M9bm9faW4KLQotT1NfU2VjdFJnbj0KLU9TX1NlY3RSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi1PU19TZWN0UmduXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfU2VjdFJnbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfU2VsZWN0V2luZG93PQotT1NfU2VsZWN0V2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TZW5kQmVoaW5kPQotT1NfU2VuZEJlaGluZF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NlbmRCZWhpbmRfMT1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQ9Ci1PU19TZW5kRXZlbnRUb0V2ZW50VGFyZ2V0XzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZW5kRXZlbnRUb0V2ZW50VGFyZ2V0XzE9Y2FzdD0oRXZlbnRUYXJnZXRSZWYpCi0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRXaXRoT3B0aW9ucz0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRXaXRoT3B0aW9uc18wPWNhc3Q9RXZlbnRSZWYKLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRXaXRoT3B0aW9uc18xPWNhc3Q9KEV2ZW50VGFyZ2V0UmVmKQotT1NfU2VuZEV2ZW50VG9FdmVudFRhcmdldFdpdGhPcHRpb25zXzI9Ci0KLU9TX1NldEFwcGxpY2F0aW9uRG9ja1RpbGVJbWFnZT0KLU9TX1NldEFwcGxpY2F0aW9uRG9ja1RpbGVJbWFnZV8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93PQotT1NfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvd18xPWNhc3Q9Qm9vbGVhbgotCi1PU19TZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvPQotT1NfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mb18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvXzE9Y2FzdD0oQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvUHRyKQotCi1PU19TZXRDbGlwPQotT1NfU2V0Q2xpcF8wPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfU2V0Q29udHJvbDMyQml0TWF4aW11bT0KLU9TX1NldENvbnRyb2wzMkJpdE1heGltdW1fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbDMyQml0TWF4aW11bV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbDMyQml0TWluaW11bT0KLU9TX1NldENvbnRyb2wzMkJpdE1pbmltdW1fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbDMyQml0TWluaW11bV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbDMyQml0VmFsdWU9Ci1PU19TZXRDb250cm9sMzJCaXRWYWx1ZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sMzJCaXRWYWx1ZV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbEFjdGlvbj0KLU9TX1NldENvbnRyb2xBY3Rpb25fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbEFjdGlvbl8xPWNhc3Q9KENvbnRyb2xBY3Rpb25VUFApCi0KLU9TX1NldENvbnRyb2xCb3VuZHM9Ci1PU19TZXRDb250cm9sQm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xCb3VuZHNfMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1NldENvbnRyb2xDb2xvclByb2M9Ci1PU19TZXRDb250cm9sQ29sb3JQcm9jXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xDb2xvclByb2NfMT1jYXN0PShDb250cm9sQ29sb3JVUFApCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJST0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUlfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUlfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlJXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJSV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMj0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvXzJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMl8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvXzJfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMl8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mb18yXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbFRhYkluZm9SZWNWMV8yPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxXzJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxXzJfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzI9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zQj0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0JfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0JfMz1jYXN0PShTaXplKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0JfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNJPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zSV8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zSV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM1M9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU18xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRm9udFN0eWxlPQotT1NfU2V0Q29udHJvbEZvbnRTdHlsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRm9udFN0eWxlXzE9Y2FzdD0oY29uc3QgQ29udHJvbEZvbnRTdHlsZVJlYyAqKQotCi1PU19TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlPQotT1NfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlXzE9Y2FzdD0oTWVudVJlZikKLQotT1NfU2V0Q29udHJvbFByb3BlcnR5PQotT1NfU2V0Q29udHJvbFByb3BlcnR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xQcm9wZXJ0eV8xPQotT1NfU2V0Q29udHJvbFByb3BlcnR5XzI9Ci1PU19TZXRDb250cm9sUHJvcGVydHlfMz0KLU9TX1NldENvbnRyb2xQcm9wZXJ0eV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbFJlZmVyZW5jZT0KLU9TX1NldENvbnRyb2xSZWZlcmVuY2VfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbFJlZmVyZW5jZV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nPQotT1NfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXRDb250cm9sVmlld1NpemU9Ci1PU19TZXRDb250cm9sVmlld1NpemVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbFZpZXdTaXplXzE9Y2FzdD0oU0ludDMyKQotCi1PU19TZXRDb250cm9sVmlzaWJpbGl0eT0KLU9TX1NldENvbnRyb2xWaXNpYmlsaXR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xWaXNpYmlsaXR5XzE9Ci1PU19TZXRDb250cm9sVmlzaWJpbGl0eV8yPQotCi1PU19TZXRDdXJzb3I9Ci1PU19TZXRDdXJzb3JfMD1jYXN0PShjb25zdCBDdXJzb3IgKikKLQotT1NfU2V0RGF0YUJyb3dzZXJDYWxsYmFja3M9Ci1PU19TZXREYXRhQnJvd3NlckNhbGxiYWNrc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlckNhbGxiYWNrc18xPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VyQ2FsbGJhY2tzICopLGZsYWdzPWluaXQKLQotT1NfU2V0RGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3M9Ci1PU19TZXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc18xPQotCi1PU19TZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnM9Ci1PU19TZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzXzE9Y2FzdD0oQm9vbGVhbikKLU9TX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFyc18yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFCb29sZWFuVmFsdWU9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQm9vbGVhblZhbHVlXzA9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVJlZikKLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFCb29sZWFuVmFsdWVfMT1jYXN0PShCb29sZWFuKQotCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQnV0dG9uVmFsdWU9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQnV0dG9uVmFsdWVfMD1jYXN0PShEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlXzE9Y2FzdD0oVGhlbWVCdXR0b25WYWx1ZSkKLQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUljb249Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSWNvbl8wPWNhc3Q9KERhdGFCcm93c2VySXRlbURhdGFSZWYpCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSWNvbl8xPWNhc3Q9KEljb25SZWYpCi0KLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFJdGVtSUQ9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSXRlbUlEXzA9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVJlZikKLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFJdGVtSURfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YVRleHQ9Ci1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhVGV4dF8wPWNhc3Q9KERhdGFCcm93c2VySXRlbURhdGFSZWYpCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhVGV4dF8xPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbj0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodD0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodF8xPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2M9Ci1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY18xPQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMj0KLQotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzPQotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzA9Y2FzdD1Db250cm9sUmVmCi1PU19TZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NfMT1jYXN0PURhdGFCcm93c2VyUHJvcGVydHlJRAotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzI9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKQotCi1PU19TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uPQotT1NfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzE9Y2FzdD0oVUludDMyKQotT1NfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8yPWNhc3Q9KFVJbnQzMikKLQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zPQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyU2VsZWN0ZWRJdGVtc18xPWNhc3Q9KFVJbnQzMikKLU9TX1NldERhdGFCcm93c2VyU2VsZWN0ZWRJdGVtc18yPWNhc3Q9KGNvbnN0IERhdGFCcm93c2VySXRlbUlEICopCi1PU19TZXREYXRhQnJvd3NlclNlbGVjdGVkSXRlbXNfMz1jYXN0PShEYXRhQnJvd3NlclNldE9wdGlvbikKLQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncz0KLU9TX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFnc18xPWNhc3Q9KERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpCi0KLU9TX1NldERhdGFCcm93c2VyU29ydE9yZGVyPQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXJfMT0KLQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHk9Ci1PU19TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eV8xPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbj0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8xPQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8yPQotCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlPQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlXzE9Ci0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdz0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMT0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18yPQotCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGg9Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGhfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoXzE9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JRCkKLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aF8yPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQ9Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodF8xPQotCi1PU19TZXREYXRhQnJvd3NlclRhcmdldD0KLU9TX1NldERhdGFCcm93c2VyVGFyZ2V0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyVGFyZ2V0XzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX1NldERyYWdBbGxvd2FibGVBY3Rpb25zPQotT1NfU2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMD1jYXN0PShEcmFnUmVmKQotT1NfU2V0RHJhZ0FsbG93YWJsZUFjdGlvbnNfMT1jYXN0PShEcmFnQWN0aW9ucykKLU9TX1NldERyYWdBbGxvd2FibGVBY3Rpb25zXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0RHJhZ0Ryb3BBY3Rpb249Ci1PU19TZXREcmFnRHJvcEFjdGlvbl8wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnRHJvcEFjdGlvbl8xPWNhc3Q9KERyYWdBY3Rpb25zKQotCi1PU19TZXREcmFnSW5wdXRQcm9jPQotT1NfU2V0RHJhZ0lucHV0UHJvY18wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnSW5wdXRQcm9jXzE9Y2FzdD0oRHJhZ0lucHV0VVBQKQotT1NfU2V0RHJhZ0lucHV0UHJvY18yPWNhc3Q9KHZvaWQgKikKLQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhPQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV8xPWNhc3Q9KERyYWdJdGVtUmVmKQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV8zPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV80PWNhc3Q9KFNpemUpCi1PU19TZXREcmFnSXRlbUZsYXZvckRhdGFfNT1jYXN0PShVSW50MzIpCi0KLU9TX1NldERyYWdTZW5kUHJvYz0KLU9TX1NldERyYWdTZW5kUHJvY18wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnU2VuZFByb2NfMT1jYXN0PShEcmFnU2VuZERhdGFVUFApCi1PU19TZXREcmFnU2VuZFByb2NfMj1jYXN0PSh2b2lkICopCi0KLU9TX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lPQotT1NfU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWVfMD1jYXN0PShFdmVudExvb3BUaW1lclJlZikKLU9TX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lXzE9Y2FzdD0oRXZlbnRUaW1lckludGVydmFsKQotCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMj0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzI9Ci1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0M9Ci1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zQ18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNDXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zQ18zPWNhc3Q9KFVJbnQzMikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNDXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zST0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNJXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zSV8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0lfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNJXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0lfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNTPQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1NfMD1jYXN0PShFdmVudFJlZikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNTXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zU18yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1NfMz1jYXN0PShVSW50MzIpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zU180PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb249Ci1PU19TZXRGb250SW5mb0ZvclNlbGVjdGlvbl8wPWNhc3Q9KE9TVHlwZSkKLU9TX1NldEZvbnRJbmZvRm9yU2VsZWN0aW9uXzE9Y2FzdD0oVUludDMyKQotT1NfU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb25fMj1jYXN0PSh2b2lkICopCi1PU19TZXRGb250SW5mb0ZvclNlbGVjdGlvbl8zPWNhc3Q9dm9pZCAqCi0KLU9TX1NldEZyb250UHJvY2Vzcz0KLU9TX1NldEZyb250UHJvY2Vzc18wPWNhc3Q9KGNvbnN0IFByb2Nlc3NTZXJpYWxOdW1iZXIgKikKLQotT1NfU2V0RnJvbnRQcm9jZXNzV2l0aE9wdGlvbnM9Ci1PU19TZXRGcm9udFByb2Nlc3NXaXRoT3B0aW9uc18wPWNhc3Q9KGNvbnN0IFByb2Nlc3NTZXJpYWxOdW1iZXIgKikKLU9TX1NldEZyb250UHJvY2Vzc1dpdGhPcHRpb25zXzE9Ci0KLU9TX1NldEdXb3JsZD0KLU9TX1NldEdXb3JsZF8wPWNhc3Q9KENHcmFmUHRyKQotT1NfU2V0R1dvcmxkXzE9Y2FzdD0oR0RIYW5kbGUpCi0KLU9TX1NldEljb25GYW1pbHlEYXRhPQotT1NfU2V0SWNvbkZhbWlseURhdGFfMD1jYXN0PUljb25GYW1pbHlIYW5kbGUKLU9TX1NldEljb25GYW1pbHlEYXRhXzE9Y2FzdD1PU1R5cGUKLU9TX1NldEljb25GYW1pbHlEYXRhXzI9Y2FzdD1IYW5kbGUKLQotT1NfU2V0SXRlbU1hcms9Ci1PU19TZXRJdGVtTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRJdGVtTWFya18xPQotT1NfU2V0SXRlbU1hcmtfMj0KLQotT1NfU2V0S2V5Ym9hcmRGb2N1cz0KLU9TX1NldEtleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRLZXlib2FyZEZvY3VzXzE9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldEtleWJvYXJkRm9jdXNfMj1jYXN0PShDb250cm9sRm9jdXNQYXJ0KQotCi1PU19TZXRNZW51Q29tbWFuZE1hcms9Ci1PU19TZXRNZW51Q29tbWFuZE1hcmtfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUNvbW1hbmRNYXJrXzE9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19TZXRNZW51Q29tbWFuZE1hcmtfMj1jYXN0PShVbmlDaGFyKQotCi1PU19TZXRNZW51Rm9udD0KLU9TX1NldE1lbnVGb250XzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVGb250XzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUZvbnRfMj1jYXN0PShVSW50MTYpCi0KLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleT0KLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRNZW51SXRlbUNvbW1hbmRLZXlfMT1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfU2V0TWVudUl0ZW1Db21tYW5kS2V5XzI9Y2FzdD0oQm9vbGVhbikKLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleV8zPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51PQotT1NfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudV8xPWNhc3Q9KE1lbnVJdGVtSW5kZXgpCi1PU19TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnVfMj1jYXN0PShNZW51UmVmKQotCi1PU19TZXRNZW51SXRlbUljb25IYW5kbGU9Ci1PU19TZXRNZW51SXRlbUljb25IYW5kbGVfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUl0ZW1JY29uSGFuZGxlXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUl0ZW1JY29uSGFuZGxlXzI9Y2FzdD0oVUludDgpCi1PU19TZXRNZW51SXRlbUljb25IYW5kbGVfMz1jYXN0PShIYW5kbGUpCi0KLU9TX1NldE1lbnVJdGVtS2V5R2x5cGg9Ci1PU19TZXRNZW51SXRlbUtleUdseXBoXzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtS2V5R2x5cGhfMT1jYXN0PShTSW50MTYpCi1PU19TZXRNZW51SXRlbUtleUdseXBoXzI9Y2FzdD0oU0ludDE2KQotCi1PU19TZXRNZW51SXRlbU1vZGlmaWVycz0KLU9TX1NldE1lbnVJdGVtTW9kaWZpZXJzXzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtTW9kaWZpZXJzXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUl0ZW1Nb2RpZmllcnNfMj1jYXN0PShVSW50OCkKLQotT1NfU2V0TWVudUl0ZW1SZWZDb249Ci1PU19TZXRNZW51SXRlbVJlZkNvbl8wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRNZW51SXRlbVJlZkNvbl8xPWNhc3Q9KFNJbnQxNikKLU9TX1NldE1lbnVJdGVtUmVmQ29uXzI9Y2FzdD0oVUludDMyKQotCi1PU19TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18yPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX1NldE9yaWdpbj0KLU9TX1NldE9yaWdpbl8wPWNhc3Q9KHNob3J0KQotT1NfU2V0T3JpZ2luXzE9Y2FzdD0oc2hvcnQpCi0KLU9TX1NldFBvcnQ9Ci1PU19TZXRQb3J0XzA9Y2FzdD0oR3JhZlB0cikKLQotT1NfU2V0UG9ydEJvdW5kcz0KLU9TX1NldFBvcnRCb3VuZHNfMD1jYXN0PShDR3JhZlB0cikKLU9TX1NldFBvcnRCb3VuZHNfMT1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX1NldFBvcnRXaW5kb3dQb3J0PQotT1NfU2V0UG9ydFdpbmRvd1BvcnRfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NldFB0PQotT1NfU2V0UHRfMD1jYXN0PShQb2ludCAqKQotT1NfU2V0UHRfMT1jYXN0PShzaG9ydCkKLU9TX1NldFB0XzI9Y2FzdD0oc2hvcnQpCi0KLU9TX1NldFJlY3Q9Ci1PU19TZXRSZWN0XzA9Y2FzdD0oUmVjdCAqKQotT1NfU2V0UmVjdF8xPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdF8yPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdF8zPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdF80PWNhc3Q9KHNob3J0KQotCi1PU19TZXRSZWN0UmduPQotT1NfU2V0UmVjdFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1NldFJlY3RSZ25fMT1jYXN0PShzaG9ydCkKLU9TX1NldFJlY3RSZ25fMj1jYXN0PShzaG9ydCkKLU9TX1NldFJlY3RSZ25fMz1jYXN0PShzaG9ydCkKLU9TX1NldFJlY3RSZ25fND1jYXN0PShzaG9ydCkKLQotT1NfU2V0Um9vdE1lbnU9Ci1PU19TZXRSb290TWVudV8wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX1NldFRoZW1lQmFja2dyb3VuZD0KLU9TX1NldFRoZW1lQmFja2dyb3VuZF8wPWNhc3Q9KFRoZW1lQnJ1c2gpCi1PU19TZXRUaGVtZUJhY2tncm91bmRfMT1jYXN0PShTSW50MTYpCi1PU19TZXRUaGVtZUJhY2tncm91bmRfMj1jYXN0PShCb29sZWFuKQotCi1PU19TZXRUaGVtZUN1cnNvcj0KLU9TX1NldFRoZW1lQ3Vyc29yXzA9Y2FzdD0oVGhlbWVDdXJzb3IpCi0KLU9TX1NldFRoZW1lRHJhd2luZ1N0YXRlPQotT1NfU2V0VGhlbWVEcmF3aW5nU3RhdGVfMD1jYXN0PShUaGVtZURyYXdpbmdTdGF0ZSkKLU9TX1NldFRoZW1lRHJhd2luZ1N0YXRlXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0VGhlbWVUZXh0Q29sb3I9Ci1PU19TZXRUaGVtZVRleHRDb2xvcl8wPQotT1NfU2V0VGhlbWVUZXh0Q29sb3JfMT0KLU9TX1NldFRoZW1lVGV4dENvbG9yXzI9Ci0KLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZD0KLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZF8xPWNhc3Q9KFRoZW1lQnJ1c2gpCi1PU19TZXRUaGVtZVdpbmRvd0JhY2tncm91bmRfMj1jYXN0PShCb29sZWFuKQotCi1PU19TZXRVcENvbnRyb2xCYWNrZ3JvdW5kPQotT1NfU2V0VXBDb250cm9sQmFja2dyb3VuZF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRVcENvbnRyb2xCYWNrZ3JvdW5kXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0VXBDb250cm9sQmFja2dyb3VuZF8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldFdSZWZDb249Ci1PU19TZXRXUmVmQ29uXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V1JlZkNvbl8xPWNhc3Q9KGxvbmcpCi0KLU9TX1NldFdpbmRvd0FjdGl2YXRpb25TY29wZT0KLU9TX1NldFdpbmRvd0FjdGl2YXRpb25TY29wZV8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd0FjdGl2YXRpb25TY29wZV8xPWNhc3Q9KFdpbmRvd0FjdGl2YXRpb25TY29wZSkKLQotT1NfU2V0V2luZG93Qm91bmRzPQotT1NfU2V0V2luZG93Qm91bmRzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93Qm91bmRzXzE9Y2FzdD0oV2luZG93UmVnaW9uQ29kZSkKLU9TX1NldFdpbmRvd0JvdW5kc18yPWNhc3Q9KFJlY3QgKikKLQotT1NfU2V0V2luZG93RGVmYXVsdEJ1dHRvbj0KLU9TX1NldFdpbmRvd0RlZmF1bHRCdXR0b25fMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRXaW5kb3dEZWZhdWx0QnV0dG9uXzE9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfU2V0V2luZG93R3JvdXA9Ci1PU19TZXRXaW5kb3dHcm91cF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd0dyb3VwXzE9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi0KLU9TX1NldFdpbmRvd0dyb3VwT3duZXI9Ci1PU19TZXRXaW5kb3dHcm91cE93bmVyXzA9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi1PU19TZXRXaW5kb3dHcm91cE93bmVyXzE9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TZXRXaW5kb3dHcm91cFBhcmVudD0KLU9TX1NldFdpbmRvd0dyb3VwUGFyZW50XzA9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi1PU19TZXRXaW5kb3dHcm91cFBhcmVudF8xPWNhc3Q9KFdpbmRvd0dyb3VwUmVmKQotCi1PU19TZXRXaW5kb3dNb2RhbGl0eT0KLU9TX1NldFdpbmRvd01vZGFsaXR5XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93TW9kYWxpdHlfMT1jYXN0PShXaW5kb3dNb2RhbGl0eSkKLU9TX1NldFdpbmRvd01vZGFsaXR5XzI9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHM9Ci1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHNfMD1jYXN0PVdpbmRvd1JlZgotT1NfU2V0V2luZG93UmVzaXplTGltaXRzXzE9Y2FzdD0oSElTaXplICopCi1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHNfMj1jYXN0PShISVNpemUgKikKLQotT1NfU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZ18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX1Nob3dXaW5kb3c9Ci1PU19TaG93V2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19TaXplQ29udHJvbD0KLU9TX1NpemVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NpemVDb250cm9sXzE9Y2FzdD0oU0ludDE2KQotT1NfU2l6ZUNvbnRyb2xfMj1jYXN0PShTSW50MTYpCi0KLU9TX1NpemVXaW5kb3c9Ci1PU19TaXplV2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2l6ZVdpbmRvd18xPWNhc3Q9KHNob3J0KQotT1NfU2l6ZVdpbmRvd18yPWNhc3Q9KHNob3J0KQotT1NfU2l6ZVdpbmRvd18zPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1N0aWxsRG93bj0KLQotT1NfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0PQotT1NfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0XzE9Y2FzdD0oQ0dyYWZQdHIpCi0KLU9TX1N5c0JlZXA9Ci1PU19TeXNCZWVwXzA9Y2FzdD0oc2hvcnQpCi0KLU9TX1RYTkFjdGl2YXRlPQotT1NfVFhOQWN0aXZhdGVfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5BY3RpdmF0ZV8xPWNhc3Q9KFRYTkZyYW1lSUQpCi1PU19UWE5BY3RpdmF0ZV8yPWNhc3Q9KFRYTlNjcm9sbEJhclN0YXRlKQotCi1PU19UWE5BZGp1c3RDdXJzb3I9Ci1PU19UWE5BZGp1c3RDdXJzb3JfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5BZGp1c3RDdXJzb3JfMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1RYTkNsaWNrPQotT1NfVFhOQ2xpY2tfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5DbGlja18xPWNhc3Q9KGNvbnN0IEV2ZW50UmVjb3JkICopCi0KLU9TX1RYTkNvcHk9Ci1PU19UWE5Db3B5XzA9Y2FzdD0oVFhOT2JqZWN0KQotCi1PU19UWE5DdXQ9Ci1PU19UWE5DdXRfMD1jYXN0PShUWE5PYmplY3QpCi0KLU9TX1RYTkRhdGFTaXplPQotT1NfVFhORGF0YVNpemVfMD1jYXN0PShUWE5PYmplY3QpCi0KLU9TX1RYTkRlbGV0ZU9iamVjdD0KLU9TX1RYTkRlbGV0ZU9iamVjdF8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhORHJhdz0KLU9TX1RYTkRyYXdfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5EcmF3XzE9Y2FzdD0oR1dvcmxkUHRyKQotCi1PU19UWE5FY2hvTW9kZT0KLU9TX1RYTkVjaG9Nb2RlXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhORWNob01vZGVfMT1jYXN0PShVbmlDaGFyKQotT1NfVFhORWNob01vZGVfMj1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19UWE5FY2hvTW9kZV8zPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1RYTkZvY3VzPQotT1NfVFhORm9jdXNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5Gb2N1c18xPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1RYTkdldERhdGE9Ci1PU19UWE5HZXREYXRhXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOR2V0RGF0YV8xPWNhc3Q9KFRYTk9mZnNldCkKLU9TX1RYTkdldERhdGFfMj1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5HZXREYXRhXzM9Y2FzdD0oSGFuZGxlICopCi0KLU9TX1RYTkdldEhJUmVjdD0KLU9TX1RYTkdldEhJUmVjdF8wPWNhc3Q9VFhOT2JqZWN0Ci1PU19UWE5HZXRISVJlY3RfMT0KLU9TX1RYTkdldEhJUmVjdF8yPQotCi1PU19UWE5HZXRMaW5lQ291bnQ9Ci1PU19UWE5HZXRMaW5lQ291bnRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5HZXRMaW5lQ291bnRfMT1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfVFhOR2V0TGluZU1ldHJpY3M9Ci1PU19UWE5HZXRMaW5lTWV0cmljc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldExpbmVNZXRyaWNzXzE9Y2FzdD0oVUludDMyKQotT1NfVFhOR2V0TGluZU1ldHJpY3NfMj1jYXN0PShGaXhlZCAqKQotT1NfVFhOR2V0TGluZU1ldHJpY3NfMz1jYXN0PShGaXhlZCAqKQotCi1PU19UWE5HZXRSZWN0Qm91bmRzPQotT1NfVFhOR2V0UmVjdEJvdW5kc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldFJlY3RCb3VuZHNfMT1jYXN0PShSZWN0ICopCi1PU19UWE5HZXRSZWN0Qm91bmRzXzI9Y2FzdD0oVFhOTG9uZ1JlY3QgKikKLU9TX1RYTkdldFJlY3RCb3VuZHNfMz1jYXN0PShUWE5Mb25nUmVjdCAqKQotCi1PU19UWE5HZXRTZWxlY3Rpb249Ci1PU19UWE5HZXRTZWxlY3Rpb25fMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5HZXRTZWxlY3Rpb25fMT1jYXN0PShUWE5PZmZzZXQgKikKLU9TX1RYTkdldFNlbGVjdGlvbl8yPWNhc3Q9KFRYTk9mZnNldCAqKQotCi1PU19UWE5HZXRUWE5PYmplY3RDb250cm9scz0KLU9TX1RYTkdldFRYTk9iamVjdENvbnRyb2xzXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOR2V0VFhOT2JqZWN0Q29udHJvbHNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5HZXRUWE5PYmplY3RDb250cm9sc18yPWNhc3Q9KGNvbnN0IFRYTkNvbnRyb2xUYWcgKikKLU9TX1RYTkdldFRYTk9iamVjdENvbnRyb2xzXzM9Y2FzdD0oVFhOQ29udHJvbERhdGEgKikKLQotT1NfVFhOR2V0Vmlld1JlY3Q9Ci1PU19UWE5HZXRWaWV3UmVjdF8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldFZpZXdSZWN0XzE9Ci0KLU9TX1RYTkluaXRUZXh0ZW5zaW9uPQotT1NfVFhOSW5pdFRleHRlbnNpb25fMD1jYXN0PShjb25zdCBUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqKQotT1NfVFhOSW5pdFRleHRlbnNpb25fMT1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5Jbml0VGV4dGVuc2lvbl8yPWNhc3Q9KFRYTkluaXRPcHRpb25zKQotCi1PU19UWE5OZXdPYmplY3Q9Ci1PU19UWE5OZXdPYmplY3RfMD1jYXN0PShjb25zdCBGU1NwZWMgKikKLU9TX1RYTk5ld09iamVjdF8xPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1RYTk5ld09iamVjdF8yPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX1RYTk5ld09iamVjdF8zPWNhc3Q9KFRYTkZyYW1lT3B0aW9ucykKLU9TX1RYTk5ld09iamVjdF80PWNhc3Q9KFRYTkZyYW1lVHlwZSkKLU9TX1RYTk5ld09iamVjdF81PWNhc3Q9KFRYTkZpbGVUeXBlKQotT1NfVFhOTmV3T2JqZWN0XzY9Y2FzdD0oVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSkKLU9TX1RYTk5ld09iamVjdF83PWNhc3Q9KFRYTk9iamVjdCAqKQotT1NfVFhOTmV3T2JqZWN0Xzg9Y2FzdD0oVFhORnJhbWVJRCAqKQotT1NfVFhOTmV3T2JqZWN0Xzk9Y2FzdD0oVFhOT2JqZWN0UmVmY29uKQotCi1PU19UWE5PZmZzZXRUb1BvaW50PQotT1NfVFhOT2Zmc2V0VG9Qb2ludF8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTk9mZnNldFRvUG9pbnRfMT1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5PZmZzZXRUb1BvaW50XzI9Y2FzdD0oUG9pbnQgKikKLQotT1NfVFhOUGFzdGU9Ci1PU19UWE5QYXN0ZV8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhOUG9pbnRUb09mZnNldD0KLU9TX1RYTlBvaW50VG9PZmZzZXRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5Qb2ludFRvT2Zmc2V0XzE9ZmxhZ3M9c3RydWN0Ci1PU19UWE5Qb2ludFRvT2Zmc2V0XzI9Y2FzdD0oVFhOT2Zmc2V0ICopCi0KLU9TX1RYTlNlbGVjdEFsbD0KLU9TX1RYTlNlbGVjdEFsbF8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhOU2V0QmFja2dyb3VuZD0KLU9TX1RYTlNldEJhY2tncm91bmRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRCYWNrZ3JvdW5kXzE9Y2FzdD0oY29uc3QgVFhOQmFja2dyb3VuZCAqKQotCi1PU19UWE5TZXREYXRhPQotT1NfVFhOU2V0RGF0YV8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTlNldERhdGFfMT1jYXN0PShUWE5EYXRhVHlwZSkKLU9TX1RYTlNldERhdGFfMj1jYXN0PShjb25zdCB2b2lkICopCi1PU19UWE5TZXREYXRhXzM9Y2FzdD0oQnl0ZUNvdW50KQotT1NfVFhOU2V0RGF0YV80PWNhc3Q9KFRYTk9mZnNldCkKLU9TX1RYTlNldERhdGFfNT1jYXN0PShUWE5PZmZzZXQpCi0KLU9TX1RYTlNldEZyYW1lQm91bmRzPQotT1NfVFhOU2V0RnJhbWVCb3VuZHNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRGcmFtZUJvdW5kc18xPWNhc3Q9KFNJbnQzMikKLU9TX1RYTlNldEZyYW1lQm91bmRzXzI9Y2FzdD0oU0ludDMyKQotT1NfVFhOU2V0RnJhbWVCb3VuZHNfMz1jYXN0PShTSW50MzIpCi1PU19UWE5TZXRGcmFtZUJvdW5kc180PWNhc3Q9KFNJbnQzMikKLU9TX1RYTlNldEZyYW1lQm91bmRzXzU9Y2FzdD0oVFhORnJhbWVJRCkKLQotT1NfVFhOU2V0UmVjdEJvdW5kcz0KLU9TX1RYTlNldFJlY3RCb3VuZHNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRSZWN0Qm91bmRzXzE9Y2FzdD0oUmVjdCAqKQotT1NfVFhOU2V0UmVjdEJvdW5kc18yPWNhc3Q9KFRYTkxvbmdSZWN0ICopCi1PU19UWE5TZXRSZWN0Qm91bmRzXzM9Y2FzdD0oQm9vbGVhbikKLQotT1NfVFhOU2V0U2VsZWN0aW9uPQotT1NfVFhOU2V0U2VsZWN0aW9uXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOU2V0U2VsZWN0aW9uXzE9Y2FzdD0oVFhOT2Zmc2V0KQotT1NfVFhOU2V0U2VsZWN0aW9uXzI9Y2FzdD0oVFhOT2Zmc2V0KQotCi1PU19UWE5TZXRUWE5PYmplY3RDb250cm9scz0KLU9TX1RYTlNldFRYTk9iamVjdENvbnRyb2xzXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOU2V0VFhOT2JqZWN0Q29udHJvbHNfMT1jYXN0PShCb29sZWFuKQotT1NfVFhOU2V0VFhOT2JqZWN0Q29udHJvbHNfMj1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5TZXRUWE5PYmplY3RDb250cm9sc18zPWNhc3Q9KGNvbnN0IFRYTkNvbnRyb2xUYWcgKikKLU9TX1RYTlNldFRYTk9iamVjdENvbnRyb2xzXzQ9Y2FzdD0oY29uc3QgVFhOQ29udHJvbERhdGEgKikKLQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXM9Ci1PU19UWE5TZXRUeXBlQXR0cmlidXRlc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTlNldFR5cGVBdHRyaWJ1dGVzXzE9Y2FzdD0oSXRlbUNvdW50KQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXNfMj1jYXN0PShjb25zdCBUWE5UeXBlQXR0cmlidXRlcyAqKQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXNfMz1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5TZXRUeXBlQXR0cmlidXRlc180PWNhc3Q9KFRYTk9mZnNldCkKLQotT1NfVFhOU2hvd1NlbGVjdGlvbj0KLU9TX1RYTlNob3dTZWxlY3Rpb25fMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TaG93U2VsZWN0aW9uXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfVGVzdENvbnRyb2w9Ci1PU19UZXN0Q29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19UZXN0Q29udHJvbF8xPWNhc3Q9KFBvaW50ICopLGZsYWdzPXN0cnVjdAotCi1PU19UZXh0RmFjZT0KLU9TX1RleHRGYWNlXzA9Y2FzdD0oU3R5bGVQYXJhbWV0ZXIpCi0KLU9TX1RleHRGb250PQotT1NfVGV4dEZvbnRfMD1jYXN0PShzaG9ydCkKLQotT1NfVGV4dE1vZGU9Ci1PU19UZXh0TW9kZV8wPWNhc3Q9KHNob3J0KQotCi1PU19UZXh0U2l6ZT0KLU9TX1RleHRTaXplXzA9Y2FzdD0oc2hvcnQpCi0KLU9TX1RleHRXaWR0aD0KLU9TX1RleHRXaWR0aF8wPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX1RleHRXaWR0aF8xPWNhc3Q9KHNob3J0KQotT1NfVGV4dFdpZHRoXzI9Y2FzdD0oc2hvcnQpCi0KLU9TX1RyYWNrRHJhZz0KLU9TX1RyYWNrRHJhZ18wPWNhc3Q9KERyYWdSZWYpCi1PU19UcmFja0RyYWdfMT1jYXN0PShjb25zdCBFdmVudFJlY29yZCAqKQotT1NfVHJhY2tEcmFnXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucz0KLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzA9Y2FzdD0oR3JhZlB0cikKLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzE9Y2FzdD0oT3B0aW9uQml0cykKLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzI9Y2FzdD0oRXZlbnRUaW1lb3V0KQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfMz1jYXN0PShQb2ludCAqKQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfND1jYXN0PShVSW50MzIgKikKLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zXzU9Y2FzdD0oTW91c2VUcmFja2luZ1Jlc3VsdCAqKQotCi1PU19VVFR5cGVDcmVhdGVQcmVmZXJyZWRJZGVudGlmaWVyRm9yVGFnPQotT1NfVVRUeXBlQ3JlYXRlUHJlZmVycmVkSWRlbnRpZmllckZvclRhZ18wPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX1VUVHlwZUNyZWF0ZVByZWZlcnJlZElkZW50aWZpZXJGb3JUYWdfMT1jYXN0PUNGU3RyaW5nUmVmCi1PU19VVFR5cGVDcmVhdGVQcmVmZXJyZWRJZGVudGlmaWVyRm9yVGFnXzI9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19VbmlvblJlY3Q9Ci1PU19VbmlvblJlY3RfMD1mbGFncz1ub19vdXQKLU9TX1VuaW9uUmVjdF8xPWZsYWdzPW5vX291dAotT1NfVW5pb25SZWN0XzI9ZmxhZ3M9bm9faW4KLQotT1NfVW5pb25SZ249Ci1PU19VbmlvblJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1VuaW9uUmduXzE9Y2FzdD0oUmduSGFuZGxlKQotT1NfVW5pb25SZ25fMj1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1VubG9ja1BvcnRCaXRzPQotT1NfVW5sb2NrUG9ydEJpdHNfMD1jYXN0PShHcmFmUHRyKQotCi1PU19VcGRhdGVDb250cm9scz0KLU9TX1VwZGF0ZUNvbnRyb2xzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfVXBkYXRlQ29udHJvbHNfMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXM9Ci1PU19VcGRhdGVEYXRhQnJvd3Nlckl0ZW1zXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfMj1jYXN0PShVSW50MzIpCi1PU19VcGRhdGVEYXRhQnJvd3Nlckl0ZW1zXzM9Y2FzdD0oY29uc3QgRGF0YUJyb3dzZXJJdGVtSUQgKikKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfND1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi1PU19VcGRhdGVEYXRhQnJvd3Nlckl0ZW1zXzU9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotCi1PU19VcGdyYWRlU2NyaXB0SW5mb1RvVGV4dEVuY29kaW5nPQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18wPWNhc3Q9U2NyaXB0Q29kZQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18xPWNhc3Q9TGFuZ0NvZGUKLU9TX1VwZ3JhZGVTY3JpcHRJbmZvVG9UZXh0RW5jb2RpbmdfMj1jYXN0PShSZWdpb25Db2RlKQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18zPWNhc3Q9Q29uc3RTdHIyNTVQYXJhbQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ180PWNhc3Q9VGV4dEVuY29kaW5nICoKLQotT1NfV2FpdE1vdXNlTW92ZWQ9Ci1PU19XYWl0TW91c2VNb3ZlZF8wPWZsYWdzPXN0cnVjdAotCi1PU19YMkZpeD0KLU9TX1gyRml4XzA9Ci0KLU9TX1pvb21XaW5kb3dJZGVhbD0KLU9TX1pvb21XaW5kb3dJZGVhbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1pvb21XaW5kb3dJZGVhbF8xPWNhc3Q9KFdpbmRvd1BhcnRDb2RlKQotT1NfWm9vbVdpbmRvd0lkZWFsXzI9Y2FzdD0oUG9pbnQgKikKLQotT1NfZ2V0ZW52PQotT1NfZ2V0ZW52XzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19nZXRwaWQ9Ci0KLU9TX2tDRk51bWJlckZvcm1hdHRlckRlY2ltYWxTZXBhcmF0b3I9ZmxhZ3M9Y29uc3QKLQotT1Nfa0hJVmlld1dpbmRvd0NvbnRlbnRJRD1mbGFncz1jb25zdCBhZGRyZXNzCi0KLU9TX2tQTURvY3VtZW50Rm9ybWF0UERGPWZsYWdzPWNvbnN0Ci0KLU9TX2tQTUdyYXBoaWNzQ29udGV4dENvcmVHcmFwaGljcz1mbGFncz1jb25zdAotCi1PU19rVVRUYWdDbGFzc0ZpbGVuYW1lRXh0ZW5zaW9uPWZsYWdzPWNvbnN0Ci0KLU9TX21lbWNweV9fSUlJPQotT1NfbWVtY3B5X19JSUlfMD1jYXN0PSh2b2lkICopCi1PU19tZW1jcHlfX0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fSUlJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNVVGFiXzJJPQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVVRhYl8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWJfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVVRhYl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJPQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0JpdE1hcF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJPQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRXZlbnRSZWNvcmRfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9FdmVudFJlY29yZF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Gb250U2VsZWN0aW9uUURTdHlsZV8yST0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0ZvbnRTZWxlY3Rpb25RRFN0eWxlXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlY18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUGl4TWFwXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yST0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMkk9Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1jcHlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lfM0JJPQotT1NfbWVtY3B5X19JXzNCSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX291dAotT1NfbWVtY3B5X19JXzNCSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19JXzNDST0KLU9TX21lbWNweV9fSV8zQ0lfMD1jYXN0PSh2b2lkICopCi1PU19tZW1jcHlfX0lfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19vdXQKLU9TX21lbWNweV9fSV8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fSV8zRkk9Ci1PU19tZW1jcHlfX0lfM0ZJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtY3B5X19JXzNGSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1jcHlfX0lfM0ZJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0lfM0lJPQotT1NfbWVtY3B5X19JXzNJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbWNweV9fSV8zSUlfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX291dAotT1NfbWVtY3B5X19JXzNJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUGF0aEVsZW1lbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BhdGhFbGVtZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Gb250U2VsZWN0aW9uUURTdHlsZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0ZvbnRTZWxlY3Rpb25RRFN0eWxlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fRm9udFNlbGVjdGlvblFEU3R5bGVfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2VfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9HRGV2aWNlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fR0RldmljZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2VfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMklJPQotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlY18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySUk9Ci1PU19tZW1jcHlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtY3B5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNCSUk9Ci1PU19tZW1jcHlfX18zQklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0JJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNCSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNCXzNDST0KLU9TX21lbWNweV9fXzNCXzNDSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9faW4KLU9TX21lbWNweV9fXzNCXzNDSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1jcHlfX18zQl8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNDSUk9Ci1PU19tZW1jcHlfX18zQ0lJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0NJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNDSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNDXzNCST0KLU9TX21lbWNweV9fXzNDXzNCSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9faW4KLU9TX21lbWNweV9fXzNDXzNCSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1jcHlfX18zQ18zQklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNGSUk9Ci1PU19tZW1jcHlfX18zRklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0ZJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNGSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNJSUk9Ci1PU19tZW1jcHlfX18zSUlJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtY3B5X19fM0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbWNweV9fXzNJSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbWNweV9fXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOVGFiXzJJPQotT1NfbWVtY3B5X19fM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5UYWJfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX2luCi1PU19tZW1jcHlfX18zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RYTlRhYl8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1jcHlfX18zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RYTlRhYl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtc2V0PQotT1NfbWVtc2V0XzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtc2V0XzE9Ci1PU19tZW1zZXRfMj0KLQotT1Nfc3RybGVuPQotT1Nfc3RybGVuXzA9Y2FzdD1jaGFyICoKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BNUmVjdD0KLVBNUmVjdF90b3A9Y2FzdD0oZG91YmxlKQotUE1SZWN0X2xlZnQ9Y2FzdD0oZG91YmxlKQotUE1SZWN0X2JvdHRvbT1jYXN0PShkb3VibGUpCi1QTVJlY3RfcmlnaHQ9Y2FzdD0oZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BNUmVzb2x1dGlvbj0KLVBNUmVzb2x1dGlvbl9oUmVzPQotUE1SZXNvbHV0aW9uX3ZSZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUGl4TWFwPQotUGl4TWFwX3BtVmVyc2lvbj0KLVBpeE1hcF9wYWNrVHlwZT0KLVBpeE1hcF9wYWNrU2l6ZT0KLVBpeE1hcF9oUmVzPQotUGl4TWFwX3ZSZXM9Ci1QaXhNYXBfcGl4ZWxUeXBlPQotUGl4TWFwX3BpeGVsU2l6ZT0KLVBpeE1hcF9jbXBDb3VudD0KLVBpeE1hcF9jbXBTaXplPQotUGl4TWFwX3BpeGVsRm9ybWF0PQotUGl4TWFwX3BtVGFibGU9Y2FzdD0oQ1RhYkhhbmRsZSkKLVBpeE1hcF9wbUV4dD1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnQ9Ci1Qb2ludF92PQotUG9pbnRfaD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qcm9ncmVzc1RyYWNrSW5mbz0KLVByb2dyZXNzVHJhY2tJbmZvX3BoYXNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yPQotUkdCQ29sb3JfcmVkPQotUkdCQ29sb3JfZ3JlZW49Ci1SR0JDb2xvcl9ibHVlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3Q9Ci1SZWN0X3RvcD0KLVJlY3RfbGVmdD0KLVJlY3RfYm90dG9tPQotUmVjdF9yaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9TY3JvbGxCYXJUcmFja0luZm89Ci1TY3JvbGxCYXJUcmFja0luZm9fdmlld3NpemU9Ci1TY3JvbGxCYXJUcmFja0luZm9fcHJlc3NTdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9TbGlkZXJUcmFja0luZm89Ci1TbGlkZXJUcmFja0luZm9fdGh1bWJEaXI9Ci1TbGlkZXJUcmFja0luZm9fcHJlc3NTdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5CYWNrZ3JvdW5kPQotVFhOQmFja2dyb3VuZF9iZ1R5cGU9Ci1UWE5CYWNrZ3JvdW5kX2JnX3JlZD1hY2Nlc3Nvcj1iZy5jb2xvci5yZWQKLVRYTkJhY2tncm91bmRfYmdfZ3JlZW49YWNjZXNzb3I9YmcuY29sb3IuZ3JlZW4KLVRYTkJhY2tncm91bmRfYmdfYmx1ZT1hY2Nlc3Nvcj1iZy5jb2xvci5ibHVlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOTG9uZ1JlY3Q9Ci1UWE5Mb25nUmVjdF90b3A9Ci1UWE5Mb25nUmVjdF9sZWZ0PQotVFhOTG9uZ1JlY3RfYm90dG9tPQotVFhOTG9uZ1JlY3RfcmlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOVGFiPQotVFhOVGFiX3ZhbHVlPQotVFhOVGFiX3RhYlR5cGU9Ci1UWE5UYWJfZmlsbGVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RoZW1lQnV0dG9uRHJhd0luZm89Ci1UaGVtZUJ1dHRvbkRyYXdJbmZvX3N0YXRlPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotVGhlbWVCdXR0b25EcmF3SW5mb192YWx1ZT1jYXN0PShUaGVtZUJ1dHRvblZhbHVlKQotVGhlbWVCdXR0b25EcmF3SW5mb19hZG9ybm1lbnQ9Y2FzdD0oVGhlbWVCdXR0b25BZG9ybm1lbnQpCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2RlLkNERS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jZGUuQ0RFLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODBkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jZGUuQ0RFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2RlX0NERT0KLUNERV9EdEFjdGlvbkFyZ19zaXplb2Y9Ci0KLUNERV9fRHRBY3Rpb25JbnZva2U9Ci1DREVfX0R0QWN0aW9uSW52b2tlXzA9Y2FzdD1XaWRnZXQKLUNERV9fRHRBY3Rpb25JbnZva2VfMT1jYXN0PWNoYXIgKgotQ0RFX19EdEFjdGlvbkludm9rZV8yPQotQ0RFX19EdEFjdGlvbkludm9rZV8zPQotQ0RFX19EdEFjdGlvbkludm9rZV80PWNhc3Q9Y2hhciAqCi1DREVfX0R0QWN0aW9uSW52b2tlXzU9Y2FzdD1jaGFyICoKLUNERV9fRHRBY3Rpb25JbnZva2VfNj1jYXN0PWNoYXIgKgotQ0RFX19EdEFjdGlvbkludm9rZV83PQotQ0RFX19EdEFjdGlvbkludm9rZV84PWNhc3Q9RHRBY3Rpb25DYWxsYmFja1Byb2MKLUNERV9fRHRBY3Rpb25JbnZva2VfOT1jYXN0PVh0UG9pbnRlcgotCi1DREVfX0R0QXBwSW5pdGlhbGl6ZT0KLUNERV9fRHRBcHBJbml0aWFsaXplXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotQ0RFX19EdEFwcEluaXRpYWxpemVfMT1jYXN0PShEaXNwbGF5ICopCi1DREVfX0R0QXBwSW5pdGlhbGl6ZV8yPWNhc3Q9V2lkZ2V0Ci1DREVfX0R0QXBwSW5pdGlhbGl6ZV8zPWNhc3Q9KGNoYXIgKikKLUNERV9fRHRBcHBJbml0aWFsaXplXzQ9Y2FzdD0oY2hhciAqKQotCi1DREVfX0R0RGJMb2FkPQotCi1DREVfX0R0RHRzRGF0YVR5cGVJc0FjdGlvbj0KLUNERV9fRHREdHNEYXRhVHlwZUlzQWN0aW9uXzA9Y2FzdD1jaGFyICoKLQotQ0RFX19EdER0c0RhdGFUeXBlTmFtZXM9Ci0KLUNERV9fRHREdHNEYXRhVHlwZVRvQXR0cmlidXRlVmFsdWU9Ci1DREVfX0R0RHRzRGF0YVR5cGVUb0F0dHJpYnV0ZVZhbHVlXzA9Y2FzdD1jaGFyICoKLUNERV9fRHREdHNEYXRhVHlwZVRvQXR0cmlidXRlVmFsdWVfMT1jYXN0PWNoYXIgKgotQ0RFX19EdER0c0RhdGFUeXBlVG9BdHRyaWJ1dGVWYWx1ZV8yPWNhc3Q9Y2hhciAqCi0KLUNERV9fRHREdHNGaWxlVG9EYXRhVHlwZT0KLUNERV9fRHREdHNGaWxlVG9EYXRhVHlwZV8wPWNhc3Q9Y2hhciAqCi0KLUNERV9fRHREdHNGcmVlQXR0cmlidXRlVmFsdWU9Ci1DREVfX0R0RHRzRnJlZUF0dHJpYnV0ZVZhbHVlXzA9Y2FzdD1jaGFyICoKLQotQ0RFX19EdER0c0ZyZWVEYXRhVHlwZT0KLUNERV9fRHREdHNGcmVlRGF0YVR5cGVfMD1jYXN0PWNoYXIgKgotCi1DREVfX0R0RHRzRnJlZURhdGFUeXBlTmFtZXM9Ci1DREVfX0R0RHRzRnJlZURhdGFUeXBlTmFtZXNfMD1jYXN0PWNoYXIgKioKLQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsPQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzA9Y2FzdD0oU3RyaW5nKQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzE9Y2FzdD0oU3RyaW5nKQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzI9Y2FzdD0oV2lkZ2V0Q2xhc3MpCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfMz1jYXN0PShEaXNwbGF5ICopCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfND1jYXN0PShBcmdMaXN0KQotQ0RFX19YdEFwcENyZWF0ZVNoZWxsXzU9Ci0KLUNERV9fWHRDcmVhdGVBcHBsaWNhdGlvbkNvbnRleHQ9Ci0KLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZT0KLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8xPWNhc3Q9KERpc3BsYXkgKikKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8yPWNhc3Q9KFN0cmluZykKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV8zPWNhc3Q9KFN0cmluZykKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV80PWNhc3Q9KFhybU9wdGlvbkRlc2NSZWMgKikKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV81PWNhc3Q9KENhcmRpbmFsKQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzY9Y2FzdD0oaW50ICopCi1DREVfX1h0RGlzcGxheUluaXRpYWxpemVfNz1jYXN0PShTdHJpbmcgKikKLQotQ0RFX19YdFJlYWxpemVXaWRnZXQ9Ci1DREVfX1h0UmVhbGl6ZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotQ0RFX19YdFJlc2l6ZVdpZGdldD0KLUNERV9fWHRSZXNpemVXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi1DREVfX1h0UmVzaXplV2lkZ2V0XzE9Ci1DREVfX1h0UmVzaXplV2lkZ2V0XzI9Ci1DREVfX1h0UmVzaXplV2lkZ2V0XzM9Ci0KLUNERV9fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZD0KLUNERV9fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZF8wPWNhc3Q9KFdpZGdldCkKLUNERV9fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZF8xPQotCi1DREVfX1h0VG9vbGtpdEluaXRpYWxpemU9Ci0KLUNERV9fdG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NkZV9EdEFjdGlvbkFyZz0KLUR0QWN0aW9uQXJnX2FyZ0NsYXNzPQotRHRBY3Rpb25BcmdfbmFtZT1hY2Nlc3Nvcj11LmZpbGUubmFtZSxjYXN0PWNoYXIgKgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdkaXAuR2RpcC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nZGlwLkdkaXAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNzMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdkaXAuR2RpcC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0dkaXA9ZmxhZ3M9Y3BwCi1HZGlwX0JpdG1hcF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0JpdG1hcF9kZWxldGVfMD0KLQotR2RpcF9CaXRtYXBfMW5ld19fST1mbGFncz1uZXcKLUdkaXBfQml0bWFwXzFuZXdfX0lfMD1jYXN0PUhJQ09OCi0KLUdkaXBfQml0bWFwXzFuZXdfX0lJPWZsYWdzPW5ldwotR2RpcF9CaXRtYXBfMW5ld19fSUlfMD1jYXN0PUhCSVRNQVAKLUdkaXBfQml0bWFwXzFuZXdfX0lJXzE9Y2FzdD1IUEFMRVRURQotCi1HZGlwX0JpdG1hcF8xbmV3X19JSUlJST1mbGFncz1uZXcKLUdkaXBfQml0bWFwXzFuZXdfX0lJSUlJXzA9Ci1HZGlwX0JpdG1hcF8xbmV3X19JSUlJSV8xPQotR2RpcF9CaXRtYXBfMW5ld19fSUlJSUlfMj0KLUdkaXBfQml0bWFwXzFuZXdfX0lJSUlJXzM9Y2FzdD1QaXhlbEZvcm1hdAotR2RpcF9CaXRtYXBfMW5ld19fSUlJSUlfND1jYXN0PUJZVEUgKgotCi1HZGlwX0JydXNoX0Nsb25lPWZsYWdzPWNwcAotR2RpcF9CcnVzaF9DbG9uZV8wPWNhc3Q9KEJydXNoICopCi0KLUdkaXBfQnJ1c2hfR2V0VHlwZT1mbGFncz1jcHAKLUdkaXBfQnJ1c2hfR2V0VHlwZV8wPWNhc3Q9KEJydXNoICopCi0KLUdkaXBfQ29sb3JfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9Db2xvcl9kZWxldGVfMD0KLQotR2RpcF9Db2xvcl9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0NvbG9yX25ld18wPWNhc3Q9QVJHQgotCi1HZGlwX0ZvbnRGYW1pbHlfR2V0RmFtaWx5TmFtZT1mbGFncz1jcHAKLUdkaXBfRm9udEZhbWlseV9HZXRGYW1pbHlOYW1lXzA9Y2FzdD1Gb250RmFtaWx5ICoKLUdkaXBfRm9udEZhbWlseV9HZXRGYW1pbHlOYW1lXzE9Y2FzdD1XQ0hBUiAqCi1HZGlwX0ZvbnRGYW1pbHlfR2V0RmFtaWx5TmFtZV8yPWNhc3Q9V0NIQVIKLQotR2RpcF9Gb250RmFtaWx5X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfRm9udEZhbWlseV9kZWxldGVfMD0KLQotR2RpcF9Gb250RmFtaWx5X25ldz1mbGFncz1uZXcKLQotR2RpcF9Gb250X0dldEZhbWlseT1mbGFncz1jcHAKLUdkaXBfRm9udF9HZXRGYW1pbHlfMD1jYXN0PShGb250ICopCi1HZGlwX0ZvbnRfR2V0RmFtaWx5XzE9Y2FzdD0oRm9udEZhbWlseSAqKQotCi1HZGlwX0ZvbnRfR2V0U2l6ZT1mbGFncz1jcHAKLUdkaXBfRm9udF9HZXRTaXplXzA9Y2FzdD0oRm9udCAqKQotCi1HZGlwX0ZvbnRfR2V0U3R5bGU9ZmxhZ3M9Y3BwCi1HZGlwX0ZvbnRfR2V0U3R5bGVfMD1jYXN0PShGb250ICopCi0KLUdkaXBfRm9udF9Jc0F2YWlsYWJsZT1mbGFncz1jcHAKLUdkaXBfRm9udF9Jc0F2YWlsYWJsZV8wPWNhc3Q9Rm9udCAqCi0KLUdkaXBfRm9udF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0ZvbnRfZGVsZXRlXzA9Ci0KLUdkaXBfRm9udF8xbmV3X19JST1mbGFncz1uZXcKLUdkaXBfRm9udF8xbmV3X19JSV8wPWNhc3Q9KEhEQykKLUdkaXBfRm9udF8xbmV3X19JSV8xPWNhc3Q9KEhGT05UCi0KLUdkaXBfRm9udF8xbmV3X19fM0NGSUlJPWZsYWdzPW5ldwotR2RpcF9Gb250XzFuZXdfX18zQ0ZJSUlfMD1jYXN0PWNvbnN0IFdDSEFSICoKLUdkaXBfRm9udF8xbmV3X19fM0NGSUlJXzE9Y2FzdD1SRUFMCi1HZGlwX0ZvbnRfMW5ld19fXzNDRklJSV8yPWNhc3Q9SU5UCi1HZGlwX0ZvbnRfMW5ld19fXzNDRklJSV8zPWNhc3Q9VW5pdAotR2RpcF9Gb250XzFuZXdfX18zQ0ZJSUlfND1jYXN0PWNvbnN0IEZvbnRDb2xsZWN0aW9uICoKLQotR2RpcF9HZGlwbHVzU2h1dGRvd249Ci1HZGlwX0dkaXBsdXNTaHV0ZG93bl8wPWNhc3Q9VUxPTkdfUFRSCi0KLUdkaXBfR2RpcGx1c1N0YXJ0dXA9Ci1HZGlwX0dkaXBsdXNTdGFydHVwXzA9Y2FzdD0oVUxPTkdfUFRSICopCi1HZGlwX0dkaXBsdXNTdGFydHVwXzE9Y2FzdD1jb25zdCBHZGlwbHVzU3RhcnR1cElucHV0ICoKLUdkaXBfR2RpcGx1c1N0YXJ0dXBfMj1jYXN0PUdkaXBsdXNTdGFydHVwT3V0cHV0ICoKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfMT1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzI9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEFyY18zPWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfND1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzU9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEFyY182PWNhc3Q9KFJFQUwpCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzE9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl8yPWNhc3Q9UkVBTAotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzM9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfND1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzU9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfNj1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzc9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl84PWNhc3Q9KFJFQUwpCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzE9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzI9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzM9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRMaW5lXzQ9Y2FzdD1SRUFMCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFBhdGg9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRQYXRoXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRQYXRoXzE9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRQYXRoXzI9Y2FzdD1CT09MCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFJlY3RhbmdsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFJlY3RhbmdsZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkUmVjdGFuZ2xlXzE9ZmxhZ3M9c3RydWN0Ci0KLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ18wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzE9Y2FzdD1jb25zdCBXQ0hBUiAqCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfMj1jYXN0PUlOVAotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzM9Y2FzdD1jb25zdCBGb250RmFtaWx5ICoKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ180PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfNT1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzY9Y2FzdD1jb25zdCBQb2ludEYgKixmbGFncz1zdHJ1Y3QKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ183PWNhc3Q9Y29uc3QgU3RyaW5nRm9ybWF0ICoKLQotR2RpcF9HcmFwaGljc1BhdGhfQ2xvc2VGaWd1cmU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9DbG9zZUZpZ3VyZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRCb3VuZHM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRCb3VuZHNfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldEJvdW5kc18xPQotR2RpcF9HcmFwaGljc1BhdGhfR2V0Qm91bmRzXzI9Y2FzdD1NYXRyaXggKgotR2RpcF9HcmFwaGljc1BhdGhfR2V0Qm91bmRzXzM9Y2FzdD1QZW4gKgotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRMYXN0UG9pbnQ9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRMYXN0UG9pbnRfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldExhc3RQb2ludF8xPWNhc3Q9KFBvaW50RiAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoUG9pbnRzPWZsYWdzPW5vX2dlbiBjcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhQb2ludHNfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhQb2ludHNfMT1jYXN0PVBvaW50RiAqCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoUG9pbnRzXzI9Ci0KLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlcz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlc18wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfR2V0UGF0aFR5cGVzXzE9Y2FzdD1CWVRFICoKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlc18yPQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQb2ludENvdW50PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfR2V0UG9pbnRDb3VudF8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9Jc091dGxpbmVWaXNpYmxlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8xPQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8yPQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZV8zPWNhc3Q9Y29uc3QgUGVuICoKLUdkaXBfR3JhcGhpY3NQYXRoX0lzT3V0bGluZVZpc2libGVfND1jYXN0PWNvbnN0IEdyYXBoaWNzICoKLQotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9Jc1Zpc2libGVfMT0KLUdkaXBfR3JhcGhpY3NQYXRoX0lzVmlzaWJsZV8yPQotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlXzM9Y2FzdD1jb25zdCBHcmFwaGljcyAqCi0KLUdkaXBfR3JhcGhpY3NQYXRoX1NldEZpbGxNb2RlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfU2V0RmlsbE1vZGVfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX1NldEZpbGxNb2RlXzE9Y2FzdD1GaWxsTW9kZQotCi1HZGlwX0dyYXBoaWNzUGF0aF9TdGFydEZpZ3VyZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX1N0YXJ0RmlndXJlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfR3JhcGhpY3NQYXRoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfR3JhcGhpY3NQYXRoX2RlbGV0ZV8wPQotCi1HZGlwX0dyYXBoaWNzUGF0aF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0dyYXBoaWNzUGF0aF9uZXdfMD1jYXN0PUZpbGxNb2RlCi0KLUdkaXBfR3JhcGhpY3NfRHJhd0FyYz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0FyY18wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfMT1jYXN0PShQZW4gKikKLUdkaXBfR3JhcGhpY3NfRHJhd0FyY18yPQotR2RpcF9HcmFwaGljc19EcmF3QXJjXzM9Ci1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfND0KLUdkaXBfR3JhcGhpY3NfRHJhd0FyY181PQotR2RpcF9HcmFwaGljc19EcmF3QXJjXzY9Ci1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfNz0KLQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0VsbGlwc2VfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8xPWNhc3Q9KFBlbiAqKQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8yPQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8zPQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV80PQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV81PQotCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJSUk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUlJXzE9Y2FzdD0oSW1hZ2UgKikKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlJSV8yPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlJSV8zPWNhc3Q9KElOVCkKLQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJST1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV8xPWNhc3Q9KEltYWdlICopCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzI9Y2FzdD1jb25zdCBSZWN0ICosZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzM9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV80PWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfNT1jYXN0PUlOVAotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV82PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzc9Y2FzdD0oVW5pdCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfOD1jYXN0PUltYWdlQXR0cmlidXRlcyAqCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzk9Y2FzdD1EcmF3SW1hZ2VBYm9ydAotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV8xMD1jYXN0PVZPSUQgKgotCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3TGluZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzM9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzQ9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzU9Ci0KLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzPWZsYWdzPW5vX2dlbiBjcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lc18yPQotR2RpcF9HcmFwaGljc19EcmF3TGluZXNfMz1jYXN0PUlOVAotCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3UGF0aF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoXzI9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfR3JhcGhpY3NfRHJhd1BvbHlnb249ZmxhZ3M9bm9fZ2VuIGNwcAotR2RpcF9HcmFwaGljc19EcmF3UG9seWdvbl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzM9Y2FzdD1JTlQKLQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRHJhd1JlY3RhbmdsZV8xPWNhc3Q9KFBlbiAqKQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdSZWN0YW5nbGVfMz0KLUdkaXBfR3JhcGhpY3NfRHJhd1JlY3RhbmdsZV80PQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzU9Ci0KLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMT1jYXN0PVdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMj1jYXN0PWludAotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySV8zPWNhc3Q9Rm9udCAqCi1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzQ9ZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzU9Y2FzdD1CcnVzaCAqCi0KLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUlfMT1jYXN0PVdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzI9Y2FzdD1pbnQKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzM9Y2FzdD1Gb250ICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzQ9ZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJSV81PWNhc3Q9U3RyaW5nRm9ybWF0ICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzY9Y2FzdD0oQnJ1c2ggKikKLQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRmlsbEVsbGlwc2VfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZV8xPWNhc3Q9KEJydXNoICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxFbGxpcHNlXzI9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZV8zPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfRmlsbEVsbGlwc2VfND1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxFbGxpcHNlXzU9Y2FzdD0oSU5UKQotCi1HZGlwX0dyYXBoaWNzX0ZpbGxQYXRoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GaWxsUGF0aF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxQYXRoXzE9Y2FzdD0oQnJ1c2ggKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBhdGhfMj1jYXN0PShHcmFwaGljc1BhdGggKikKLQotR2RpcF9HcmFwaGljc19GaWxsUGllPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GaWxsUGllXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBpZV8xPWNhc3Q9KEJydXNoICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfMj1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfMz1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfND1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfNT1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfNj1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc19GaWxsUGllXzc9Y2FzdD0oUkVBTCkKLQotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbj1mbGFncz1ub19nZW4gY3BwCi1HZGlwX0dyYXBoaWNzX0ZpbGxQb2x5Z29uXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBvbHlnb25fMT1jYXN0PShCcnVzaCAqKQotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbl8yPWNhc3Q9UG9pbnQgKgotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbl8zPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfRmlsbFBvbHlnb25fND1jYXN0PUZpbGxNb2RlCi0KLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxSZWN0YW5nbGVfMT1jYXN0PShCcnVzaCAqKQotR2RpcF9HcmFwaGljc19GaWxsUmVjdGFuZ2xlXzI9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc19GaWxsUmVjdGFuZ2xlXzM9Y2FzdD1JTlQKLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZV80PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzX0ZpbGxSZWN0YW5nbGVfNT1jYXN0PUlOVAotCi1HZGlwX0dyYXBoaWNzX0ZsdXNoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GbHVzaF8wPWNhc3Q9R3JhcGhpY3MgKgotR2RpcF9HcmFwaGljc19GbHVzaF8xPWNhc3Q9Rmx1c2hJbnRlbnRpb24KLQotR2RpcF9HcmFwaGljc19HZXRDbGlwPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRDbGlwXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfR2V0Q2xpcF8xPWNhc3Q9UmVnaW9uICoKLQotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzA9Y2FzdD1HcmFwaGljcyAqCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMT0KLQotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzI9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMl8xPQotCi1HZGlwX0dyYXBoaWNzX0dldEhEQz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0SERDXzA9Y2FzdD1HcmFwaGljcyAqCi0KLUdkaXBfR3JhcGhpY3NfR2V0SW50ZXJwb2xhdGlvbk1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX0dldEludGVycG9sYXRpb25Nb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9HcmFwaGljc19HZXRTbW9vdGhpbmdNb2RlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRTbW9vdGhpbmdNb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9HcmFwaGljc19HZXRUZXh0UmVuZGVyaW5nSGludD1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0VGV4dFJlbmRlcmluZ0hpbnRfMD1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX0dyYXBoaWNzX0dldFRyYW5zZm9ybT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0VHJhbnNmb3JtXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfR2V0VHJhbnNmb3JtXzE9Y2FzdD1NYXRyaXggKgotCi1HZGlwX0dyYXBoaWNzX0dldFZpc2libGVDbGlwQm91bmRzPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRWaXNpYmxlQ2xpcEJvdW5kc18wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0dldFZpc2libGVDbGlwQm91bmRzXzE9Ci0KLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMT1jYXN0PWNvbnN0IFdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMz1jYXN0PWNvbnN0IEZvbnQgKgotR2RpcF9HcmFwaGljc18xTWVhc3VyZVN0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzQ9Y2FzdD1jb25zdCBQb2ludEYgKixmbGFncz1zdHJ1Y3QKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl81PWNhc3Q9U3RyaW5nRm9ybWF0ICoKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl82PQotCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzE9Y2FzdD1jb25zdCBXQ0hBUiAqCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8zPWNhc3Q9Y29uc3QgRm9udCAqCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl80PWNhc3Q9Y29uc3QgUG9pbnRGICosZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl81PWNhc3Q9UmVjdEYgKgotCi1HZGlwX0dyYXBoaWNzX1JlbGVhc2VIREM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1JlbGVhc2VIRENfMD1jYXN0PUdyYXBoaWNzICoKLUdkaXBfR3JhcGhpY3NfUmVsZWFzZUhEQ18xPWNhc3Q9SERDCi0KLUdkaXBfR3JhcGhpY3NfUmVzZXRDbGlwPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19SZXNldENsaXBfMD1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JST1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lJXzE9Y2FzdD1HcmFwaGljc1BhdGggKgotCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JSUk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUlJXzE9Y2FzdD1SZWdpb24gKgotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUlJXzI9Y2FzdD1Db21iaW5lTW9kZQotCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzI9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzE9ZmxhZ3M9c3RydWN0Ci0KLUdkaXBfR3JhcGhpY3NfU2V0Q29tcG9zaXRpbmdRdWFsaXR5PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19TZXRDb21wb3NpdGluZ1F1YWxpdHlfMD1jYXN0PUdyYXBoaWNzICoKLUdkaXBfR3JhcGhpY3NfU2V0Q29tcG9zaXRpbmdRdWFsaXR5XzE9Y2FzdD1Db21wb3NpdGluZ1F1YWxpdHkKLQotR2RpcF9HcmFwaGljc19TZXRJbnRlcnBvbGF0aW9uTW9kZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0SW50ZXJwb2xhdGlvbk1vZGVfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19TZXRJbnRlcnBvbGF0aW9uTW9kZV8xPWNhc3Q9SW50ZXJwb2xhdGlvbk1vZGUKLQotR2RpcF9HcmFwaGljc19TZXRQaXhlbE9mZnNldE1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NldFBpeGVsT2Zmc2V0TW9kZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFBpeGVsT2Zmc2V0TW9kZV8xPWNhc3Q9UGl4ZWxPZmZzZXRNb2RlCi0KLUdkaXBfR3JhcGhpY3NfU2V0U21vb3RoaW5nTW9kZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0U21vb3RoaW5nTW9kZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFNtb290aGluZ01vZGVfMT1jYXN0PShTbW9vdGhpbmdNb2RlKQotCi1HZGlwX0dyYXBoaWNzX1NldFRleHRSZW5kZXJpbmdIaW50PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19TZXRUZXh0UmVuZGVyaW5nSGludF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFRleHRSZW5kZXJpbmdIaW50XzE9Y2FzdD1UZXh0UmVuZGVyaW5nSGludAotCi1HZGlwX0dyYXBoaWNzX1NldFRyYW5zZm9ybT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0VHJhbnNmb3JtXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfU2V0VHJhbnNmb3JtXzE9Y2FzdD0oTWF0cml4ICopCi0KLUdkaXBfR3JhcGhpY3NfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9HcmFwaGljc19kZWxldGVfMD0KLQotR2RpcF9HcmFwaGljc19uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0dyYXBoaWNzX25ld18wPWNhc3Q9KEhEQykKLQotR2RpcF9IYXRjaEJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfSGF0Y2hCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9IYXRjaEJydXNoX25ldz1mbGFncz1uZXcKLUdkaXBfSGF0Y2hCcnVzaF9uZXdfMD1jYXN0PUhhdGNoU3R5bGUKLUdkaXBfSGF0Y2hCcnVzaF9uZXdfMT1jYXN0PUNvbG9yICosZmxhZ3M9c3RydWN0Ci1HZGlwX0hhdGNoQnJ1c2hfbmV3XzI9Y2FzdD1Db2xvciAqLGZsYWdzPXN0cnVjdAotCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRDb2xvck1hdHJpeD1mbGFncz1jcHAKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX1NldENvbG9yTWF0cml4XzA9Y2FzdD0oSW1hZ2VBdHRyaWJ1dGVzICopCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRDb2xvck1hdHJpeF8xPWNhc3Q9Q29sb3JNYXRyaXggKgotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0Q29sb3JNYXRyaXhfMj1jYXN0PUNvbG9yTWF0cml4RmxhZ3MKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX1NldENvbG9yTWF0cml4XzM9Y2FzdD1Db2xvckFkanVzdFR5cGUKLQotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0V3JhcE1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRXcmFwTW9kZV8wPWNhc3Q9KEltYWdlQXR0cmlidXRlcyAqKQotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0V3JhcE1vZGVfMT1jYXN0PVdyYXBNb2RlCi0KLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX2RlbGV0ZV8wPQotCi1HZGlwX0ltYWdlQXR0cmlidXRlc19uZXc9ZmxhZ3M9bmV3Ci0KLUdkaXBfSW1hZ2VfR2V0SGVpZ2h0PWZsYWdzPWNwcAotR2RpcF9JbWFnZV9HZXRIZWlnaHRfMD1jYXN0PUltYWdlICoKLQotR2RpcF9JbWFnZV9HZXRXaWR0aD1mbGFncz1jcHAKLUdkaXBfSW1hZ2VfR2V0V2lkdGhfMD1jYXN0PUltYWdlICoKLQotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldEludGVycG9sYXRpb25Db2xvcnM9ZmxhZ3M9bm9fZ2VuIGNwcAotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldEludGVycG9sYXRpb25Db2xvcnNfMD1jYXN0PUxpbmVhckdyYWRpZW50QnJ1c2ggKgotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldEludGVycG9sYXRpb25Db2xvcnNfMT1jYXN0PWNvbnN0IENvbG9yICoKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzXzI9Y2FzdD1jb25zdCBSRUFMICoKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzXzM9Ci0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRXcmFwTW9kZT1mbGFncz1jcHAKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRXcmFwTW9kZV8wPWNhc3Q9TGluZWFyR3JhZGllbnRCcnVzaCAqCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfU2V0V3JhcE1vZGVfMT1jYXN0PVdyYXBNb2RlCi0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfZGVsZXRlXzA9Ci0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3XzA9ZmxhZ3M9c3RydWN0Ci1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3XzE9ZmxhZ3M9c3RydWN0Ci1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3XzI9Y2FzdD1Db2xvciAqLGZsYWdzPXN0cnVjdAotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX25ld18zPWNhc3Q9Q29sb3IgKixmbGFncz1zdHJ1Y3QKLQotR2RpcF9NYXRyaXhfR2V0RWxlbWVudHM9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9HZXRFbGVtZW50c18wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfR2V0RWxlbWVudHNfMT1jYXN0PShSRUFMICopCi0KLUdkaXBfTWF0cml4X0ludmVydD1mbGFncz1jcHAKLUdkaXBfTWF0cml4X0ludmVydF8wPWNhc3Q9KE1hdHJpeCAqKQotCi1HZGlwX01hdHJpeF9Jc0lkZW50aXR5PWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfSXNJZGVudGl0eV8wPWNhc3Q9KE1hdHJpeCAqKQotCi1HZGlwX01hdHJpeF9NdWx0aXBseT1mbGFncz1jcHAKLUdkaXBfTWF0cml4X011bHRpcGx5XzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9NdWx0aXBseV8xPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfTXVsdGlwbHlfMj1jYXN0PShNYXRyaXhPcmRlcikKLQotR2RpcF9NYXRyaXhfUm90YXRlPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfUm90YXRlXzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9Sb3RhdGVfMT1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfUm90YXRlXzI9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X1NjYWxlPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfU2NhbGVfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1NjYWxlXzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NjYWxlXzI9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NjYWxlXzM9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfU2V0RWxlbWVudHNfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzI9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzM9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzQ9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzU9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzY9Y2FzdD0oUkVBTCkKLQotR2RpcF9NYXRyaXhfU2hlYXI9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9TaGVhcl8wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfU2hlYXJfMT1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfU2hlYXJfMj1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfU2hlYXJfMz1jYXN0PShNYXRyaXhPcmRlcikKLQotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkk9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySV8wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMT0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzI9Ci0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lfM0ZJPWZsYWdzPW5vX2dlbgotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSV8zRklfMD0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lfM0ZJXzE9Ci1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JXzNGSV8yPQotCi1HZGlwX01hdHJpeF9UcmFuc2xhdGU9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9UcmFuc2xhdGVfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1RyYW5zbGF0ZV8xPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9UcmFuc2xhdGVfMj1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfVHJhbnNsYXRlXzM9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfTWF0cml4X2RlbGV0ZV8wPQotCi1HZGlwX01hdHJpeF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX01hdHJpeF9uZXdfMD1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfbmV3XzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X25ld18yPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9uZXdfMz1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfbmV3XzQ9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X25ld181PWNhc3Q9KFJFQUwpCi0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyQ29sb3I9ZmxhZ3M9Y3BwCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldENlbnRlckNvbG9yXzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyQ29sb3JfMT1jYXN0PShDb2xvciAqKSxmbGFncz1zdHJ1Y3QKLQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRDZW50ZXJQb2ludD1mbGFncz1jcHAKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyUG9pbnRfMD1jYXN0PShQYXRoR3JhZGllbnRCcnVzaCAqKQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRDZW50ZXJQb2ludF8xPWZsYWdzPXN0cnVjdAotCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldEdyYXBoaWNzUGF0aD1mbGFncz1jcHAKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0R3JhcGhpY3NQYXRoXzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0R3JhcGhpY3NQYXRoXzE9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0U3Vycm91bmRDb2xvcnM9ZmxhZ3M9bm9fZ2VuCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldFN1cnJvdW5kQ29sb3JzXzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0U3Vycm91bmRDb2xvcnNfMT1jYXN0PUNvbG9yICoKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0U3Vycm91bmRDb2xvcnNfMj1jYXN0PUlOVCAqCi0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX1BhdGhHcmFkaWVudEJydXNoX25ld18wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX1Blbl9HZXRCcnVzaD1mbGFncz1jcHAKLUdkaXBfUGVuX0dldEJydXNoXzA9Y2FzdD0oUGVuICopCi0KLUdkaXBfUGVuX1NldEJydXNoPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0QnJ1c2hfMD1jYXN0PShQZW4gKikKLUdkaXBfUGVuX1NldEJydXNoXzE9Y2FzdD1CcnVzaCAqCi0KLUdkaXBfUGVuX1NldERhc2hQYXR0ZXJuPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0RGFzaFBhdHRlcm5fMD1jYXN0PShQZW4gKikKLUdkaXBfUGVuX1NldERhc2hQYXR0ZXJuXzE9Y2FzdD0oUkVBTCAqKQotR2RpcF9QZW5fU2V0RGFzaFBhdHRlcm5fMj1jYXN0PWludAotCi1HZGlwX1Blbl9TZXREYXNoU3R5bGU9ZmxhZ3M9Y3BwCi1HZGlwX1Blbl9TZXREYXNoU3R5bGVfMD1jYXN0PVBlbiAqCi1HZGlwX1Blbl9TZXREYXNoU3R5bGVfMT1jYXN0PURhc2hTdHlsZQotCi1HZGlwX1Blbl9TZXRMaW5lQ2FwPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0TGluZUNhcF8wPWNhc3Q9KFBlbiAqKQotR2RpcF9QZW5fU2V0TGluZUNhcF8xPWNhc3Q9KExpbmVDYXApCi1HZGlwX1Blbl9TZXRMaW5lQ2FwXzI9Y2FzdD0oTGluZUNhcCkKLUdkaXBfUGVuX1NldExpbmVDYXBfMz1jYXN0PShEYXNoQ2FwKQotCi1HZGlwX1Blbl9TZXRMaW5lSm9pbj1mbGFncz1jcHAKLUdkaXBfUGVuX1NldExpbmVKb2luXzA9Y2FzdD0oUGVuICopCi1HZGlwX1Blbl9TZXRMaW5lSm9pbl8xPWNhc3Q9KExpbmVKb2luKQotCi1HZGlwX1Blbl9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1Blbl9kZWxldGVfMD0KLQotR2RpcF9QZW5fbmV3PWZsYWdzPW5ldwotR2RpcF9QZW5fbmV3XzA9Y2FzdD0oQ29sb3IgKiksZmxhZ3M9c3RydWN0Ci1HZGlwX1Blbl9uZXdfMT1jYXN0PVJFQUwKLQotR2RpcF9Qb2ludF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1BvaW50X2RlbGV0ZV8wPQotCi1HZGlwX1BvaW50X25ldz1mbGFncz1uZXcKLUdkaXBfUG9pbnRfbmV3XzA9Ci1HZGlwX1BvaW50X25ld18xPQotCi1HZGlwX1JlZ2lvbl9HZXRIUkdOPWZsYWdzPWNwcAotR2RpcF9SZWdpb25fR2V0SFJHTl8wPWNhc3Q9KFJlZ2lvbiAqKQotR2RpcF9SZWdpb25fR2V0SFJHTl8xPWNhc3Q9KEdyYXBoaWNzICopCi0KLUdkaXBfUmVnaW9uX0lzSW5maW5pdGU9ZmxhZ3M9Y3BwCi1HZGlwX1JlZ2lvbl9Jc0luZmluaXRlXzA9Y2FzdD0oUmVnaW9uICopCi1HZGlwX1JlZ2lvbl9Jc0luZmluaXRlXzE9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9SZWdpb25fZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9SZWdpb25fZGVsZXRlXzA9Ci0KLUdkaXBfUmVnaW9uXzFuZXdfXz1mbGFncz1uZXcKLQotR2RpcF9SZWdpb25fMW5ld19fST1mbGFncz1uZXcKLUdkaXBfUmVnaW9uXzFuZXdfX0lfMD1jYXN0PUhSR04KLQotR2RpcF9Tb2xpZEJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfU29saWRCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9Tb2xpZEJydXNoX25ldz1mbGFncz1uZXcKLUdkaXBfU29saWRCcnVzaF9uZXdfMD1jYXN0PShDb2xvciAqLGZsYWdzPXN0cnVjdAotCi1HZGlwX1N0cmluZ0Zvcm1hdF9DbG9uZT1mbGFncz1jcHAKLUdkaXBfU3RyaW5nRm9ybWF0X0Nsb25lXzA9Y2FzdD0oU3RyaW5nRm9ybWF0ICopCi0KLUdkaXBfU3RyaW5nRm9ybWF0X0dlbmVyaWNEZWZhdWx0PWFjY2Vzc29yPVN0cmluZ0Zvcm1hdDo6R2VuZXJpY0RlZmF1bHQKLQotR2RpcF9TdHJpbmdGb3JtYXRfR2VuZXJpY1R5cG9ncmFwaGljPWFjY2Vzc29yPVN0cmluZ0Zvcm1hdDo6R2VuZXJpY1R5cG9ncmFwaGljCi0KLUdkaXBfU3RyaW5nRm9ybWF0X0dldEZvcm1hdEZsYWdzPWZsYWdzPWNwcAotR2RpcF9TdHJpbmdGb3JtYXRfR2V0Rm9ybWF0RmxhZ3NfMD1jYXN0PShTdHJpbmdGb3JtYXQgKikKLQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0Rm9ybWF0RmxhZ3M9ZmxhZ3M9Y3BwCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRGb3JtYXRGbGFnc18wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0Rm9ybWF0RmxhZ3NfMT1jYXN0PVN0cmluZ0Zvcm1hdEZsYWdzCi0KLUdkaXBfU3RyaW5nRm9ybWF0X1NldEhvdGtleVByZWZpeD1mbGFncz1jcHAKLUdkaXBfU3RyaW5nRm9ybWF0X1NldEhvdGtleVByZWZpeF8wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0SG90a2V5UHJlZml4XzE9Y2FzdD1Ib3RrZXlQcmVmaXgKLQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0VGFiU3RvcHM9ZmxhZ3M9Y3BwCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRUYWJTdG9wc18wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0VGFiU3RvcHNfMT0KLUdkaXBfU3RyaW5nRm9ybWF0X1NldFRhYlN0b3BzXzI9Ci1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRUYWJTdG9wc18zPQotCi1HZGlwX1N0cmluZ0Zvcm1hdF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1N0cmluZ0Zvcm1hdF9kZWxldGVfMD0KLQotR2RpcF9UZXh0dXJlQnJ1c2hfU2V0VHJhbnNmb3JtPWZsYWdzPWNwcAotR2RpcF9UZXh0dXJlQnJ1c2hfU2V0VHJhbnNmb3JtXzA9Y2FzdD0oVGV4dHVyZUJydXNoICopCi1HZGlwX1RleHR1cmVCcnVzaF9TZXRUcmFuc2Zvcm1fMT1jYXN0PU1hdHJpeCAqCi0KLUdkaXBfVGV4dHVyZUJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfVGV4dHVyZUJydXNoX2RlbGV0ZV8wPQotCi1HZGlwX1RleHR1cmVCcnVzaF9uZXc9ZmxhZ3M9bmV3Ci1HZGlwX1RleHR1cmVCcnVzaF9uZXdfMD1jYXN0PUltYWdlICoKLUdkaXBfVGV4dHVyZUJydXNoX25ld18xPWNhc3Q9V3JhcE1vZGUKLUdkaXBfVGV4dHVyZUJydXNoX25ld18yPQotR2RpcF9UZXh0dXJlQnJ1c2hfbmV3XzM9Ci1HZGlwX1RleHR1cmVCcnVzaF9uZXdfND0KLUdkaXBfVGV4dHVyZUJydXNoX25ld181PQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0dkaXBsdXNTdGFydHVwSW5wdXQ9ZmxhZ3M9Y3BwCi1HZGlwbHVzU3RhcnR1cElucHV0X0dkaXBsdXNWZXJzaW9uPQotR2RpcGx1c1N0YXJ0dXBJbnB1dF9EZWJ1Z0V2ZW50Q2FsbGJhY2s9Y2FzdD1EZWJ1Z0V2ZW50UHJvYwotR2RpcGx1c1N0YXJ0dXBJbnB1dF9TdXBwcmVzc0JhY2tncm91bmRUaHJlYWQ9Y2FzdD1CT09MCi1HZGlwbHVzU3RhcnR1cElucHV0X1N1cHByZXNzRXh0ZXJuYWxDb2RlY3M9Y2FzdD1CT09MCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rj0KLVBvaW50Rl9YPWNhc3Q9UkVBTAotUG9pbnRGX1k9Y2FzdD1SRUFMCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3Q9Ci1SZWN0X1g9Ci1SZWN0X1k9Ci1SZWN0X1dpZHRoPQotUmVjdF9IZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGPQotUmVjdEZfWD0KLVJlY3RGX1k9Ci1SZWN0Rl9XaWR0aD0KLVJlY3RGX0hlaWdodD0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2EwMzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ25vbWUuR05PTUUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ25vbWVfR05PTUU9Ci1HTk9NRV9Hbm9tZVZGU01pbWVBcHBsaWNhdGlvbl9zaXplb2Y9Ci0KLUdOT01FX19kbGNsb3NlPQotR05PTUVfX2RsY2xvc2VfMD1jYXN0PSh2b2lkICopCi0KLUdOT01FX19kbG9wZW49Ci1HTk9NRV9fZGxvcGVuXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotR05PTUVfX2Rsb3Blbl8xPQotCi1HTk9NRV9fZGxzeW09Ci1HTk9NRV9fZGxzeW1fMD1jYXN0PSh2b2lkICopCi1HTk9NRV9fZGxzeW1fMT1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nX2ZyZWU9Ci1HTk9NRV9fZ19mcmVlXzA9Y2FzdD1ncG9pbnRlcgotCi1HTk9NRV9fZ19saXN0X2FwcGVuZD0KLUdOT01FX19nX2xpc3RfYXBwZW5kXzA9Y2FzdD0oR0xpc3QgKikKLUdOT01FX19nX2xpc3RfYXBwZW5kXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLUdOT01FX19nX2xpc3RfZnJlZT0KLUdOT01FX19nX2xpc3RfZnJlZV8wPWNhc3Q9KEdMaXN0ICopCi0KLUdOT01FX19nX2xpc3RfbmV4dD0KLUdOT01FX19nX2xpc3RfbmV4dF8wPQotCi1HTk9NRV9fZ19vYmplY3RfdW5yZWY9Ci1HTk9NRV9fZ19vYmplY3RfdW5yZWZfMD1jYXN0PWdwb2ludGVyCi0KLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cD0KLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF8wPWNhc3Q9KEdub21lSWNvblRoZW1lICopCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfMT1jYXN0PUdub21lVGh1bWJuYWlsRmFjdG9yeSAqCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfMj1jYXN0PWNvbnN0IGNoYXIgKgotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzM9Y2FzdD1jb25zdCBjaGFyICoKLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF80PWNhc3Q9R25vbWVWRlNGaWxlSW5mbyAqCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfNT1jYXN0PWNvbnN0IGNoYXIgKgotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzY9Y2FzdD1Hbm9tZUljb25Mb29rdXBGbGFncwotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzc9Y2FzdD1Hbm9tZUljb25Mb29rdXBSZXN1bHRGbGFncyAqCi0KLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uPQotR05PTUVfX2dub21lX2ljb25fdGhlbWVfbG9va3VwX2ljb25fMD1jYXN0PUdub21lSWNvblRoZW1lICoKLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uXzE9Y2FzdD1jb25zdCBjaGFyICoKLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uXzI9Ci1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbl8zPWNhc3Q9KGNvbnN0IEdub21lSWNvbkRhdGEgKiopCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbl80PQotCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9uZXc9Ci0KLUdOT01FX19nbm9tZV92ZnNfZ2V0X3JlZ2lzdGVyZWRfbWltZV90eXBlcz0KLQotR05PTUVfX2dub21lX3Zmc19pbml0PQotCi1HTk9NRV9fZ25vbWVfdmZzX21ha2VfdXJpX2Zyb21faW5wdXQ9Ci1HTk9NRV9fZ25vbWVfdmZzX21ha2VfdXJpX2Zyb21faW5wdXRfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nbm9tZV92ZnNfbWFrZV91cmlfZnJvbV9pbnB1dF93aXRoX2RpcnM9ZmxhZ3M9ZHluYW1pYwotR05PTUVfX2dub21lX3Zmc19tYWtlX3VyaV9mcm9tX2lucHV0X3dpdGhfZGlyc18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLUdOT01FX19nbm9tZV92ZnNfbWFrZV91cmlfZnJvbV9pbnB1dF93aXRoX2RpcnNfMT0KLQotR05PTUVfX2dub21lX3Zmc19taW1lX2FwcGxpY2F0aW9uX2ZyZWU9Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfYXBwbGljYXRpb25fZnJlZV8wPWNhc3Q9R25vbWVWRlNNaW1lQXBwbGljYXRpb24gKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfYXBwbGljYXRpb25fbGF1bmNoPWZsYWdzPWR5bmFtaWMKLUdOT01FX19nbm9tZV92ZnNfbWltZV9hcHBsaWNhdGlvbl9sYXVuY2hfMD1jYXN0PShHbm9tZVZGU01pbWVBcHBsaWNhdGlvbiAqKQotR05PTUVfX2dub21lX3Zmc19taW1lX2FwcGxpY2F0aW9uX2xhdW5jaF8xPWNhc3Q9KEdMaXN0ICopCi0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9leHRlbnNpb25zX2xpc3RfZnJlZT0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9leHRlbnNpb25zX2xpc3RfZnJlZV8wPWNhc3Q9R0xpc3QgKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZ2V0X2RlZmF1bHRfYXBwbGljYXRpb249Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZ2V0X2RlZmF1bHRfYXBwbGljYXRpb25fMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9nZXRfZXh0ZW5zaW9uc19saXN0PQotR05PTUVfX2dub21lX3Zmc19taW1lX2dldF9leHRlbnNpb25zX2xpc3RfMD1jYXN0PWNvbnN0IGNoYXIgKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfcmVnaXN0ZXJlZF9taW1lX3R5cGVfbGlzdF9mcmVlPQotR05PTUVfX2dub21lX3Zmc19taW1lX3JlZ2lzdGVyZWRfbWltZV90eXBlX2xpc3RfZnJlZV8wPWNhc3Q9R0xpc3QgKgotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfdHlwZV9mcm9tX25hbWU9Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfdHlwZV9mcm9tX25hbWVfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX19nbm9tZV92ZnNfdXJsX3Nob3c9ZmxhZ3M9ZHluYW1pYwotR05PTUVfX2dub21lX3Zmc191cmxfc2hvd18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotR05PTUVfbWVtbW92ZT0KLUdOT01FX21lbW1vdmVfMD1jYXN0PXZvaWQgKixmbGFncz1ub19pbgotR05PTUVfbWVtbW92ZV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1HTk9NRV9tZW1tb3ZlXzI9Y2FzdD1zaXplX3QKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ25vbWVfR25vbWVWRlNNaW1lQXBwbGljYXRpb249Ci1Hbm9tZVZGU01pbWVBcHBsaWNhdGlvbl9pZD1jYXN0PWNoYXIgKgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fbmFtZT1jYXN0PWNoYXIgKgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fY29tbWFuZD1jYXN0PWNoYXIgKgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fY2FuX29wZW5fbXVsdGlwbGVfZmlsZXM9Y2FzdD1nYm9vbGVhbgotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fZXhwZWN0c191cmlzPWNhc3Q9R25vbWVWRlNNaW1lQXBwbGljYXRpb25Bcmd1bWVudFR5cGUKLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX3N1cHBvcnRlZF91cmlfc2NoZW1lcz1jYXN0PShHTGlzdCAqKQotR25vbWVWRlNNaW1lQXBwbGljYXRpb25fcmVxdWlyZXNfdGVybWluYWw9Y2FzdD1nYm9vbGVhbgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxY2M1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXAotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zXG5cCi0gKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSBWZXJzaW9uIDIuMSB0aGF0XG5cCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiAobGdwbC12MjEudHh0KS4gIFRoZSBMR1BMIGlzIGFsc29cblwKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC5odG1sLiAgSWYgdGhlIHZlcnNpb25cblwKLSAqIG9mIHRoZSBMR1BMIGF0IGh0dHA6Ly93d3cuZ251Lm9yZyBpcyBkaWZmZXJlbnQgdG8gdGhlIHZlcnNpb24gb2ZcblwKLSAqIHRoZSBMR1BMIGFjY29tcGFueWluZyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgdGhlcmUgaXMgYW55IGNvbmZsaWN0XG5cCi0gKiBiZXR3ZWVuIHRoZSB0d28gbGljZW5zZSB2ZXJzaW9ucywgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIGFjY29tcGFueWluZ1xuXAotICogdGhpcyBkaXN0cmlidXRpb24gc2hhbGwgZ292ZXJuLlxuXAotICogXG5cCi0gKiBDb250cmlidXRvcnM6XG5cCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLkdUSy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuR1RLLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzU2MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuR1RLLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUSz0KLUdUS19fR1RLX1dJREdFVF9IRUlHSFQ9Ci1HVEtfX0dUS19XSURHRVRfSEVJR0hUXzA9Y2FzdD1HdGtXaWRnZXQgKgotCi1HVEtfX0dUS19XSURHRVRfV0lEVEg9Ci1HVEtfX0dUS19XSURHRVRfV0lEVEhfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fZ19zaWduYWxfY29ubmVjdD0KLUdUS19fZ19zaWduYWxfY29ubmVjdF8wPWNhc3Q9KGdwb2ludGVyKQotR1RLX19nX3NpZ25hbF9jb25uZWN0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1HVEtfX2dfc2lnbmFsX2Nvbm5lY3RfMj1jYXN0PShHQ2FsbGJhY2spCi1HVEtfX2dfc2lnbmFsX2Nvbm5lY3RfMz1jYXN0PWdwb2ludGVyCi0KLUdUS19fZ3RrX2V2ZW50c19wZW5kaW5nPQotCi1HVEtfX2d0a19pbml0X2NoZWNrPQotR1RLX19ndGtfaW5pdF9jaGVja18wPWNhc3Q9aW50ICoKLUdUS19fZ3RrX2luaXRfY2hlY2tfMT1jYXN0PWNoYXIgKioqCi0KLUdUS19fZ3RrX21haW49Ci0KLUdUS19fZ3RrX21haW5faXRlcmF0aW9uPQotCi1HVEtfX2d0a19wbHVnX25ldz0KLUdUS19fZ3RrX3BsdWdfbmV3XzA9Ci0KLUdUS19fZ3RrX3dpZGdldF9kZXN0cm95PQotR1RLX19ndGtfd2lkZ2V0X2Rlc3Ryb3lfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fZ3RrX3dpZGdldF9zaG93PQotR1RLX19ndGtfd2lkZ2V0X3Nob3dfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fZ3RrX3dpZGdldF9zaG93X25vdz0KLUdUS19fZ3RrX3dpZGdldF9zaG93X25vd18wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotR1RLX19ndGtfd2luZG93X25ldz0KLUdUS19fZ3RrX3dpbmRvd19uZXdfMD1jYXN0PUd0a1dpbmRvd1R5cGUKLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5PUy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuT1MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkOTYzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5PUy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDY3MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvPQotR0ludGVyZmFjZUluZm9faW50ZXJmYWNlX2luaXQ9Y2FzdD0oR0ludGVyZmFjZUluaXRGdW5jKQotR0ludGVyZmFjZUluZm9faW50ZXJmYWNlX2ZpbmFsaXplPWNhc3Q9KEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpCi1HSW50ZXJmYWNlSW5mb19pbnRlcmZhY2VfZGF0YT1jYXN0PShncG9pbnRlcikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3M9Ci1HT2JqZWN0Q2xhc3NfY29uc3RydWN0b3I9Y2FzdD0oR09iamVjdCAqKCopKCkpCi1HT2JqZWN0Q2xhc3Nfc2V0X3Byb3BlcnR5PWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZ2V0X3Byb3BlcnR5PWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZGlzcG9zZT1jYXN0PSh2b2lkICgqKSgpKQotR09iamVjdENsYXNzX2ZpbmFsaXplPWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZGlzcGF0Y2hfcHJvcGVydGllc19jaGFuZ2VkPWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3Nfbm90aWZ5PWNhc3Q9KHZvaWQgKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVJbmZvPQotR1R5cGVJbmZvX2NsYXNzX3NpemU9Y2FzdD0oZ3VpbnQxNikKLUdUeXBlSW5mb19iYXNlX2luaXQ9Y2FzdD0oR0Jhc2VJbml0RnVuYykKLUdUeXBlSW5mb19iYXNlX2ZpbmFsaXplPWNhc3Q9KEdCYXNlRmluYWxpemVGdW5jKQotR1R5cGVJbmZvX2NsYXNzX2luaXQ9Y2FzdD0oR0NsYXNzSW5pdEZ1bmMpCi1HVHlwZUluZm9fY2xhc3NfZmluYWxpemU9Y2FzdD0oR0NsYXNzRmluYWxpemVGdW5jKQotR1R5cGVJbmZvX2NsYXNzX2RhdGE9Y2FzdD0oZ2NvbnN0cG9pbnRlcikKLUdUeXBlSW5mb19pbnN0YW5jZV9zaXplPWNhc3Q9KGd1aW50MTYpCi1HVHlwZUluZm9fbl9wcmVhbGxvY3M9Y2FzdD0oZ3VpbnQxNikKLUdUeXBlSW5mb19pbnN0YW5jZV9pbml0PWNhc3Q9KEdJbnN0YW5jZUluaXRGdW5jKQotR1R5cGVJbmZvX3ZhbHVlX3RhYmxlPWNhc3Q9KEdUeXBlVmFsdWVUYWJsZSAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlUXVlcnk9Ci1HVHlwZVF1ZXJ5X3R5cGU9Y2FzdD0oR1R5cGUpCi1HVHlwZVF1ZXJ5X3R5cGVfbmFtZT1jYXN0PShjb25zdCBnY2hhciAqKQotR1R5cGVRdWVyeV9jbGFzc19zaXplPWNhc3Q9KGd1aW50KQotR1R5cGVRdWVyeV9pbnN0YW5jZV9zaXplPWNhc3Q9KGd1aW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yPQotR2RrQ29sb3JfcGl4ZWw9Y2FzdD0oZ3VpbnQzMikKLUdka0NvbG9yX3JlZD1jYXN0PShndWludDE2KQotR2RrQ29sb3JfZ3JlZW49Y2FzdD0oZ3VpbnQxNikKLUdka0NvbG9yX2JsdWU9Y2FzdD0oZ3VpbnQxNikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtEcmFnQ29udGV4dD0KLUdka0RyYWdDb250ZXh0X3Byb3RvY29sPWNhc3Q9KEdka0RyYWdQcm90b2NvbCkKLUdka0RyYWdDb250ZXh0X2lzX3NvdXJjZT1jYXN0PShnYm9vbGVhbikKLUdka0RyYWdDb250ZXh0X3NvdXJjZV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtEcmFnQ29udGV4dF9kZXN0X3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0RyYWdDb250ZXh0X3RhcmdldHM9Y2FzdD0oR0xpc3QgKikKLUdka0RyYWdDb250ZXh0X2FjdGlvbnM9Y2FzdD0oR2RrRHJhZ0FjdGlvbikKLUdka0RyYWdDb250ZXh0X3N1Z2dlc3RlZF9hY3Rpb249Y2FzdD0oR2RrRHJhZ0FjdGlvbikKLUdka0RyYWdDb250ZXh0X2FjdGlvbj1jYXN0PShHZGtEcmFnQWN0aW9uKQotR2RrRHJhZ0NvbnRleHRfc3RhcnRfdGltZT1jYXN0PShndWludDMyKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50PQotR2RrRXZlbnRfdHlwZT1jYXN0PShHZGtFdmVudFR5cGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRBbnk9Ci1HZGtFdmVudEFueV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEFueV9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QnV0dG9uPQotR2RrRXZlbnRCdXR0b25fd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRCdXR0b25fc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50QnV0dG9uX3RpbWU9Y2FzdD0oZ3VpbnQzMikKLUdka0V2ZW50QnV0dG9uX3g9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50QnV0dG9uX3k9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50QnV0dG9uX2F4ZXM9Y2FzdD0oZ2RvdWJsZSAqKQotR2RrRXZlbnRCdXR0b25fc3RhdGU9Y2FzdD0oZ3VpbnQpCi1HZGtFdmVudEJ1dHRvbl9idXR0b249Y2FzdD0oZ3VpbnQpCi1HZGtFdmVudEJ1dHRvbl9kZXZpY2U9Y2FzdD0oR2RrRGV2aWNlICopCi1HZGtFdmVudEJ1dHRvbl94X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50QnV0dG9uX3lfcm9vdD1jYXN0PShnZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Q3Jvc3Npbmc9Ci1HZGtFdmVudENyb3NzaW5nX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50Q3Jvc3Npbmdfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50Q3Jvc3Npbmdfc3Vid2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRDcm9zc2luZ190aW1lPQotR2RrRXZlbnRDcm9zc2luZ194PQotR2RrRXZlbnRDcm9zc2luZ195PQotR2RrRXZlbnRDcm9zc2luZ194X3Jvb3Q9Ci1HZGtFdmVudENyb3NzaW5nX3lfcm9vdD0KLUdka0V2ZW50Q3Jvc3NpbmdfbW9kZT1jYXN0PShHZGtDcm9zc2luZ01vZGUpCi1HZGtFdmVudENyb3NzaW5nX2RldGFpbD1jYXN0PShHZGtOb3RpZnlUeXBlKQotR2RrRXZlbnRDcm9zc2luZ19mb2N1cz1jYXN0PShnYm9vbGVhbikKLUdka0V2ZW50Q3Jvc3Npbmdfc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRFeHBvc2U9Ci1HZGtFdmVudEV4cG9zZV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEV4cG9zZV9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRFeHBvc2VfYXJlYV94PWFjY2Vzc29yPWFyZWEueAotR2RrRXZlbnRFeHBvc2VfYXJlYV95PWFjY2Vzc29yPWFyZWEueQotR2RrRXZlbnRFeHBvc2VfYXJlYV93aWR0aD1hY2Nlc3Nvcj1hcmVhLndpZHRoCi1HZGtFdmVudEV4cG9zZV9hcmVhX2hlaWdodD1hY2Nlc3Nvcj1hcmVhLmhlaWdodAotR2RrRXZlbnRFeHBvc2VfcmVnaW9uPWNhc3Q9KEdka1JlZ2lvbiAqKQotR2RrRXZlbnRFeHBvc2VfY291bnQ9Y2FzdD0oZ2ludCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEZvY3VzPQotR2RrRXZlbnRGb2N1c193aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEZvY3VzX3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudEZvY3VzX2luPWNhc3Q9KGdpbnQxNikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEtleT0KLUdka0V2ZW50S2V5X3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50S2V5X3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudEtleV90aW1lPWNhc3Q9KGd1aW50MzIpCi1HZGtFdmVudEtleV9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50S2V5X2tleXZhbD1jYXN0PShndWludCkKLUdka0V2ZW50S2V5X2xlbmd0aD1jYXN0PShnaW50KQotR2RrRXZlbnRLZXlfc3RyaW5nPWNhc3Q9KGdjaGFyICopCi1HZGtFdmVudEtleV9oYXJkd2FyZV9rZXljb2RlPWNhc3Q9KGd1aW50MTYpCi1HZGtFdmVudEtleV9ncm91cD1jYXN0PShndWludDgpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRNb3Rpb249Ci1HZGtFdmVudE1vdGlvbl93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudE1vdGlvbl9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRNb3Rpb25fdGltZT1jYXN0PShndWludDMyKQotR2RrRXZlbnRNb3Rpb25feD1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRNb3Rpb25feT1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRNb3Rpb25fYXhlcz1jYXN0PShnZG91YmxlICopCi1HZGtFdmVudE1vdGlvbl9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50TW90aW9uX2lzX2hpbnQ9Y2FzdD0oZ2ludDE2KQotR2RrRXZlbnRNb3Rpb25fZGV2aWNlPWNhc3Q9KEdka0RldmljZSAqKQotR2RrRXZlbnRNb3Rpb25feF9yb290PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudE1vdGlvbl95X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFNjcm9sbD0KLUdka0V2ZW50U2Nyb2xsX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50U2Nyb2xsX3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudFNjcm9sbF90aW1lPWNhc3Q9KGd1aW50MzIpCi1HZGtFdmVudFNjcm9sbF94PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudFNjcm9sbF95PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudFNjcm9sbF9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50U2Nyb2xsX2RpcmVjdGlvbj1jYXN0PShHZGtTY3JvbGxEaXJlY3Rpb24pCi1HZGtFdmVudFNjcm9sbF9kZXZpY2U9Y2FzdD0oR2RrRGV2aWNlICopCi1HZGtFdmVudFNjcm9sbF94X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50U2Nyb2xsX3lfcm9vdD1jYXN0PShnZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50VmlzaWJpbGl0eT0KLUdka0V2ZW50VmlzaWJpbGl0eV93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudFZpc2liaWxpdHlfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50VmlzaWJpbGl0eV9zdGF0ZT1jYXN0PUdka1Zpc2liaWxpdHlTdGF0ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50V2luZG93U3RhdGU9Ci1HZGtFdmVudFdpbmRvd1N0YXRlX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50V2luZG93U3RhdGVfc2VuZF9ldmVudD0KLUdka0V2ZW50V2luZG93U3RhdGVfY2hhbmdlZF9tYXNrPQotR2RrRXZlbnRXaW5kb3dTdGF0ZV9uZXdfd2luZG93X3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0dDVmFsdWVzPQotR2RrR0NWYWx1ZXNfZm9yZWdyb3VuZF9waXhlbD1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLnBpeGVsLGNhc3Q9KGd1aW50MzIpCi1HZGtHQ1ZhbHVlc19mb3JlZ3JvdW5kX3JlZD1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLnJlZCxjYXN0PShndWludDE2KQotR2RrR0NWYWx1ZXNfZm9yZWdyb3VuZF9ncmVlbj1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLmdyZWVuLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19mb3JlZ3JvdW5kX2JsdWU9YWNjZXNzb3I9Zm9yZWdyb3VuZC5ibHVlLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19iYWNrZ3JvdW5kX3BpeGVsPWFjY2Vzc29yPWJhY2tncm91bmQucGl4ZWwsY2FzdD0oZ3VpbnQzMikKLUdka0dDVmFsdWVzX2JhY2tncm91bmRfcmVkPWFjY2Vzc29yPWJhY2tncm91bmQucmVkLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19iYWNrZ3JvdW5kX2dyZWVuPWFjY2Vzc29yPWJhY2tncm91bmQuZ3JlZW4sY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2JhY2tncm91bmRfYmx1ZT1hY2Nlc3Nvcj1iYWNrZ3JvdW5kLmJsdWUsY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2ZvbnQ9Y2FzdD0oR2RrRm9udCAqKQotR2RrR0NWYWx1ZXNfZnVuY3Rpb249Y2FzdD0oR2RrRnVuY3Rpb24pCi1HZGtHQ1ZhbHVlc19maWxsPWNhc3Q9KEdka0ZpbGwpCi1HZGtHQ1ZhbHVlc190aWxlPWNhc3Q9KEdka1BpeG1hcCAqKQotR2RrR0NWYWx1ZXNfc3RpcHBsZT1jYXN0PShHZGtQaXhtYXAgKikKLUdka0dDVmFsdWVzX2NsaXBfbWFzaz1jYXN0PShHZGtQaXhtYXAgKikKLUdka0dDVmFsdWVzX3N1YndpbmRvd19tb2RlPWNhc3Q9KEdka1N1YndpbmRvd01vZGUpCi1HZGtHQ1ZhbHVlc190c194X29yaWdpbj1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfdHNfeV9vcmlnaW49Y2FzdD0oZ2ludCkKLUdka0dDVmFsdWVzX2NsaXBfeF9vcmlnaW49Y2FzdD0oZ2ludCkKLUdka0dDVmFsdWVzX2NsaXBfeV9vcmlnaW49Y2FzdD0oZ2ludCkKLUdka0dDVmFsdWVzX2dyYXBoaWNzX2V4cG9zdXJlcz1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfbGluZV93aWR0aD1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfbGluZV9zdHlsZT1jYXN0PShHZGtMaW5lU3R5bGUpCi1HZGtHQ1ZhbHVlc19jYXBfc3R5bGU9Y2FzdD0oR2RrQ2FwU3R5bGUpCi1HZGtHQ1ZhbHVlc19qb2luX3N0eWxlPWNhc3Q9KEdka0pvaW5TdHlsZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtHZW9tZXRyeT0KLUdka0dlb21ldHJ5X21pbl93aWR0aD0KLUdka0dlb21ldHJ5X21pbl9oZWlnaHQ9Ci1HZGtHZW9tZXRyeV9tYXhfd2lkdGg9Ci1HZGtHZW9tZXRyeV9tYXhfaGVpZ2h0PQotR2RrR2VvbWV0cnlfYmFzZV93aWR0aD0KLUdka0dlb21ldHJ5X2Jhc2VfaGVpZ2h0PQotR2RrR2VvbWV0cnlfd2lkdGhfaW5jPQotR2RrR2VvbWV0cnlfaGVpZ2h0X2luYz0KLUdka0dlb21ldHJ5X21pbl9hc3BlY3Q9Ci1HZGtHZW9tZXRyeV9tYXhfYXNwZWN0PQotR2RrR2VvbWV0cnlfd2luX2dyYXZpdHk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrSW1hZ2U9Ci1HZGtJbWFnZV90eXBlPWNhc3Q9KEdka0ltYWdlVHlwZSkKLUdka0ltYWdlX3Zpc3VhbD1jYXN0PShHZGtWaXN1YWwgKikKLUdka0ltYWdlX2J5dGVfb3JkZXI9Y2FzdD0oR2RrQnl0ZU9yZGVyKQotR2RrSW1hZ2Vfd2lkdGg9Y2FzdD0oZ2ludCkKLUdka0ltYWdlX2hlaWdodD1jYXN0PShnaW50KQotR2RrSW1hZ2VfZGVwdGg9Y2FzdD0oZ3VpbnQxNikKLUdka0ltYWdlX2JwcD1jYXN0PShndWludDE2KQotR2RrSW1hZ2VfYnBsPWNhc3Q9KGd1aW50MTYpCi1HZGtJbWFnZV9iaXRzX3Blcl9waXhlbD1jYXN0PShndWludDE2KQotR2RrSW1hZ2VfbWVtPWNhc3Q9KGdwb2ludGVyKQotR2RrSW1hZ2VfY29sb3JtYXA9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLUdka0ltYWdlX3dpbmRvd2luZ19kYXRhPWNhc3Q9KGdwb2ludGVyKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1JlY3RhbmdsZT0KLUdka1JlY3RhbmdsZV94PWNhc3Q9KGdpbnQpCi1HZGtSZWN0YW5nbGVfeT1jYXN0PShnaW50KQotR2RrUmVjdGFuZ2xlX3dpZHRoPWNhc3Q9KGdpbnQpCi1HZGtSZWN0YW5nbGVfaGVpZ2h0PWNhc3Q9KGdpbnQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrVmlzdWFsPQotR2RrVmlzdWFsX3R5cGU9Y2FzdD0oR2RrVmlzdWFsVHlwZSkKLUdka1Zpc3VhbF9kZXB0aD1jYXN0PShnaW50KQotR2RrVmlzdWFsX2J5dGVfb3JkZXI9Y2FzdD0oR2RrQnl0ZU9yZGVyKQotR2RrVmlzdWFsX2NvbG9ybWFwX3NpemU9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9iaXRzX3Blcl9yZ2I9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9yZWRfbWFzaz1jYXN0PShndWludDMyKQotR2RrVmlzdWFsX3JlZF9zaGlmdD1jYXN0PShnaW50KQotR2RrVmlzdWFsX3JlZF9wcmVjPWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfZ3JlZW5fbWFzaz1jYXN0PShndWludDMyKQotR2RrVmlzdWFsX2dyZWVuX3NoaWZ0PWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfZ3JlZW5fcHJlYz1jYXN0PShnaW50KQotR2RrVmlzdWFsX2JsdWVfbWFzaz1jYXN0PShndWludDMyKQotR2RrVmlzdWFsX2JsdWVfc2hpZnQ9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9ibHVlX3ByZWM9Y2FzdD0oZ2ludCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtXaW5kb3dBdHRyPQotR2RrV2luZG93QXR0cl90aXRsZT1jYXN0PWdjaGFyICoKLUdka1dpbmRvd0F0dHJfZXZlbnRfbWFzaz0KLUdka1dpbmRvd0F0dHJfeD0KLUdka1dpbmRvd0F0dHJfeT0KLUdka1dpbmRvd0F0dHJfd2lkdGg9Ci1HZGtXaW5kb3dBdHRyX2hlaWdodD0KLUdka1dpbmRvd0F0dHJfd2NsYXNzPQotR2RrV2luZG93QXR0cl92aXN1YWw9Y2FzdD1HZGtWaXN1YWwgKgotR2RrV2luZG93QXR0cl9jb2xvcm1hcD1jYXN0PUdka0NvbG9ybWFwICoKLUdka1dpbmRvd0F0dHJfd2luZG93X3R5cGU9Ci1HZGtXaW5kb3dBdHRyX2N1cnNvcj1jYXN0PUdka0N1cnNvciAqCi1HZGtXaW5kb3dBdHRyX3dtY2xhc3NfbmFtZT1jYXN0PWdjaGFyICoKLUdka1dpbmRvd0F0dHJfd21jbGFzc19jbGFzcz1jYXN0PWdjaGFyICoKLUdka1dpbmRvd0F0dHJfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudD0KLUd0a0FkanVzdG1lbnRfbG93ZXI9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfdXBwZXI9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfdmFsdWU9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfc3RlcF9pbmNyZW1lbnQ9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfcGFnZV9pbmNyZW1lbnQ9Y2FzdD0oZ2RvdWJsZSkKLUd0a0FkanVzdG1lbnRfcGFnZV9zaXplPWNhc3Q9KGdkb3VibGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWxsb2NhdGlvbj0KLUd0a0FsbG9jYXRpb25feD0KLUd0a0FsbG9jYXRpb25feT0KLUd0a0FsbG9jYXRpb25fd2lkdGg9Ci1HdGtBbGxvY2F0aW9uX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtCb3JkZXI9Ci1HdGtCb3JkZXJfbGVmdD0KLUd0a0JvcmRlcl9yaWdodD0KLUd0a0JvcmRlcl90b3A9Ci1HdGtCb3JkZXJfYm90dG9tPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nPQotR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfY29sb3JzZWw9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ19va19idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ19jYW5jZWxfYnV0dG9uPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfaGVscF9idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29tYm89Ci1HdGtDb21ib19lbnRyeT1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0NvbWJvX2xpc3Q9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRmlsZVNlbGVjdGlvbj0KLUd0a0ZpbGVTZWxlY3Rpb25fZGlyX2xpc3Q9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVfbGlzdD1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fc2VsZWN0aW9uX2VudHJ5PWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9zZWxlY3Rpb25fdGV4dD1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fbWFpbl92Ym94PWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9va19idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2NhbmNlbF9idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2hlbHBfYnV0dG9uPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9oaXN0b3J5X3B1bGxkb3duPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9oaXN0b3J5X21lbnU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2hpc3RvcnlfbGlzdD1jYXN0PShHTGlzdCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfZGlhbG9nPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfZW50cnk9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVvcF9maWxlPWNhc3Q9KGdjaGFyICopCi1HdGtGaWxlU2VsZWN0aW9uX2NtcGxfc3RhdGU9Y2FzdD0oZ3BvaW50ZXIpCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVvcF9jX2Rpcj1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fZmlsZW9wX2RlbF9maWxlPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfcmVuX2ZpbGU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2J1dHRvbl9hcmVhPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9hY3Rpb25fYXJlYT1jYXN0PShHdGtXaWRnZXQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZD0KLUd0a0ZpeGVkX2NoaWxkcmVuPWNhc3Q9KEdMaXN0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrUmVxdWlzaXRpb249Ci1HdGtSZXF1aXNpdGlvbl93aWR0aD0KLUd0a1JlcXVpc2l0aW9uX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhPQotR3RrU2VsZWN0aW9uRGF0YV9zZWxlY3Rpb249Y2FzdD0oR2RrQXRvbSkKLUd0a1NlbGVjdGlvbkRhdGFfdGFyZ2V0PWNhc3Q9KEdka0F0b20pCi1HdGtTZWxlY3Rpb25EYXRhX3R5cGU9Y2FzdD0oR2RrQXRvbSkKLUd0a1NlbGVjdGlvbkRhdGFfZm9ybWF0PWNhc3Q9KGdpbnQpCi1HdGtTZWxlY3Rpb25EYXRhX2RhdGE9Y2FzdD0oZ3VjaGFyICopCi1HdGtTZWxlY3Rpb25EYXRhX2xlbmd0aD1jYXN0PShnaW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldEVudHJ5PQotR3RrVGFyZ2V0RW50cnlfdGFyZ2V0PWNhc3Q9KGdjaGFyICopCi1HdGtUYXJnZXRFbnRyeV9mbGFncz1jYXN0PShndWludCkKLUd0a1RhcmdldEVudHJ5X2luZm89Y2FzdD0oZ3VpbnQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcj0KLUd0a1RhcmdldFBhaXJfdGFyZ2V0PWNhc3Q9KEdka0F0b20pCi1HdGtUYXJnZXRQYWlyX2ZsYWdzPWNhc3Q9KGd1aW50KQotR3RrVGFyZ2V0UGFpcl9pbmZvPWNhc3Q9KGd1aW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzPQotR3RrV2lkZ2V0Q2xhc3NfYWN0aXZhdGVfc2lnbmFsPQotR3RrV2lkZ2V0Q2xhc3Nfc2V0X3Njcm9sbF9hZGp1c3RtZW50c19zaWduYWw9Ci1HdGtXaWRnZXRDbGFzc19kaXNwYXRjaF9jaGlsZF9wcm9wZXJ0aWVzX2NoYW5nZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2hvdz1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zaG93X2FsbD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19oaWRlPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2hpZGVfYWxsPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX21hcD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc191bm1hcD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19yZWFsaXplPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX3VucmVhbGl6ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zaXplX3JlcXVlc3Q9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2l6ZV9hbGxvY2F0ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zdGF0ZV9jaGFuZ2VkPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX3BhcmVudF9zZXQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfaGllcmFyY2h5X2NoYW5nZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc3R5bGVfc2V0PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2RpcmVjdGlvbl9jaGFuZ2VkPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2dyYWJfbm90aWZ5PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2NoaWxkX25vdGlmeT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19tbmVtb25pY19hY3RpdmF0ZT1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZ3JhYl9mb2N1cz1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19mb2N1cz1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2J1dHRvbl9wcmVzc19ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfYnV0dG9uX3JlbGVhc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3Njcm9sbF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfbW90aW9uX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZGVsZXRlX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kZXN0cm95X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19leHBvc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2tleV9wcmVzc19ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfa2V5X3JlbGVhc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2VudGVyX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfbGVhdmVfbm90aWZ5X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19jb25maWd1cmVfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2ZvY3VzX2luX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19mb2N1c19vdXRfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX21hcF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfdW5tYXBfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3Byb3BlcnR5X25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX2NsZWFyX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zZWxlY3Rpb25fcmVxdWVzdF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfcHJveGltaXR5X2luX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19wcm94aW1pdHlfb3V0X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc192aXNpYmlsaXR5X25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfY2xpZW50X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19ub19leHBvc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3dpbmRvd19zdGF0ZV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX2dldD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zZWxlY3Rpb25fcmVjZWl2ZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19iZWdpbj1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2VuZD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2RhdGFfZ2V0PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2RyYWdfZGF0YV9kZWxldGU9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19sZWF2ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX21vdGlvbj1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19kcm9wPWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2RhdGFfcmVjZWl2ZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfcG9wdXBfbWVudT1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2hvd19oZWxwPWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19nZXRfYWNjZXNzaWJsZT1jYXN0PShBdGtPYmplY3QqKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zY3JlZW5fY2hhbmdlZD1jYXN0PSh2b2lkKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfTE9ORz1mbGFncz1ub19nZW4KLUxPTkdfdmFsdWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfT1M9Ci1PU19DYWxsPQotT1NfQ2FsbF8wPQotT1NfQ2FsbF8xPQotT1NfQ2FsbF8yPQotT1NfQ2FsbF8zPQotCi1PU19HREtfV0lORE9XSU5HX1gxMT1mbGFncz1ub19nZW4KLQotT1NfR0ludGVyZmFjZUluZm9fc2l6ZW9mPQotCi1PU19HUG9sbEZEX3NpemVvZj0KLQotT1NfR1RLX0FDQ0VMX0xBQkVMX0dFVF9BQ0NFTF9TVFJJTkc9Ci1PU19HVEtfQUNDRUxfTEFCRUxfR0VUX0FDQ0VMX1NUUklOR18wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLQotT1NfR1RLX0FDQ0VMX0xBQkVMX1NFVF9BQ0NFTF9TVFJJTkc9Ci1PU19HVEtfQUNDRUxfTEFCRUxfU0VUX0FDQ0VMX1NUUklOR18wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLU9TX0dUS19BQ0NFTF9MQUJFTF9TRVRfQUNDRUxfU1RSSU5HXzE9Y2FzdD0oZ2NoYXIgKikKLQotT1NfR1RLX0VOVFJZX0lNX0NPTlRFWFQ9Ci1PU19HVEtfRU5UUllfSU1fQ09OVEVYVF8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfSFNDUk9MTEJBUj0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfSFNDUk9MTEJBUl8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfU0NST0xMQkFSX1NQQUNJTkc9Ci1PU19HVEtfU0NST0xMRURfV0lORE9XX1NDUk9MTEJBUl9TUEFDSU5HXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfR1RLX1NDUk9MTEVEX1dJTkRPV19WU0NST0xMQkFSPQotT1NfR1RLX1NDUk9MTEVEX1dJTkRPV19WU0NST0xMQkFSXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfR1RLX1RFWFRWSUVXX0lNX0NPTlRFWFQ9Ci1PU19HVEtfVEVYVFZJRVdfSU1fQ09OVEVYVF8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX0dUS19XSURHRVRfSEVJR0hUPQotT1NfR1RLX1dJREdFVF9IRUlHSFRfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1RLX1dJREdFVF9SRVFVSVNJVElPTl9IRUlHSFQ9Ci1PU19HVEtfV0lER0VUX1JFUVVJU0lUSU9OX0hFSUdIVF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1JFUVVJU0lUSU9OX1dJRFRIPQotT1NfR1RLX1dJREdFVF9SRVFVSVNJVElPTl9XSURUSF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1NFVF9IRUlHSFQ9Ci1PU19HVEtfV0lER0VUX1NFVF9IRUlHSFRfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX0dUS19XSURHRVRfU0VUX0hFSUdIVF8xPQotCi1PU19HVEtfV0lER0VUX1NFVF9XSURUSD0KLU9TX0dUS19XSURHRVRfU0VUX1dJRFRIXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19HVEtfV0lER0VUX1NFVF9XSURUSF8xPQotCi1PU19HVEtfV0lER0VUX1NFVF9YPQotT1NfR1RLX1dJREdFVF9TRVRfWF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfR1RLX1dJREdFVF9TRVRfWF8xPQotCi1PU19HVEtfV0lER0VUX1NFVF9ZPQotT1NfR1RLX1dJREdFVF9TRVRfWV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfR1RLX1dJREdFVF9TRVRfWV8xPQotCi1PU19HVEtfV0lER0VUX1dJRFRIPQotT1NfR1RLX1dJREdFVF9XSURUSF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1dJTkRPVz0KLU9TX0dUS19XSURHRVRfV0lORE9XXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX0dUS19XSURHRVRfWD0KLU9TX0dUS19XSURHRVRfWF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1k9Ci1PU19HVEtfV0lER0VUX1lfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1R5cGVJbmZvX3NpemVvZj0KLQotT1NfR1R5cGVRdWVyeV9zaXplb2Y9Ci0KLU9TX0dka0NvbG9yX3NpemVvZj0KLQotT1NfR2RrRHJhZ0NvbnRleHRfc2l6ZW9mPQotCi1PU19HZGtFdmVudEFueV9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50QnV0dG9uX3NpemVvZj0KLQotT1NfR2RrRXZlbnRDcm9zc2luZ19zaXplb2Y9Ci0KLU9TX0dka0V2ZW50RXhwb3NlX3NpemVvZj0KLQotT1NfR2RrRXZlbnRGb2N1c19zaXplb2Y9Ci0KLU9TX0dka0V2ZW50S2V5X3NpemVvZj0KLQotT1NfR2RrRXZlbnRNb3Rpb25fc2l6ZW9mPQotCi1PU19HZGtFdmVudFNjcm9sbF9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50VmlzaWJpbGl0eV9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50V2luZG93U3RhdGVfc2l6ZW9mPQotCi1PU19HZGtFdmVudF9zaXplb2Y9Ci0KLU9TX0dka0dDVmFsdWVzX3NpemVvZj0KLQotT1NfR2RrR2VvbWV0cnlfc2l6ZW9mPQotCi1PU19HZGtJbWFnZV9zaXplb2Y9Ci0KLU9TX0dka1JlY3RhbmdsZV9zaXplb2Y9Ci0KLU9TX0dka1Zpc3VhbF9zaXplb2Y9Ci0KLU9TX0dka1dpbmRvd0F0dHJfc2l6ZW9mPQotCi1PU19HdGtBZGp1c3RtZW50X3NpemVvZj0KLQotT1NfR3RrQWxsb2NhdGlvbl9zaXplb2Y9Ci0KLU9TX0d0a0JvcmRlcl9zaXplb2Y9Ci0KLU9TX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nX3NpemVvZj0KLQotT1NfR3RrQ29tYm9fc2l6ZW9mPQotCi1PU19HdGtGaWxlU2VsZWN0aW9uX3NpemVvZj0KLQotT1NfR3RrRml4ZWRDbGFzc19zaXplb2Y9Ci0KLU9TX0d0a0ZpeGVkX3NpemVvZj0KLQotT1NfR3RrUmVxdWlzaXRpb25fc2l6ZW9mPQotCi1PU19HdGtTZWxlY3Rpb25EYXRhX3NpemVvZj0KLQotT1NfR3RrVGFyZ2V0RW50cnlfc2l6ZW9mPQotCi1PU19HdGtUYXJnZXRQYWlyX3NpemVvZj0KLQotT1NfR3RrVGV4dEl0ZXJfc2l6ZW9mPQotCi1PU19HdGtUcmVlSXRlcl9zaXplb2Y9Ci0KLU9TX1BUUl9zaXplb2Y9Ci0KLU9TX1BhbmdvQXR0cmlidXRlX3NpemVvZj0KLQotT1NfUGFuZ29JdGVtX3NpemVvZj0KLQotT1NfUGFuZ29MYXlvdXRMaW5lX3NpemVvZj0KLQotT1NfUGFuZ29MYXlvdXRSdW5fc2l6ZW9mPQotCi1PU19QYW5nb0xvZ0F0dHJfc2l6ZW9mPQotCi1PU19QYW5nb1JlY3RhbmdsZV9zaXplb2Y9Ci0KLU9TX1hBbnlFdmVudF9zaXplb2Y9Ci0KLU9TX1hCdXR0b25FdmVudF9zaXplb2Y9Ci0KLU9TX1hDbGllbnRNZXNzYWdlRXZlbnRfc2l6ZW9mPQotCi1PU19YQ3Jvc3NpbmdFdmVudF9zaXplb2Y9Ci0KLU9TX1hFdmVudF9zaXplb2Y9Ci0KLU9TX1hFeHBvc2VFdmVudF9zaXplb2Y9Ci0KLU9TX1hGb2N1c0NoYW5nZUV2ZW50X3NpemVvZj0KLQotT1NfWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3NpemVvZj0KLQotT1NfWFZpc2liaWxpdHlFdmVudF9zaXplb2Y9Ci0KLU9TX1hXaW5kb3dDaGFuZ2VzX3NpemVvZj0KLQotT1NfX0NhbGw9Ci1PU19fQ2FsbF8wPQotT1NfX0NhbGxfMT0KLU9TX19DYWxsXzI9Ci0KLU9TX19HREtfRElTUExBWT0KLQotT1NfX0dES19QSVhNQVBfWElEPQotT1NfX0dES19QSVhNQVBfWElEXzA9Y2FzdD1HZGtQaXhtYXAgKgotCi1PU19fR0RLX1JPT1RfUEFSRU5UPQotCi1PU19fR0RLX1RZUEVfQ09MT1I9ZmxhZ3M9Y29uc3QKLQotT1NfX0dES19UWVBFX1BJWEJVRj1mbGFncz1jb25zdAotCi1PU19fR1RLX0lTX0JVVFRPTj0KLU9TX19HVEtfSVNfQlVUVE9OXzA9Ci0KLU9TX19HVEtfSVNfQ0VMTF9SRU5ERVJFUl9QSVhCVUY9Ci1PU19fR1RLX0lTX0NFTExfUkVOREVSRVJfUElYQlVGXzA9Ci0KLU9TX19HVEtfSVNfQ0VMTF9SRU5ERVJFUl9URVhUPQotT1NfX0dUS19JU19DRUxMX1JFTkRFUkVSX1RFWFRfMD0KLQotT1NfX0dUS19JU19DT05UQUlORVI9Ci1PU19fR1RLX0lTX0NPTlRBSU5FUl8wPQotCi1PU19fR1RLX0lTX0lNQUdFX01FTlVfSVRFTT0KLU9TX19HVEtfSVNfSU1BR0VfTUVOVV9JVEVNXzA9Ci0KLU9TX19HVEtfU1RPQ0tfQ0FOQ0VMPWZsYWdzPWNvbnN0Ci0KLU9TX19HVEtfU1RPQ0tfT0s9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19UWVBFX0ZJWEVEPWZsYWdzPWNvbnN0Ci0KLU9TX19HVEtfVFlQRV9XSURHRVQ9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19XSURHRVRfRkxBR1M9Ci1PU19fR1RLX1dJREdFVF9GTEFHU18wPQotCi1PU19fR1RLX1dJREdFVF9IQVNfREVGQVVMVD0KLU9TX19HVEtfV0lER0VUX0hBU19ERUZBVUxUXzA9Ci0KLU9TX19HVEtfV0lER0VUX0hBU19GT0NVUz0KLU9TX19HVEtfV0lER0VUX0hBU19GT0NVU18wPQotCi1PU19fR1RLX1dJREdFVF9JU19TRU5TSVRJVkU9Ci1PU19fR1RLX1dJREdFVF9JU19TRU5TSVRJVkVfMD0KLQotT1NfX0dUS19XSURHRVRfTUFQUEVEPQotT1NfX0dUS19XSURHRVRfTUFQUEVEXzA9Ci0KLU9TX19HVEtfV0lER0VUX1NFTlNJVElWRT0KLU9TX19HVEtfV0lER0VUX1NFTlNJVElWRV8wPQotCi1PU19fR1RLX1dJREdFVF9TRVRfRkxBR1M9Ci1PU19fR1RLX1dJREdFVF9TRVRfRkxBR1NfMD0KLU9TX19HVEtfV0lER0VUX1NFVF9GTEFHU18xPQotCi1PU19fR1RLX1dJREdFVF9TVEFURT0KLU9TX19HVEtfV0lER0VUX1NUQVRFXzA9Ci0KLU9TX19HVEtfV0lER0VUX1VOU0VUX0ZMQUdTPQotT1NfX0dUS19XSURHRVRfVU5TRVRfRkxBR1NfMD0KLU9TX19HVEtfV0lER0VUX1VOU0VUX0ZMQUdTXzE9Ci0KLU9TX19HVEtfV0lER0VUX1ZJU0lCTEU9Ci1PU19fR1RLX1dJREdFVF9WSVNJQkxFXzA9Ci0KLU9TX19HX09CSkVDVF9DTEFTUz0KLU9TX19HX09CSkVDVF9DTEFTU18wPQotCi1PU19fR19PQkpFQ1RfR0VUX0NMQVNTPQotT1NfX0dfT0JKRUNUX0dFVF9DTEFTU18wPQotCi1PU19fR19PQkpFQ1RfVFlQRT0KLU9TX19HX09CSkVDVF9UWVBFXzA9Ci0KLU9TX19HX1RZUEVfQk9PTEVBTj1mbGFncz1jb25zdAotCi1PU19fR19UWVBFX0lOVD1mbGFncz1jb25zdAotCi1PU19fR19UWVBFX1NUUklORz1mbGFncz1jb25zdAotCi1PU19fUEFOR09fUElYRUxTPQotT1NfX1BBTkdPX1BJWEVMU18wPQotCi1PU19fUEFOR09fVFlQRV9GT05UX0RFU0NSSVBUSU9OPWZsYWdzPWNvbnN0Ci0KLU9TX19YQ2hlY2tJZkV2ZW50PQotT1NfX1hDaGVja0lmRXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoZWNrSWZFdmVudF8xPWNhc3Q9WEV2ZW50ICoKLU9TX19YQ2hlY2tJZkV2ZW50XzI9Y2FzdD0oQm9vbCAoKikoKSkKLU9TX19YQ2hlY2tJZkV2ZW50XzM9Y2FzdD0oWFBvaW50ZXIpCi0KLU9TX19YQ2hlY2tNYXNrRXZlbnQ9Ci1PU19fWENoZWNrTWFza0V2ZW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGVja01hc2tFdmVudF8xPWNhc3Q9KGxvbmcpCi1PU19fWENoZWNrTWFza0V2ZW50XzI9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudD0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8xPWNhc3Q9V2luZG93Ci1PU19fWENoZWNrV2luZG93RXZlbnRfMj1jYXN0PShsb25nKQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzM9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YRGVmYXVsdFJvb3RXaW5kb3c9Ci1PU19fWERlZmF1bHRSb290V2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLQotT1NfX1hEZWZhdWx0U2NyZWVuPQotT1NfX1hEZWZhdWx0U2NyZWVuXzA9Y2FzdD1EaXNwbGF5ICoKLQotT1NfX1hGbHVzaD0KLU9TX19YRmx1c2hfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YRnJlZT0KLU9TX19YRnJlZV8wPWNhc3Q9dm9pZCAqCi0KLU9TX19YR2V0U2VsZWN0aW9uT3duZXI9Ci1PU19fWEdldFNlbGVjdGlvbk93bmVyXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHZXRTZWxlY3Rpb25Pd25lcl8xPWNhc3Q9KEF0b20pCi0KLU9TX19YSW50ZXJuQXRvbT0KLU9TX19YSW50ZXJuQXRvbV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEludGVybkF0b21fMT1jYXN0PWNoYXIgKgotT1NfX1hJbnRlcm5BdG9tXzI9Y2FzdD1Cb29sCi0KLU9TX19YS2V5c3ltVG9LZXljb2RlPQotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMT1jYXN0PUtleVN5bQotCi1PU19fWExpc3RQcm9wZXJ0aWVzPQotT1NfX1hMaXN0UHJvcGVydGllc18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWExpc3RQcm9wZXJ0aWVzXzE9Y2FzdD1XaW5kb3cKLU9TX19YTGlzdFByb3BlcnRpZXNfMj1jYXN0PWludCAqCi0KLU9TX19YUXVlcnlUcmVlPQotT1NfX1hRdWVyeVRyZWVfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hRdWVyeVRyZWVfMT1jYXN0PVdpbmRvdwotT1NfX1hRdWVyeVRyZWVfMj1jYXN0PVdpbmRvdyAqCi1PU19fWFF1ZXJ5VHJlZV8zPWNhc3Q9V2luZG93ICoKLU9TX19YUXVlcnlUcmVlXzQ9Y2FzdD1XaW5kb3cgKioKLU9TX19YUXVlcnlUcmVlXzU9Y2FzdD11bnNpZ25lZCBpbnQgKgotCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3c9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzE9Y2FzdD0oV2luZG93KQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzI9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMz0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd180PWZsYWdzPW5vX291dAotCi1PU19fWFJlbmRlckNvbXBvc2l0ZT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckNvbXBvc2l0ZV8wPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzI9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8zPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfND0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzU9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV82PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfNz0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzg9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV85PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMTA9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzEyPQotCi1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmU9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzA9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMT0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8yPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzM9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfND1mbGFncz1ub19vdXQKLQotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFN0YW5kYXJkRm9ybWF0XzE9Ci0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdD1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckZpbmRWaXN1YWxGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdF8xPQotCi1PU19fWFJlbmRlckZyZWVQaWN0dXJlPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMD0KLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMT0KLQotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbj1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzA9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzE9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzI9Ci0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzA9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18xPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMj0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzM9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc180PQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfNT0KLQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybV8wPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtXzE9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm1fMj0KLQotT1NfX1hTZW5kRXZlbnQ9Ci1PU19fWFNlbmRFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2VuZEV2ZW50XzE9Y2FzdD0oV2luZG93KQotT1NfX1hTZW5kRXZlbnRfMj0KLU9TX19YU2VuZEV2ZW50XzM9Ci1PU19fWFNlbmRFdmVudF80PWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWFNldEVycm9ySGFuZGxlcj0KLU9TX19YU2V0RXJyb3JIYW5kbGVyXzA9Y2FzdD0oWEVycm9ySGFuZGxlcikKLQotT1NfX1hTZXRJT0Vycm9ySGFuZGxlcj0KLU9TX19YU2V0SU9FcnJvckhhbmRsZXJfMD1jYXN0PShYSU9FcnJvckhhbmRsZXIpCi0KLU9TX19YU2V0SW5wdXRGb2N1cz0KLU9TX19YU2V0SW5wdXRGb2N1c18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFNldElucHV0Rm9jdXNfMT1jYXN0PVdpbmRvdwotT1NfX1hTZXRJbnB1dEZvY3VzXzI9Ci1PU19fWFNldElucHV0Rm9jdXNfMz0KLQotT1NfX1hTeW5jaHJvbml6ZT0KLU9TX19YU3luY2hyb25pemVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFN5bmNocm9uaXplXzE9Ci0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudD0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUJ1dHRvbkV2ZW50XzM9Y2FzdD0odW5zaWduZWQgbG9uZykKLQotT1NfX1hUZXN0RmFrZUtleUV2ZW50PQotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVGVzdEZha2VLZXlFdmVudF8xPQotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzI9Y2FzdD1Cb29sCi1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMz1jYXN0PXVuc2lnbmVkIGxvbmcKLQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50PQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8xPQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzI9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMz0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF80PWNhc3Q9dW5zaWduZWQgbG9uZwotCi1PU19fWFdhcnBQb2ludGVyPQotT1NfX1hXYXJwUG9pbnRlcl8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFdhcnBQb2ludGVyXzE9Y2FzdD1XaW5kb3cKLU9TX19YV2FycFBvaW50ZXJfMj1jYXN0PVdpbmRvdwotT1NfX1hXYXJwUG9pbnRlcl8zPQotT1NfX1hXYXJwUG9pbnRlcl80PQotT1NfX1hXYXJwUG9pbnRlcl81PQotT1NfX1hXYXJwUG9pbnRlcl82PQotT1NfX1hXYXJwUG9pbnRlcl83PQotT1NfX1hXYXJwUG9pbnRlcl84PQotCi1PU19fZ19jY2xvc3VyZV9uZXc9Ci1PU19fZ19jY2xvc3VyZV9uZXdfMD1jYXN0PShHQ2FsbGJhY2spCi1PU19fZ19jY2xvc3VyZV9uZXdfMT1jYXN0PShncG9pbnRlcikKLU9TX19nX2NjbG9zdXJlX25ld18yPWNhc3Q9KEdDbG9zdXJlTm90aWZ5KQotCi1PU19fZ19jbG9zdXJlX3JlZj0KLU9TX19nX2Nsb3N1cmVfcmVmXzA9Y2FzdD0oR0Nsb3N1cmUgKikKLQotT1NfX2dfY2xvc3VyZV91bnJlZj0KLU9TX19nX2Nsb3N1cmVfdW5yZWZfMD1jYXN0PShHQ2xvc3VyZSAqKQotCi1PU19fZ19maWxlbmFtZV9mcm9tX3VyaT0KLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXJpXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91cmlfMT1jYXN0PShjaGFyICoqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91cmlfMj1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOD0KLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19maWxlbmFtZV9mcm9tX3V0ZjhfMT1jYXN0PShnc3NpemUpCi1PU19fZ19maWxlbmFtZV9mcm9tX3V0ZjhfMj1jYXN0PShnc2l6ZSAqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91dGY4XzM9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOF80PWNhc3Q9KEdFcnJvciAqKikKLQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpPQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpXzI9Y2FzdD0oR0Vycm9yICoqKQotCi1PU19fZ19maWxlbmFtZV90b191dGY4PQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19maWxlbmFtZV90b191dGY4XzE9Y2FzdD0oZ3NzaXplKQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOF8yPWNhc3Q9KGdzaXplICopCi1PU19fZ19maWxlbmFtZV90b191dGY4XzM9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2ZpbGVuYW1lX3RvX3V0ZjhfND1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2ZyZWU9Ci1PU19fZ19mcmVlXzA9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX2xpc3RfYXBwZW5kPQotT1NfX2dfbGlzdF9hcHBlbmRfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9hcHBlbmRfMT1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfbGlzdF9kYXRhPQotT1NfX2dfbGlzdF9kYXRhXzA9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9mcmVlPQotT1NfX2dfbGlzdF9mcmVlXzA9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9mcmVlXzE9Ci1PU19fZ19saXN0X2ZyZWVfMV8wPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3RfbGVuZ3RoPQotT1NfX2dfbGlzdF9sZW5ndGhfMD1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X25leHQ9Ci1PU19fZ19saXN0X25leHRfMD0KLQotT1NfX2dfbGlzdF9udGg9Ci1PU19fZ19saXN0X250aF8wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X250aF8xPWNhc3Q9KGd1aW50KQotCi1PU19fZ19saXN0X250aF9kYXRhPQotT1NfX2dfbGlzdF9udGhfZGF0YV8wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X250aF9kYXRhXzE9Y2FzdD0oZ3VpbnQpCi0KLU9TX19nX2xpc3RfcHJlcGVuZD0KLU9TX19nX2xpc3RfcHJlcGVuZF8wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X3ByZXBlbmRfMT1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfbGlzdF9wcmV2aW91cz0KLU9TX19nX2xpc3RfcHJldmlvdXNfMD0KLQotT1NfX2dfbGlzdF9yZW1vdmVfbGluaz0KLU9TX19nX2xpc3RfcmVtb3ZlX2xpbmtfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9yZW1vdmVfbGlua18xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3RfcmV2ZXJzZT0KLU9TX19nX2xpc3RfcmV2ZXJzZV8wPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3Rfc2V0X25leHQ9Ci1PU19fZ19saXN0X3NldF9uZXh0XzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3Rfc2V0X25leHRfMT1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X3NldF9wcmV2aW91cz0KLU9TX19nX2xpc3Rfc2V0X3ByZXZpb3VzXzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3Rfc2V0X3ByZXZpb3VzXzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbG9jYWxlX2Zyb21fdXRmOD0KLU9TX19nX2xvY2FsZV9mcm9tX3V0ZjhfMD1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfbG9jYWxlX2Zyb21fdXRmOF8xPWNhc3Q9KGdzc2l6ZSkKLU9TX19nX2xvY2FsZV9mcm9tX3V0ZjhfMj1jYXN0PShnc2l6ZSAqKQotT1NfX2dfbG9jYWxlX2Zyb21fdXRmOF8zPWNhc3Q9KGdzaXplICopCi1PU19fZ19sb2NhbGVfZnJvbV91dGY4XzQ9Y2FzdD0oR0Vycm9yICoqKQotCi1PU19fZ19sb2NhbGVfdG9fdXRmOD0KLU9TX19nX2xvY2FsZV90b191dGY4XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19nX2xvY2FsZV90b191dGY4XzE9Y2FzdD0oZ3NzaXplKQotT1NfX2dfbG9jYWxlX3RvX3V0ZjhfMj1jYXN0PShnc2l6ZSAqKQotT1NfX2dfbG9jYWxlX3RvX3V0ZjhfMz1jYXN0PShnc2l6ZSAqKQotT1NfX2dfbG9jYWxlX3RvX3V0ZjhfND1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2xvZ19kZWZhdWx0X2hhbmRsZXI9Ci1PU19fZ19sb2dfZGVmYXVsdF9oYW5kbGVyXzA9Y2FzdD0oZ2NoYXIgKikKLU9TX19nX2xvZ19kZWZhdWx0X2hhbmRsZXJfMT1jYXN0PShHTG9nTGV2ZWxGbGFncykKLU9TX19nX2xvZ19kZWZhdWx0X2hhbmRsZXJfMj1jYXN0PShnY2hhciAqKQotT1NfX2dfbG9nX2RlZmF1bHRfaGFuZGxlcl8zPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19sb2dfcmVtb3ZlX2hhbmRsZXI9Ci1PU19fZ19sb2dfcmVtb3ZlX2hhbmRsZXJfMD1jYXN0PShnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX19nX2xvZ19yZW1vdmVfaGFuZGxlcl8xPWNhc3Q9KGdpbnQpCi0KLU9TX19nX2xvZ19zZXRfaGFuZGxlcj0KLU9TX19nX2xvZ19zZXRfaGFuZGxlcl8wPWNhc3Q9KGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfX2dfbG9nX3NldF9oYW5kbGVyXzE9Y2FzdD0oR0xvZ0xldmVsRmxhZ3MpCi1PU19fZ19sb2dfc2V0X2hhbmRsZXJfMj1jYXN0PShHTG9nRnVuYykKLU9TX19nX2xvZ19zZXRfaGFuZGxlcl8zPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19tYWluX2NvbnRleHRfYWNxdWlyZT0KLU9TX19nX21haW5fY29udGV4dF9hY3F1aXJlXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotCi1PU19fZ19tYWluX2NvbnRleHRfY2hlY2s9Ci1PU19fZ19tYWluX2NvbnRleHRfY2hlY2tfMD1jYXN0PUdNYWluQ29udGV4dCAqCi1PU19fZ19tYWluX2NvbnRleHRfY2hlY2tfMT0KLU9TX19nX21haW5fY29udGV4dF9jaGVja18yPWNhc3Q9R1BvbGxGRCAqCi1PU19fZ19tYWluX2NvbnRleHRfY2hlY2tfMz0KLQotT1NfX2dfbWFpbl9jb250ZXh0X2RlZmF1bHQ9Ci0KLU9TX19nX21haW5fY29udGV4dF9nZXRfcG9sbF9mdW5jPQotT1NfX2dfbWFpbl9jb250ZXh0X2dldF9wb2xsX2Z1bmNfMD1jYXN0PUdNYWluQ29udGV4dCAqCi0KLU9TX19nX21haW5fY29udGV4dF9pdGVyYXRpb249Ci1PU19fZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotT1NfX2dfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbl8xPQotCi1PU19fZ19tYWluX2NvbnRleHRfcGVuZGluZz0KLU9TX19nX21haW5fY29udGV4dF9wZW5kaW5nXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotCi1PU19fZ19tYWluX2NvbnRleHRfcHJlcGFyZT0KLU9TX19nX21haW5fY29udGV4dF9wcmVwYXJlXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotT1NfX2dfbWFpbl9jb250ZXh0X3ByZXBhcmVfMT0KLQotT1NfX2dfbWFpbl9jb250ZXh0X3F1ZXJ5PQotT1NfX2dfbWFpbl9jb250ZXh0X3F1ZXJ5XzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotT1NfX2dfbWFpbl9jb250ZXh0X3F1ZXJ5XzE9Ci1PU19fZ19tYWluX2NvbnRleHRfcXVlcnlfMj0KLU9TX19nX21haW5fY29udGV4dF9xdWVyeV8zPWNhc3Q9R1BvbGxGRCAqCi1PU19fZ19tYWluX2NvbnRleHRfcXVlcnlfND0KLQotT1NfX2dfbWFpbl9jb250ZXh0X3JlbGVhc2U9Ci1PU19fZ19tYWluX2NvbnRleHRfcmVsZWFzZV8wPWNhc3Q9R01haW5Db250ZXh0ICoKLQotT1NfX2dfbWFsbG9jPQotT1NfX2dfbWFsbG9jXzA9Y2FzdD0oZ3Vsb25nKQotCi1PU19fZ19vYmplY3RfZ2V0PQotT1NfX2dfb2JqZWN0X2dldF8wPWNhc3Q9R09iamVjdCAqCi1PU19fZ19vYmplY3RfZ2V0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ19vYmplY3RfZ2V0XzI9Ci1PU19fZ19vYmplY3RfZ2V0XzM9Ci0KLU9TX19nX29iamVjdF9nZXRfcWRhdGE9Ci1PU19fZ19vYmplY3RfZ2V0X3FkYXRhXzA9Y2FzdD0oR09iamVjdCAqKQotT1NfX2dfb2JqZWN0X2dldF9xZGF0YV8xPWNhc3Q9KEdRdWFyaykKLQotT1NfX2dfb2JqZWN0X25ldz0KLU9TX19nX29iamVjdF9uZXdfMD1jYXN0PShHVHlwZSkKLU9TX19nX29iamVjdF9uZXdfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ19vYmplY3RfcmVmPQotT1NfX2dfb2JqZWN0X3JlZl8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCRkk9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCRklfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JGSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJXzI9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCRklfMz0KLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSUlfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JJSV8yPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJXzM9Ci0KLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JKST0KLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JKSV8wPWNhc3Q9KGdwb2ludGVyKQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkpJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSklfMj0KLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JKSV8zPQotCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWkk9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWklfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JaSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQlpJXzI9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWklfMz0KLQotT1NfX2dfb2JqZWN0X3NldF9xZGF0YT0KLU9TX19nX29iamVjdF9zZXRfcWRhdGFfMD1jYXN0PShHT2JqZWN0ICopCi1PU19fZ19vYmplY3Rfc2V0X3FkYXRhXzE9Y2FzdD0oR1F1YXJrKQotT1NfX2dfb2JqZWN0X3NldF9xZGF0YV8yPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19vYmplY3RfdW5yZWY9Ci1PU19fZ19vYmplY3RfdW5yZWZfMD1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfcXVhcmtfZnJvbV9zdHJpbmc9Ci1PU19fZ19xdWFya19mcm9tX3N0cmluZ18wPWNhc3Q9Y29uc3QgZ2NoYXIgKixmbGFncz1ub19vdXQKLQotT1NfX2dfc2V0X3ByZ25hbWU9Ci1PU19fZ19zZXRfcHJnbmFtZV8wPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotCi1PU19fZ19zaWduYWxfY29ubmVjdD0KLU9TX19nX3NpZ25hbF9jb25uZWN0XzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfY29ubmVjdF8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfMj1jYXN0PShHQ2FsbGJhY2spCi1PU19fZ19zaWduYWxfY29ubmVjdF8zPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19zaWduYWxfY29ubmVjdF9hZnRlcj0KLU9TX19nX3NpZ25hbF9jb25uZWN0X2FmdGVyXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfY29ubmVjdF9hZnRlcl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXJfMj1jYXN0PShHQ2FsbGJhY2spCi1PU19fZ19zaWduYWxfY29ubmVjdF9hZnRlcl8zPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlPQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlXzI9Y2FzdD0oR0Nsb3N1cmUgKikKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV9ieV9pZD0KLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfYnlfaWRfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfYnlfaWRfMT1jYXN0PShndWludCkKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfYnlfaWRfMj1jYXN0PShHUXVhcmspCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlX2J5X2lkXzM9Y2FzdD0oR0Nsb3N1cmUgKikKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfYnlfaWRfND1jYXN0PShnYm9vbGVhbikKLQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCPQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCST0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklfMj0KLQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSUk9Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJSV8wPWNhc3Q9KGdwb2ludGVyKQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSUlfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklJXzI9Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJSV8zPQotCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JfM0I9Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JfM0JfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQl8zQl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCXzNCXzI9Ci0KLU9TX19nX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3Q9Ci1PU19fZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0XzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0XzE9Y2FzdD0oZ3Vsb25nKQotCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZD0KLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF8xPWNhc3Q9KEdTaWduYWxNYXRjaFR5cGUpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF8yPWNhc3Q9KGd1aW50KQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfMz1jYXN0PShHUXVhcmspCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF80PWNhc3Q9KEdDbG9zdXJlICopCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF81PWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfNj1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZD0KLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfMT1jYXN0PShHU2lnbmFsTWF0Y2hUeXBlKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF8yPWNhc3Q9KGd1aW50KQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF8zPWNhc3Q9KEdRdWFyaykKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0X21hdGNoZWRfND1jYXN0PShHQ2xvc3VyZSAqKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF81PWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF82PWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkPQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF8xPWNhc3Q9KEdTaWduYWxNYXRjaFR5cGUpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzI9Y2FzdD0oZ3VpbnQpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzM9Y2FzdD0oR1F1YXJrKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX3VuYmxvY2tfbWF0Y2hlZF80PWNhc3Q9KEdDbG9zdXJlICopCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzU9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzY9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3NpZ25hbF9sb29rdXA9Ci1PU19fZ19zaWduYWxfbG9va3VwXzA9Y2FzdD1jb25zdCBnY2hhciAqLGZsYWdzPW5vX291dAotT1NfX2dfc2lnbmFsX2xvb2t1cF8xPQotCi1PU19fZ19zaWduYWxfc3RvcF9lbWlzc2lvbl9ieV9uYW1lPQotT1NfX2dfc2lnbmFsX3N0b3BfZW1pc3Npb25fYnlfbmFtZV8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX3N0b3BfZW1pc3Npb25fYnlfbmFtZV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotCi1PU19fZ19zbGlzdF9kYXRhPQotT1NfX2dfc2xpc3RfZGF0YV8wPWNhc3Q9KEdTTGlzdCAqKQotCi1PU19fZ19zbGlzdF9mcmVlPQotT1NfX2dfc2xpc3RfZnJlZV8wPWNhc3Q9KEdTTGlzdCAqKQotCi1PU19fZ19zbGlzdF9sZW5ndGg9Ci1PU19fZ19zbGlzdF9sZW5ndGhfMD1jYXN0PShHU0xpc3QgKikKLQotT1NfX2dfc2xpc3RfbmV4dD0KLU9TX19nX3NsaXN0X25leHRfMD1jYXN0PUdTTGlzdCAqCi0KLU9TX19nX3N0cmZyZWV2PQotT1NfX2dfc3RyZnJlZXZfMD1jYXN0PShnY2hhciAqKikKLQotT1NfX2dfdGhyZWFkX2luaXQ9Ci1PU19fZ190aHJlYWRfaW5pdF8wPWNhc3Q9R1RocmVhZEZ1bmN0aW9ucyAqCi0KLU9TX19nX3RocmVhZF9zdXBwb3J0ZWQ9Ci0KLU9TX19nX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWM9Ci1PU19fZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljXzA9Y2FzdD0oR1R5cGUpCi1PU19fZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljXzE9Y2FzdD0oR1R5cGUpCi1PU19fZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljXzI9Y2FzdD0oY29uc3QgR0ludGVyZmFjZUluZm8gKikKLQotT1NfX2dfdHlwZV9jbGFzc19wZWVrPQotT1NfX2dfdHlwZV9jbGFzc19wZWVrXzA9Y2FzdD0oR1R5cGUpCi0KLU9TX19nX3R5cGVfY2xhc3NfcGVla19wYXJlbnQ9Ci1PU19fZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50XzA9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3R5cGVfZnJvbV9uYW1lPQotT1NfX2dfdHlwZV9mcm9tX25hbWVfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ190eXBlX2ludGVyZmFjZV9wZWVrX3BhcmVudD0KLU9TX19nX3R5cGVfaW50ZXJmYWNlX3BlZWtfcGFyZW50XzA9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3R5cGVfaXNfYT0KLU9TX19nX3R5cGVfaXNfYV8wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9pc19hXzE9Y2FzdD0oR1R5cGUpCi0KLU9TX19nX3R5cGVfbmFtZT0KLU9TX19nX3R5cGVfbmFtZV8wPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX3BhcmVudD0KLU9TX19nX3R5cGVfcGFyZW50XzA9Y2FzdD0oR1R5cGUpCi0KLU9TX19nX3R5cGVfcXVlcnk9Ci1PU19fZ190eXBlX3F1ZXJ5XzA9Y2FzdD0oR1R5cGUpCi1PU19fZ190eXBlX3F1ZXJ5XzE9Y2FzdD0oR1R5cGVRdWVyeSAqKQotCi1PU19fZ190eXBlX3JlZ2lzdGVyX3N0YXRpYz0KLU9TX19nX3R5cGVfcmVnaXN0ZXJfc3RhdGljXzA9Y2FzdD0oR1R5cGUpCi1PU19fZ190eXBlX3JlZ2lzdGVyX3N0YXRpY18xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ190eXBlX3JlZ2lzdGVyX3N0YXRpY18yPWNhc3Q9KGNvbnN0IEdUeXBlSW5mbyAqKQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWNfMz1jYXN0PShHVHlwZUZsYWdzKQotCi1PU19fZ191dGYxNl90b191dGY4PQotT1NfX2dfdXRmMTZfdG9fdXRmOF8wPWNhc3Q9KGNvbnN0IGd1bmljaGFyMiAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19nX3V0ZjE2X3RvX3V0ZjhfMT1jYXN0PShnbG9uZykKLU9TX19nX3V0ZjE2X3RvX3V0ZjhfMj1jYXN0PShnbG9uZyAqKSxmbGFncz1jcml0aWNhbAotT1NfX2dfdXRmMTZfdG9fdXRmOF8zPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fZ191dGYxNl90b191dGY4XzQ9Y2FzdD0oR0Vycm9yICoqKSxmbGFncz1jcml0aWNhbAotCi1PU19fZ191dGY4X29mZnNldF90b19wb2ludGVyPQotT1NfX2dfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcl8wPWNhc3Q9Y29uc3QgZ2NoYXIgKgotT1NfX2dfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcl8xPQotCi1PU19fZ191dGY4X3BvaW50ZXJfdG9fb2Zmc2V0PQotT1NfX2dfdXRmOF9wb2ludGVyX3RvX29mZnNldF8wPWNhc3Q9Y29uc3QgZ2NoYXIgKgotT1NfX2dfdXRmOF9wb2ludGVyX3RvX29mZnNldF8xPWNhc3Q9Y29uc3QgZ2NoYXIgKgotCi1PU19fZ191dGY4X3N0cmxlbj0KLU9TX19nX3V0Zjhfc3RybGVuXzA9Y2FzdD1jb25zdCBnY2hhciAqCi1PU19fZ191dGY4X3N0cmxlbl8xPQotCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fSUlfM0lfM0lfM0k9Ci1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fSUlfM0lfM0lfM0lfMD1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJXzE9Y2FzdD0oZ2xvbmcpCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fSUlfM0lfM0lfM0lfMj1jYXN0PShnbG9uZyAqKSxmbGFncz1jcml0aWNhbAotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJXzM9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19JSV8zSV8zSV8zSV80PWNhc3Q9KEdFcnJvciAqKiksZmxhZ3M9Y3JpdGljYWwKLQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX18zQklfM0lfM0lfM0k9Ci1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV8wPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX18zQklfM0lfM0lfM0lfMT1jYXN0PShnbG9uZykKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJXzI9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJXzM9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJXzQ9Y2FzdD0oR0Vycm9yICoqKSxmbGFncz1jcml0aWNhbAotCi1PU19fZ2RrX2F0b21faW50ZXJuPQotT1NfX2dka19hdG9tX2ludGVybl8wPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfX2dka19hdG9tX2ludGVybl8xPQotCi1PU19fZ2RrX2F0b21fbmFtZT0KLU9TX19nZGtfYXRvbV9uYW1lXzA9Y2FzdD0oR2RrQXRvbSkKLQotT1NfX2dka19iZWVwPQotCi1PU19fZ2RrX2JpdG1hcF9jcmVhdGVfZnJvbV9kYXRhPQotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YV8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2JpdG1hcF9jcmVhdGVfZnJvbV9kYXRhXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19jb2xvcl93aGl0ZT0KLU9TX19nZGtfY29sb3Jfd2hpdGVfMD1jYXN0PShHZGtDb2xvcm1hcCAqKQotT1NfX2dka19jb2xvcl93aGl0ZV8xPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX2luCi0KLU9TX19nZGtfY29sb3JtYXBfYWxsb2NfY29sb3I9Ci1PU19fZ2RrX2NvbG9ybWFwX2FsbG9jX2NvbG9yXzA9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLU9TX19nZGtfY29sb3JtYXBfYWxsb2NfY29sb3JfMT1jYXN0PShHZGtDb2xvciAqKQotT1NfX2dka19jb2xvcm1hcF9hbGxvY19jb2xvcl8yPWNhc3Q9KGdib29sZWFuKQotT1NfX2dka19jb2xvcm1hcF9hbGxvY19jb2xvcl8zPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX2NvbG9ybWFwX2ZyZWVfY29sb3JzPQotT1NfX2dka19jb2xvcm1hcF9mcmVlX2NvbG9yc18wPWNhc3Q9KEdka0NvbG9ybWFwICopCi1PU19fZ2RrX2NvbG9ybWFwX2ZyZWVfY29sb3JzXzE9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX2NvbG9ybWFwX2ZyZWVfY29sb3JzXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19jb2xvcm1hcF9nZXRfc3lzdGVtPQotCi1PU19fZ2RrX2NvbG9ybWFwX3F1ZXJ5X2NvbG9yPQotT1NfX2dka19jb2xvcm1hcF9xdWVyeV9jb2xvcl8wPWNhc3Q9KEdka0NvbG9ybWFwICopCi1PU19fZ2RrX2NvbG9ybWFwX3F1ZXJ5X2NvbG9yXzE9Y2FzdD0oZ3Vsb25nKQotT1NfX2dka19jb2xvcm1hcF9xdWVyeV9jb2xvcl8yPWNhc3Q9KEdka0NvbG9yICopCi0KLU9TX19nZGtfY3Vyc29yX2Rlc3Ryb3k9Ci1PU19fZ2RrX2N1cnNvcl9kZXN0cm95XzA9Y2FzdD0oR2RrQ3Vyc29yICopCi0KLU9TX19nZGtfY3Vyc29yX25ldz0KLU9TX19nZGtfY3Vyc29yX25ld18wPWNhc3Q9KEdka0N1cnNvclR5cGUpCi0KLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcD0KLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcF8wPWNhc3Q9KEdka1BpeG1hcCAqKQotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwXzE9Y2FzdD0oR2RrUGl4bWFwICopCi1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXBfMj1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcF8zPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwXzQ9Y2FzdD0oZ2ludCkKLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcF81PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhZ19zdGF0dXM9Ci1PU19fZ2RrX2RyYWdfc3RhdHVzXzA9Y2FzdD0oR2RrRHJhZ0NvbnRleHQgKikKLU9TX19nZGtfZHJhZ19zdGF0dXNfMT1jYXN0PShHZGtEcmFnQWN0aW9uKQotT1NfX2dka19kcmFnX3N0YXR1c18yPWNhc3Q9KGd1aW50MzIpCi0KLU9TX19nZGtfZHJhd19hcmM9Ci1PU19fZ2RrX2RyYXdfYXJjXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19hcmNfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2FyY18yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfYXJjXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19hcmNfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2FyY181PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfYXJjXzY9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19hcmNfNz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2FyY184PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19kcmF3YWJsZT0KLU9TX19nZGtfZHJhd19kcmF3YWJsZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzI9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19kcmF3YWJsZV8zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzU9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19kcmF3YWJsZV82PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfNz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzg9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3X2ltYWdlPQotT1NfX2dka19kcmF3X2ltYWdlXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19pbWFnZV8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfaW1hZ2VfMj1jYXN0PUdka0ltYWdlICoKLU9TX19nZGtfZHJhd19pbWFnZV8zPQotT1NfX2dka19kcmF3X2ltYWdlXzQ9Ci1PU19fZ2RrX2RyYXdfaW1hZ2VfNT0KLU9TX19nZGtfZHJhd19pbWFnZV82PQotT1NfX2dka19kcmF3X2ltYWdlXzc9Ci1PU19fZ2RrX2RyYXdfaW1hZ2VfOD0KLQotT1NfX2dka19kcmF3X2xheW91dD0KLU9TX19nZGtfZHJhd19sYXlvdXRfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X2xheW91dF8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfbGF5b3V0XzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19sYXlvdXRfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xheW91dF80PWNhc3Q9KFBhbmdvTGF5b3V0ICopCi0KLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnM9Ci1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzA9Y2FzdD1HZGtEcmF3YWJsZSAqCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xheW91dF93aXRoX2NvbG9yc18zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzQ9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfNT1mbGFncz1ub19vdXQKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfNj1mbGFncz1ub19vdXQKLQotT1NfX2dka19kcmF3X2xpbmU9Ci1PU19fZ2RrX2RyYXdfbGluZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfbGluZV8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfbGluZV8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGluZV8zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGluZV80PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGluZV81PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19saW5lcz0KLU9TX19nZGtfZHJhd19saW5lc18wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfbGluZXNfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2xpbmVzXzI9Y2FzdD0oR2RrUG9pbnQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ2RrX2RyYXdfbGluZXNfMz1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfcGl4YnVmPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfZHJhd19waXhidWZfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X3BpeGJ1Zl8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzI9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl81PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzY9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfNz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl84PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzk9Y2FzdD0oR2RrUmdiRGl0aGVyKQotT1NfX2dka19kcmF3X3BpeGJ1Zl8xMD1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl8xMT1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfcG9pbnQ9Ci1PU19fZ2RrX2RyYXdfcG9pbnRfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X3BvaW50XzE9Y2FzdD1HZGtHQyAqCi1PU19fZ2RrX2RyYXdfcG9pbnRfMj0KLU9TX19nZGtfZHJhd19wb2ludF8zPQotCi1PU19fZ2RrX2RyYXdfcG9seWdvbj0KLU9TX19nZGtfZHJhd19wb2x5Z29uXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19wb2x5Z29uXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19wb2x5Z29uXzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19wb2x5Z29uXzM9Y2FzdD0oR2RrUG9pbnQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ2RrX2RyYXdfcG9seWdvbl80PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19yZWN0YW5nbGU9Ci1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19yZWN0YW5nbGVfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19yZWN0YW5nbGVfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV81PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzY9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3YWJsZV9nZXRfZGVwdGg9Ci1PU19fZ2RrX2RyYXdhYmxlX2dldF9kZXB0aF8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi0KLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlPQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMT1jYXN0PShnaW50KQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfND1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdhYmxlX2dldF9zaXplPQotT1NfX2dka19kcmF3YWJsZV9nZXRfc2l6ZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdhYmxlX2dldF9zaXplXzE9Y2FzdD0oZ2ludCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfX2dka19kcmF3YWJsZV9nZXRfc2l6ZV8yPWNhc3Q9KGdpbnQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfX2dka19kcmF3YWJsZV9nZXRfdmlzaWJsZV9yZWdpb249Ci1PU19fZ2RrX2RyYXdhYmxlX2dldF92aXNpYmxlX3JlZ2lvbl8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi0KLU9TX19nZGtfZXJyb3JfdHJhcF9wb3A9Ci0KLU9TX19nZGtfZXJyb3JfdHJhcF9wdXNoPQotCi1PU19fZ2RrX2V2ZW50X2NvcHk9Ci1PU19fZ2RrX2V2ZW50X2NvcHlfMD1jYXN0PShHZGtFdmVudCAqKQotCi1PU19fZ2RrX2V2ZW50X2ZyZWU9Ci1PU19fZ2RrX2V2ZW50X2ZyZWVfMD1jYXN0PShHZGtFdmVudCAqKQotCi1PU19fZ2RrX2V2ZW50X2dldD0KLQotT1NfX2dka19ldmVudF9nZXRfY29vcmRzPQotT1NfX2dka19ldmVudF9nZXRfY29vcmRzXzA9Y2FzdD0oR2RrRXZlbnQgKikKLU9TX19nZGtfZXZlbnRfZ2V0X2Nvb3Jkc18xPWNhc3Q9KGdkb3VibGUgKikKLU9TX19nZGtfZXZlbnRfZ2V0X2Nvb3Jkc18yPWNhc3Q9KGdkb3VibGUgKikKLQotT1NfX2dka19ldmVudF9nZXRfZ3JhcGhpY3NfZXhwb3NlPQotT1NfX2dka19ldmVudF9nZXRfZ3JhcGhpY3NfZXhwb3NlXzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfZXZlbnRfZ2V0X3Jvb3RfY29vcmRzPQotT1NfX2dka19ldmVudF9nZXRfcm9vdF9jb29yZHNfMD1jYXN0PShHZGtFdmVudCAqKQotT1NfX2dka19ldmVudF9nZXRfcm9vdF9jb29yZHNfMT1jYXN0PShnZG91YmxlICopCi1PU19fZ2RrX2V2ZW50X2dldF9yb290X2Nvb3Jkc18yPWNhc3Q9KGdkb3VibGUgKikKLQotT1NfX2dka19ldmVudF9nZXRfc3RhdGU9Ci1PU19fZ2RrX2V2ZW50X2dldF9zdGF0ZV8wPWNhc3Q9KEdka0V2ZW50ICopCi1PU19fZ2RrX2V2ZW50X2dldF9zdGF0ZV8xPWNhc3Q9KEdka01vZGlmaWVyVHlwZSAqKQotCi1PU19fZ2RrX2V2ZW50X2dldF90aW1lPQotT1NfX2dka19ldmVudF9nZXRfdGltZV8wPWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19nZGtfZXZlbnRfaGFuZGxlcl9zZXQ9Ci1PU19fZ2RrX2V2ZW50X2hhbmRsZXJfc2V0XzA9Y2FzdD0oR2RrRXZlbnRGdW5jKQotT1NfX2dka19ldmVudF9oYW5kbGVyX3NldF8xPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dka19ldmVudF9oYW5kbGVyX3NldF8yPWNhc3Q9KEdEZXN0cm95Tm90aWZ5KQotCi1PU19fZ2RrX2V2ZW50X3B1dD0KLU9TX19nZGtfZXZlbnRfcHV0XzA9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfX2dka19mbHVzaD0KLQotT1NfX2dka19mcmVlX3RleHRfbGlzdD0KLU9TX19nZGtfZnJlZV90ZXh0X2xpc3RfMD1jYXN0PShnY2hhciAqKikKLQotT1NfX2dka19nY19nZXRfdmFsdWVzPQotT1NfX2dka19nY19nZXRfdmFsdWVzXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2NfZ2V0X3ZhbHVlc18xPWNhc3Q9KEdka0dDVmFsdWVzICopLGZsYWdzPW5vX2luCi0KLU9TX19nZGtfZ2NfbmV3PQotT1NfX2dka19nY19uZXdfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotCi1PU19fZ2RrX2djX3NldF9iYWNrZ3JvdW5kPQotT1NfX2dka19nY19zZXRfYmFja2dyb3VuZF8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9iYWNrZ3JvdW5kXzE9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfbWFzaz0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfbWFza18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9jbGlwX21hc2tfMT1jYXN0PShHZGtCaXRtYXAgKikKLQotT1NfX2dka19nY19zZXRfY2xpcF9vcmlnaW49Ci1PU19fZ2RrX2djX3NldF9jbGlwX29yaWdpbl8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9jbGlwX29yaWdpbl8xPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2djX3NldF9jbGlwX29yaWdpbl8yPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfcmVjdGFuZ2xlPQotT1NfX2dka19nY19zZXRfY2xpcF9yZWN0YW5nbGVfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfY2xpcF9yZWN0YW5nbGVfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfcmVnaW9uPQotT1NfX2dka19nY19zZXRfY2xpcF9yZWdpb25fMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfY2xpcF9yZWdpb25fMT1jYXN0PShHZGtSZWdpb24gKikKLQotT1NfX2dka19nY19zZXRfZGFzaGVzPQotT1NfX2dka19nY19zZXRfZGFzaGVzXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2Rhc2hlc18xPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2djX3NldF9kYXNoZXNfMj1jYXN0PShnaW50OCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19nZGtfZ2Nfc2V0X2Rhc2hlc18zPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZ2Nfc2V0X2V4cG9zdXJlcz0KLU9TX19nZGtfZ2Nfc2V0X2V4cG9zdXJlc18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9leHBvc3VyZXNfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka19nY19zZXRfZmlsbD0KLU9TX19nZGtfZ2Nfc2V0X2ZpbGxfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfZmlsbF8xPWNhc3Q9KEdka0ZpbGwpCi0KLU9TX19nZGtfZ2Nfc2V0X2ZvcmVncm91bmQ9Ci1PU19fZ2RrX2djX3NldF9mb3JlZ3JvdW5kXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2ZvcmVncm91bmRfMT1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dka19nY19zZXRfZnVuY3Rpb249Ci1PU19fZ2RrX2djX3NldF9mdW5jdGlvbl8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9mdW5jdGlvbl8xPWNhc3Q9KEdka0Z1bmN0aW9uKQotCi1PU19fZ2RrX2djX3NldF9saW5lX2F0dHJpYnV0ZXM9Ci1PU19fZ2RrX2djX3NldF9saW5lX2F0dHJpYnV0ZXNfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfbGluZV9hdHRyaWJ1dGVzXzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZ2Nfc2V0X2xpbmVfYXR0cmlidXRlc18yPWNhc3Q9KEdka0xpbmVTdHlsZSkKLU9TX19nZGtfZ2Nfc2V0X2xpbmVfYXR0cmlidXRlc18zPWNhc3Q9KEdka0NhcFN0eWxlKQotT1NfX2dka19nY19zZXRfbGluZV9hdHRyaWJ1dGVzXzQ9Y2FzdD0oR2RrSm9pblN0eWxlKQotCi1PU19fZ2RrX2djX3NldF9zdGlwcGxlPQotT1NfX2dka19nY19zZXRfc3RpcHBsZV8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9zdGlwcGxlXzE9Y2FzdD0oR2RrUGl4bWFwICopCi0KLU9TX19nZGtfZ2Nfc2V0X3N1YndpbmRvdz0KLU9TX19nZGtfZ2Nfc2V0X3N1YndpbmRvd18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9zdWJ3aW5kb3dfMT1jYXN0PShHZGtTdWJ3aW5kb3dNb2RlKQotCi1PU19fZ2RrX2djX3NldF92YWx1ZXM9Ci1PU19fZ2RrX2djX3NldF92YWx1ZXNfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfdmFsdWVzXzE9Y2FzdD0oR2RrR0NWYWx1ZXMgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX2djX3NldF92YWx1ZXNfMj1jYXN0PShHZGtHQ1ZhbHVlc01hc2spCi0KLU9TX19nZGtfa2V5Ym9hcmRfdW5ncmFiPQotT1NfX2dka19rZXlib2FyZF91bmdyYWJfMD0KLQotT1NfX2dka19rZXltYXBfZ2V0X2RlZmF1bHQ9Ci0KLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZT0KLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV8wPWNhc3Q9R2RrS2V5bWFwKgotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzE9Ci1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfMj1jYXN0PUdka01vZGlmaWVyVHlwZQotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzM9Ci1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfND1jYXN0PWd1aW50KgotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzU9Y2FzdD1naW50KgotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzY9Y2FzdD1naW50KgotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzc9Y2FzdD1HZGtNb2RpZmllclR5cGUgKgotCi1PU19fZ2RrX2tleXZhbF90b19sb3dlcj0KLU9TX19nZGtfa2V5dmFsX3RvX2xvd2VyXzA9Ci0KLU9TX19nZGtfa2V5dmFsX3RvX3VuaWNvZGU9Ci1PU19fZ2RrX2tleXZhbF90b191bmljb2RlXzA9Ci0KLU9TX19nZGtfcGFuZ29fY29udGV4dF9nZXQ9Ci0KLU9TX19nZGtfcGFuZ29fY29udGV4dF9zZXRfY29sb3JtYXA9Ci1PU19fZ2RrX3BhbmdvX2NvbnRleHRfc2V0X2NvbG9ybWFwXzA9Y2FzdD1QYW5nb0NvbnRleHQgKgotT1NfX2dka19wYW5nb19jb250ZXh0X3NldF9jb2xvcm1hcF8xPWNhc3Q9KEdka0NvbG9ybWFwICopCi0KLU9TX19nZGtfcGFuZ29fbGF5b3V0X2dldF9jbGlwX3JlZ2lvbj0KLU9TX19nZGtfcGFuZ29fbGF5b3V0X2dldF9jbGlwX3JlZ2lvbl8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fZ2RrX3BhbmdvX2xheW91dF9nZXRfY2xpcF9yZWdpb25fMT0KLU9TX19nZGtfcGFuZ29fbGF5b3V0X2dldF9jbGlwX3JlZ2lvbl8yPQotT1NfX2dka19wYW5nb19sYXlvdXRfZ2V0X2NsaXBfcmVnaW9uXzM9Ci1PU19fZ2RrX3BhbmdvX2xheW91dF9nZXRfY2xpcF9yZWdpb25fND0KLQotT1NfX2dka19waXhidWZfY29weV9hcmVhPQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzA9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfMT0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV8yPQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzM9Ci1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfND0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV81PWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzY9Ci1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfNz0KLQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGU9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV8wPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfMT1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfMj1jYXN0PShHZGtDb2xvcm1hcCAqKQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfMz0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzQ9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV81PQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfNj0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzc9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV84PQotCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfaGFzX2FscGhhPQotT1NfX2dka19waXhidWZfZ2V0X2hhc19hbHBoYV8wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfaGVpZ2h0PQotT1NfX2dka19waXhidWZfZ2V0X2hlaWdodF8wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfcGl4ZWxzPQotT1NfX2dka19waXhidWZfZ2V0X3BpeGVsc18wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfcm93c3RyaWRlPQotT1NfX2dka19waXhidWZfZ2V0X3Jvd3N0cmlkZV8wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfd2lkdGg9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfd2lkdGhfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLQotT1NfX2dka19waXhidWZfbmV3PQotT1NfX2dka19waXhidWZfbmV3XzA9Y2FzdD0oR2RrQ29sb3JzcGFjZSkKLU9TX19nZGtfcGl4YnVmX25ld18xPWNhc3Q9KGdib29sZWFuKQotT1NfX2dka19waXhidWZfbmV3XzI9Ci1PU19fZ2RrX3BpeGJ1Zl9uZXdfMz0KLU9TX19nZGtfcGl4YnVmX25ld180PQotCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfcGl4bWFwX2FuZF9tYXNrPQotT1NfX2dka19waXhidWZfcmVuZGVyX3BpeG1hcF9hbmRfbWFza18wPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3BpeG1hcF9hbmRfbWFza18xPWNhc3Q9KEdka0RyYXdhYmxlICoqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3BpeG1hcF9hbmRfbWFza18yPWNhc3Q9KEdka0JpdG1hcCAqKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl9waXhtYXBfYW5kX21hc2tfMz0KLQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzA9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfMT1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzI9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV8zPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzQ9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfNT0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV82PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzc9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfOD0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV85PWNhc3Q9KEdka1JnYkRpdGhlcikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV8xMD0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV8xMT0KLQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzA9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMT1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzI9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMz0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV80PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzU9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfNj0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV83PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzg9Y2FzdD0oR2RrUGl4YnVmQWxwaGFNb2RlKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzk9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMTA9Y2FzdD0oR2RrUmdiRGl0aGVyKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzExPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzEyPQotCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZT0KLU9TX19nZGtfcGl4YnVmX3NjYWxlXzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV8xPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfc2NhbGVfMj0KLU9TX19nZGtfcGl4YnVmX3NjYWxlXzM9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV80PQotT1NfX2dka19waXhidWZfc2NhbGVfNT0KLU9TX19nZGtfcGl4YnVmX3NjYWxlXzY9Y2FzdD0oZG91YmxlKQotT1NfX2dka19waXhidWZfc2NhbGVfNz1jYXN0PShkb3VibGUpCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV84PWNhc3Q9KGRvdWJsZSkKLU9TX19nZGtfcGl4YnVmX3NjYWxlXzk9Y2FzdD0oZG91YmxlKQotT1NfX2dka19waXhidWZfc2NhbGVfMTA9Ci0KLU9TX19nZGtfcGl4YnVmX3NjYWxlX3NpbXBsZT0KLU9TX19nZGtfcGl4YnVmX3NjYWxlX3NpbXBsZV8wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotT1NfX2dka19waXhidWZfc2NhbGVfc2ltcGxlXzE9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV9zaW1wbGVfMj0KLU9TX19nZGtfcGl4YnVmX3NjYWxlX3NpbXBsZV8zPWNhc3Q9KEdka0ludGVycFR5cGUpCi0KLU9TX19nZGtfcGl4bWFwX2ZvcmVpZ25fbmV3PQotT1NfX2dka19waXhtYXBfZm9yZWlnbl9uZXdfMD0KLQotT1NfX2dka19waXhtYXBfbmV3PQotT1NfX2dka19waXhtYXBfbmV3XzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3BpeG1hcF9uZXdfMT1jYXN0PShnaW50KQotT1NfX2dka19waXhtYXBfbmV3XzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfcGl4bWFwX25ld18zPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfcG9pbnRlcl9ncmFiPQotT1NfX2dka19wb2ludGVyX2dyYWJfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfcG9pbnRlcl9ncmFiXzE9Y2FzdD0oZ2Jvb2xlYW4pCi1PU19fZ2RrX3BvaW50ZXJfZ3JhYl8yPWNhc3Q9KEdka0V2ZW50TWFzaykKLU9TX19nZGtfcG9pbnRlcl9ncmFiXzM9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3BvaW50ZXJfZ3JhYl80PWNhc3Q9KEdka0N1cnNvciAqKQotT1NfX2dka19wb2ludGVyX2dyYWJfNT1jYXN0PShndWludDMyKQotCi1PU19fZ2RrX3BvaW50ZXJfaXNfZ3JhYmJlZD0KLQotT1NfX2dka19wb2ludGVyX3VuZ3JhYj0KLU9TX19nZGtfcG9pbnRlcl91bmdyYWJfMD1jYXN0PShndWludDMyKQotCi1PU19fZ2RrX3Byb3BlcnR5X2dldD0KLU9TX19nZGtfcHJvcGVydHlfZ2V0XzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3Byb3BlcnR5X2dldF8xPWNhc3Q9KEdka0F0b20pCi1PU19fZ2RrX3Byb3BlcnR5X2dldF8yPWNhc3Q9KEdka0F0b20pCi1PU19fZ2RrX3Byb3BlcnR5X2dldF8zPQotT1NfX2dka19wcm9wZXJ0eV9nZXRfND0KLU9TX19nZGtfcHJvcGVydHlfZ2V0XzU9Ci1PU19fZ2RrX3Byb3BlcnR5X2dldF82PWNhc3Q9KEdka0F0b20gKikKLU9TX19nZGtfcHJvcGVydHlfZ2V0Xzc9Y2FzdD0oZ2ludCAqKQotT1NfX2dka19wcm9wZXJ0eV9nZXRfOD1jYXN0PShnaW50ICopCi1PU19fZ2RrX3Byb3BlcnR5X2dldF85PWNhc3Q9KGd1Y2hhciAqKikKLQotT1NfX2dka19yZWdpb25fZGVzdHJveT0KLU9TX19nZGtfcmVnaW9uX2Rlc3Ryb3lfMD1jYXN0PShHZGtSZWdpb24gKikKLQotT1NfX2dka19yZWdpb25fZW1wdHk9Ci1PU19fZ2RrX3JlZ2lvbl9lbXB0eV8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotCi1PU19fZ2RrX3JlZ2lvbl9nZXRfY2xpcGJveD0KLU9TX19nZGtfcmVnaW9uX2dldF9jbGlwYm94XzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9nZXRfY2xpcGJveF8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ2RrX3JlZ2lvbl9nZXRfcmVjdGFuZ2xlcz0KLU9TX19nZGtfcmVnaW9uX2dldF9yZWN0YW5nbGVzXzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9nZXRfcmVjdGFuZ2xlc18xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKikKLU9TX19nZGtfcmVnaW9uX2dldF9yZWN0YW5nbGVzXzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ2RrX3JlZ2lvbl9pbnRlcnNlY3Q9Ci1PU19fZ2RrX3JlZ2lvbl9pbnRlcnNlY3RfMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX2ludGVyc2VjdF8xPWNhc3Q9KEdka1JlZ2lvbiAqKQotCi1PU19fZ2RrX3JlZ2lvbl9uZXc9Ci0KLU9TX19nZGtfcmVnaW9uX29mZnNldD0KLU9TX19nZGtfcmVnaW9uX29mZnNldF8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fb2Zmc2V0XzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfcmVnaW9uX29mZnNldF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfcmVnaW9uX3BvaW50X2luPQotT1NfX2dka19yZWdpb25fcG9pbnRfaW5fMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX3BvaW50X2luXzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfcmVnaW9uX3BvaW50X2luXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19yZWdpb25fcG9seWdvbj0KLU9TX19nZGtfcmVnaW9uX3BvbHlnb25fMD1jYXN0PShHZGtQb2ludCAqKQotT1NfX2dka19yZWdpb25fcG9seWdvbl8xPQotT1NfX2dka19yZWdpb25fcG9seWdvbl8yPWNhc3Q9KEdka0ZpbGxSdWxlKQotCi1PU19fZ2RrX3JlZ2lvbl9yZWN0X2luPQotT1NfX2dka19yZWdpb25fcmVjdF9pbl8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fcmVjdF9pbl8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dka19yZWdpb25fcmVjdGFuZ2xlPQotT1NfX2dka19yZWdpb25fcmVjdGFuZ2xlXzA9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfcmVnaW9uX3N1YnRyYWN0PQotT1NfX2dka19yZWdpb25fc3VidHJhY3RfMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX3N1YnRyYWN0XzE9Y2FzdD0oR2RrUmVnaW9uICopCi0KLU9TX19nZGtfcmVnaW9uX3VuaW9uPQotT1NfX2dka19yZWdpb25fdW5pb25fMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX3VuaW9uXzE9Y2FzdD0oR2RrUmVnaW9uICopCi0KLU9TX19nZGtfcmVnaW9uX3VuaW9uX3dpdGhfcmVjdD0KLU9TX19nZGtfcmVnaW9uX3VuaW9uX3dpdGhfcmVjdF8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fdW5pb25fd2l0aF9yZWN0XzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX291dAotCi1PU19fZ2RrX3JnYl9pbml0PQotCi1PU19fZ2RrX3NjcmVlbl9nZXRfZGVmYXVsdD1mbGFncz1keW5hbWljCi0KLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2F0X3dpbmRvdz1mbGFncz1keW5hbWljCi1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9hdF93aW5kb3dfMD1jYXN0PShHZGtTY3JlZW4gKikKLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2F0X3dpbmRvd18xPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9nZW9tZXRyeT1mbGFncz1keW5hbWljCi1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9nZW9tZXRyeV8wPWNhc3Q9KEdka1NjcmVlbiAqKQotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfZ2VvbWV0cnlfMT0KLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2dlb21ldHJ5XzI9ZmxhZ3M9bm9faW4KLQotT1NfX2dka19zY3JlZW5fZ2V0X25fbW9uaXRvcnM9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka19zY3JlZW5fZ2V0X25fbW9uaXRvcnNfMD1jYXN0PShHZGtTY3JlZW4gKikKLQotT1NfX2dka19zY3JlZW5fZ2V0X251bWJlcj1mbGFncz1keW5hbWljCi1PU19fZ2RrX3NjcmVlbl9nZXRfbnVtYmVyXzA9Y2FzdD0oR2RrU2NyZWVuICopCi0KLU9TX19nZGtfc2NyZWVuX2hlaWdodD0KLQotT1NfX2dka19zY3JlZW5fd2lkdGg9Ci0KLU9TX19nZGtfc2NyZWVuX3dpZHRoX21tPQotCi1PU19fZ2RrX3NldF9wcm9ncmFtX2NsYXNzPQotT1NfX2dka19zZXRfcHJvZ3JhbV9jbGFzc18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX2dka190ZXh0X3Byb3BlcnR5X3RvX3V0ZjhfbGlzdD0KLU9TX19nZGtfdGV4dF9wcm9wZXJ0eV90b191dGY4X2xpc3RfMD1jYXN0PShHZGtBdG9tKQotT1NfX2dka190ZXh0X3Byb3BlcnR5X3RvX3V0ZjhfbGlzdF8xPQotT1NfX2dka190ZXh0X3Byb3BlcnR5X3RvX3V0ZjhfbGlzdF8yPWNhc3Q9KGd1Y2hhciAqKQotT1NfX2dka190ZXh0X3Byb3BlcnR5X3RvX3V0ZjhfbGlzdF8zPQotT1NfX2dka190ZXh0X3Byb3BlcnR5X3RvX3V0ZjhfbGlzdF80PWNhc3Q9KGdjaGFyICoqKikKLQotT1NfX2dka191bmljb2RlX3RvX2tleXZhbD0KLU9TX19nZGtfdW5pY29kZV90b19rZXl2YWxfMD0KLQotT1NfX2dka191dGY4X3RvX2NvbXBvdW5kX3RleHQ9Ci1PU19fZ2RrX3V0ZjhfdG9fY29tcG91bmRfdGV4dF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ2RrX3V0ZjhfdG9fY29tcG91bmRfdGV4dF8xPWNhc3Q9KEdka0F0b20gKikKLU9TX19nZGtfdXRmOF90b19jb21wb3VuZF90ZXh0XzI9Y2FzdD0oZ2ludCAqKQotT1NfX2dka191dGY4X3RvX2NvbXBvdW5kX3RleHRfMz1jYXN0PShndWNoYXIgKiopCi1PU19fZ2RrX3V0ZjhfdG9fY29tcG91bmRfdGV4dF80PWNhc3Q9KGdpbnQgKikKLQotT1NfX2dka192aXN1YWxfZ2V0X3N5c3RlbT0KLQotT1NfX2dka193aW5kb3dfYWRkX2ZpbHRlcj0KLU9TX19nZGtfd2luZG93X2FkZF9maWx0ZXJfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19hZGRfZmlsdGVyXzE9Y2FzdD1HZGtGaWx0ZXJGdW5jCi1PU19fZ2RrX3dpbmRvd19hZGRfZmlsdGVyXzI9Y2FzdD1ncG9pbnRlcgotCi1PU19fZ2RrX3dpbmRvd19hdF9wb2ludGVyPQotT1NfX2dka193aW5kb3dfYXRfcG9pbnRlcl8wPWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfd2luZG93X2F0X3BvaW50ZXJfMT1jYXN0PShnaW50ICopCi0KLU9TX19nZGtfd2luZG93X2JlZ2luX3BhaW50X3JlY3Q9Ci1PU19fZ2RrX3dpbmRvd19iZWdpbl9wYWludF9yZWN0XzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfYmVnaW5fcGFpbnRfcmVjdF8xPWNhc3Q9R2RrUmVjdGFuZ2xlICosZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfd2luZG93X2Rlc3Ryb3k9Ci1PU19fZ2RrX3dpbmRvd19kZXN0cm95XzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19lbmRfcGFpbnQ9Ci1PU19fZ2RrX3dpbmRvd19lbmRfcGFpbnRfMD1jYXN0PUdka1dpbmRvdyAqCi0KLU9TX19nZGtfd2luZG93X2ZvY3VzPQotT1NfX2dka193aW5kb3dfZm9jdXNfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19mb2N1c18xPQotCi1PU19fZ2RrX3dpbmRvd19mcmVlemVfdXBkYXRlcz0KLU9TX19nZGtfd2luZG93X2ZyZWV6ZV91cGRhdGVzXzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19nZXRfY2hpbGRyZW49Ci1PU19fZ2RrX3dpbmRvd19nZXRfY2hpbGRyZW5fMD1jYXN0PUdka1dpbmRvdyAqCi0KLU9TX19nZGtfd2luZG93X2dldF9ldmVudHM9Ci1PU19fZ2RrX3dpbmRvd19nZXRfZXZlbnRzXzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19nZXRfZnJhbWVfZXh0ZW50cz0KLU9TX19nZGtfd2luZG93X2dldF9mcmFtZV9leHRlbnRzXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19nZXRfZnJhbWVfZXh0ZW50c18xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ2RrX3dpbmRvd19nZXRfaW50ZXJuYWxfcGFpbnRfaW5mbz0KLU9TX19nZGtfd2luZG93X2dldF9pbnRlcm5hbF9wYWludF9pbmZvXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm9fMT1jYXN0PUdka0RyYXdhYmxlICoqCi1PU19fZ2RrX3dpbmRvd19nZXRfaW50ZXJuYWxfcGFpbnRfaW5mb18yPWNhc3Q9Z2ludCAqCi1PU19fZ2RrX3dpbmRvd19nZXRfaW50ZXJuYWxfcGFpbnRfaW5mb18zPWNhc3Q9Z2ludCAqCi0KLU9TX19nZGtfd2luZG93X2dldF9vcmlnaW49Ci1PU19fZ2RrX3dpbmRvd19nZXRfb3JpZ2luXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19nZXRfb3JpZ2luXzE9Y2FzdD0oZ2ludCAqKQotT1NfX2dka193aW5kb3dfZ2V0X29yaWdpbl8yPWNhc3Q9KGdpbnQgKikKLQotT1NfX2dka193aW5kb3dfZ2V0X3BhcmVudD0KLU9TX19nZGtfd2luZG93X2dldF9wYXJlbnRfMD1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka193aW5kb3dfZ2V0X3BvaW50ZXI9Ci1PU19fZ2RrX3dpbmRvd19nZXRfcG9pbnRlcl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfZ2V0X3BvaW50ZXJfMT1jYXN0PShnaW50ICopCi1PU19fZ2RrX3dpbmRvd19nZXRfcG9pbnRlcl8yPWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfd2luZG93X2dldF9wb2ludGVyXzM9Y2FzdD0oR2RrTW9kaWZpZXJUeXBlICopCi0KLU9TX19nZGtfd2luZG93X2dldF91c2VyX2RhdGE9Ci1PU19fZ2RrX3dpbmRvd19nZXRfdXNlcl9kYXRhXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19nZXRfdXNlcl9kYXRhXzE9Y2FzdD0oZ3BvaW50ZXIgKikKLQotT1NfX2dka193aW5kb3dfaGlkZT0KLU9TX19nZGtfd2luZG93X2hpZGVfMD1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWN0PQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWN0XzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlY3RfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlY3RfMj1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWdpb249Ci1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlZ2lvbl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWdpb25fMT1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVnaW9uXzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nZGtfd2luZG93X2xvb2t1cD0KLU9TX19nZGtfd2luZG93X2xvb2t1cF8wPQotCi1PU19fZ2RrX3dpbmRvd19sb3dlcj0KLU9TX19nZGtfd2luZG93X2xvd2VyXzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X21vdmU9Ci1PU19fZ2RrX3dpbmRvd19tb3ZlXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfbW92ZV8xPQotT1NfX2dka193aW5kb3dfbW92ZV8yPQotCi1PU19fZ2RrX3dpbmRvd19uZXc9Ci1PU19fZ2RrX3dpbmRvd19uZXdfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X25ld18xPWZsYWdzPW5vX291dAotT1NfX2dka193aW5kb3dfbmV3XzI9Ci0KLU9TX19nZGtfd2luZG93X3Byb2Nlc3NfYWxsX3VwZGF0ZXM9Ci0KLU9TX19nZGtfd2luZG93X3Byb2Nlc3NfdXBkYXRlcz0KLU9TX19nZGtfd2luZG93X3Byb2Nlc3NfdXBkYXRlc18wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfcHJvY2Vzc191cGRhdGVzXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nZGtfd2luZG93X3JhaXNlPQotT1NfX2dka193aW5kb3dfcmFpc2VfMD1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka193aW5kb3dfcmVtb3ZlX2ZpbHRlcj0KLU9TX19nZGtfd2luZG93X3JlbW92ZV9maWx0ZXJfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3JlbW92ZV9maWx0ZXJfMT1jYXN0PShHZGtGaWx0ZXJGdW5jKQotT1NfX2dka193aW5kb3dfcmVtb3ZlX2ZpbHRlcl8yPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ2RrX3dpbmRvd19yZXNpemU9Ci1PU19fZ2RrX3dpbmRvd19yZXNpemVfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19yZXNpemVfMT0KLU9TX19nZGtfd2luZG93X3Jlc2l6ZV8yPQotCi1PU19fZ2RrX3dpbmRvd19zY3JvbGw9Ci1PU19fZ2RrX3dpbmRvd19zY3JvbGxfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3Njcm9sbF8xPQotT1NfX2dka193aW5kb3dfc2Nyb2xsXzI9Ci0KLU9TX19nZGtfd2luZG93X3NldF9hY2NlcHRfZm9jdXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka193aW5kb3dfc2V0X2FjY2VwdF9mb2N1c18wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X3NldF9hY2NlcHRfZm9jdXNfMT1jYXN0PWdib29sZWFuCi0KLU9TX19nZGtfd2luZG93X3NldF9iYWNrX3BpeG1hcD0KLU9TX19nZGtfd2luZG93X3NldF9iYWNrX3BpeG1hcF8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X2JhY2tfcGl4bWFwXzE9Y2FzdD0oR2RrUGl4bWFwICopCi1PU19fZ2RrX3dpbmRvd19zZXRfYmFja19waXhtYXBfMj1jYXN0PWdib29sZWFuCi0KLU9TX19nZGtfd2luZG93X3NldF9jdXJzb3I9Ci1PU19fZ2RrX3dpbmRvd19zZXRfY3Vyc29yXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfY3Vyc29yXzE9Y2FzdD0oR2RrQ3Vyc29yICopCi0KLU9TX19nZGtfd2luZG93X3NldF9kZWJ1Z191cGRhdGVzPQotT1NfX2dka193aW5kb3dfc2V0X2RlYnVnX3VwZGF0ZXNfMD1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka193aW5kb3dfc2V0X2RlY29yYXRpb25zPQotT1NfX2dka193aW5kb3dfc2V0X2RlY29yYXRpb25zXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfZGVjb3JhdGlvbnNfMT1jYXN0PShHZGtXTURlY29yYXRpb24pCi0KLU9TX19nZGtfd2luZG93X3NldF9ldmVudHM9Ci1PU19fZ2RrX3dpbmRvd19zZXRfZXZlbnRzXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfc2V0X2V2ZW50c18xPQotCi1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbj0KLU9TX19nZGtfd2luZG93X3NldF9pY29uXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl8xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X2ljb25fMj1jYXN0PShHZGtQaXhtYXAgKikKLU9TX19nZGtfd2luZG93X3NldF9pY29uXzM9Y2FzdD0oR2RrQml0bWFwICopCi0KLU9TX19nZGtfd2luZG93X3NldF9pY29uX2xpc3Q9Ci1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl9saXN0XzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfc2V0X2ljb25fbGlzdF8xPWNhc3Q9R0xpc3QgKgotCi1PU19fZ2RrX3dpbmRvd19zZXRfa2VlcF9hYm92ZT1mbGFncz1keW5hbWljCi1PU19fZ2RrX3dpbmRvd19zZXRfa2VlcF9hYm92ZV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X2tlZXBfYWJvdmVfMT1jYXN0PWdib29sZWFuCi0KLU9TX19nZGtfd2luZG93X3NldF9vdmVycmlkZV9yZWRpcmVjdD0KLU9TX19nZGtfd2luZG93X3NldF9vdmVycmlkZV9yZWRpcmVjdF8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2V0X292ZXJyaWRlX3JlZGlyZWN0XzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19nZGtfd2luZG93X3NldF91c2VyX2RhdGE9Ci1PU19fZ2RrX3dpbmRvd19zZXRfdXNlcl9kYXRhXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfdXNlcl9kYXRhXzE9Y2FzdD1ncG9pbnRlcgotCi1PU19fZ2RrX3dpbmRvd19zaGFwZV9jb21iaW5lX3JlZ2lvbj0KLU9TX19nZGtfd2luZG93X3NoYXBlX2NvbWJpbmVfcmVnaW9uXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfc2hhcGVfY29tYmluZV9yZWdpb25fMT1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfd2luZG93X3NoYXBlX2NvbWJpbmVfcmVnaW9uXzI9Ci1PU19fZ2RrX3dpbmRvd19zaGFwZV9jb21iaW5lX3JlZ2lvbl8zPQotCi1PU19fZ2RrX3dpbmRvd19zaG93PQotT1NfX2dka193aW5kb3dfc2hvd18wPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX3dpbmRvd19zaG93X3VucmFpc2VkPQotT1NfX2dka193aW5kb3dfc2hvd191bnJhaXNlZF8wPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX3dpbmRvd190aGF3X3VwZGF0ZXM9Ci1PU19fZ2RrX3dpbmRvd190aGF3X3VwZGF0ZXNfMD1jYXN0PUdka1dpbmRvdyAqCi0KLU9TX19nZGtfeDExX2F0b21fdG9feGF0b209Ci1PU19fZ2RrX3gxMV9hdG9tX3RvX3hhdG9tXzA9Y2FzdD0oR2RrQXRvbSkKLQotT1NfX2dka194MTFfY29sb3JtYXBfZ2V0X3hjb2xvcm1hcD0KLU9TX19nZGtfeDExX2NvbG9ybWFwX2dldF94Y29sb3JtYXBfMD1jYXN0PUdka0NvbG9ybWFwICoKLQotT1NfX2dka194MTFfZHJhd2FibGVfZ2V0X3hkaXNwbGF5PQotT1NfX2dka194MTFfZHJhd2FibGVfZ2V0X3hkaXNwbGF5XzA9Y2FzdD1HZGtEcmF3YWJsZSAqCi0KLU9TX19nZGtfeDExX2RyYXdhYmxlX2dldF94aWQ9Ci1PU19fZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGlkXzA9Y2FzdD1HZGtEcmF3YWJsZSAqCi0KLU9TX19nZGtfeDExX3NjcmVlbl9nZXRfd2luZG93X21hbmFnZXJfbmFtZT1mbGFncz1keW5hbWljCi1PU19fZ2RrX3gxMV9zY3JlZW5fZ2V0X3dpbmRvd19tYW5hZ2VyX25hbWVfMD1jYXN0PShHZGtTY3JlZW4gKikKLQotT1NfX2dka194MTFfc2NyZWVuX2xvb2t1cF92aXN1YWw9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka194MTFfc2NyZWVuX2xvb2t1cF92aXN1YWxfMD1jYXN0PShHZGtTY3JlZW4gKikKLU9TX19nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsXzE9Y2FzdD0oVmlzdWFsSUQpCi0KLU9TX19nZGtfeDExX3Zpc3VhbF9nZXRfeHZpc3VhbD0KLU9TX19nZGtfeDExX3Zpc3VhbF9nZXRfeHZpc3VhbF8wPWNhc3Q9R2RrVmlzdWFsICoKLQotT1NfX2d0a19hY2NlbF9ncm91cF9uZXc9Ci0KLU9TX19ndGtfYWNjZWxfZ3JvdXBzX2FjdGl2YXRlPQotT1NfX2d0a19hY2NlbF9ncm91cHNfYWN0aXZhdGVfMD1jYXN0PShHT2JqZWN0ICopCi1PU19fZ3RrX2FjY2VsX2dyb3Vwc19hY3RpdmF0ZV8xPWNhc3Q9KGd1aW50KQotT1NfX2d0a19hY2NlbF9ncm91cHNfYWN0aXZhdGVfMj1jYXN0PShHZGtNb2RpZmllclR5cGUpCi0KLU9TX19ndGtfYWNjZWxfbGFiZWxfc2V0X2FjY2VsX3dpZGdldD0KLU9TX19ndGtfYWNjZWxfbGFiZWxfc2V0X2FjY2VsX3dpZGdldF8wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLU9TX19ndGtfYWNjZWxfbGFiZWxfc2V0X2FjY2VsX3dpZGdldF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX2FkanVzdG1lbnRfY2hhbmdlZD0KLU9TX19ndGtfYWRqdXN0bWVudF9jaGFuZ2VkXzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotCi1PU19fZ3RrX2FkanVzdG1lbnRfbmV3PQotT1NfX2d0a19hZGp1c3RtZW50X25ld18wPWNhc3Q9KGdkb3VibGUpCi1PU19fZ3RrX2FkanVzdG1lbnRfbmV3XzE9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfYWRqdXN0bWVudF9uZXdfMj1jYXN0PShnZG91YmxlKQotT1NfX2d0a19hZGp1c3RtZW50X25ld18zPWNhc3Q9KGdkb3VibGUpCi1PU19fZ3RrX2FkanVzdG1lbnRfbmV3XzQ9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfYWRqdXN0bWVudF9uZXdfNT0KLQotT1NfX2d0a19hZGp1c3RtZW50X3NldF92YWx1ZT0KLU9TX19ndGtfYWRqdXN0bWVudF9zZXRfdmFsdWVfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi1PU19fZ3RrX2FkanVzdG1lbnRfc2V0X3ZhbHVlXzE9Y2FzdD0oZ2RvdWJsZSkKLQotT1NfX2d0a19hZGp1c3RtZW50X3ZhbHVlX2NoYW5nZWQ9Ci1PU19fZ3RrX2FkanVzdG1lbnRfdmFsdWVfY2hhbmdlZF8wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a19hcnJvd19uZXc9Ci1PU19fZ3RrX2Fycm93X25ld18wPWNhc3Q9KEd0a0Fycm93VHlwZSkKLU9TX19ndGtfYXJyb3dfbmV3XzE9Y2FzdD0oR3RrQXJyb3dUeXBlKQotCi1PU19fZ3RrX2Fycm93X3NldD0KLU9TX19ndGtfYXJyb3dfc2V0XzA9Y2FzdD0oR3RrQXJyb3cgKikKLU9TX19ndGtfYXJyb3dfc2V0XzE9Y2FzdD0oR3RrQXJyb3dUeXBlKQotT1NfX2d0a19hcnJvd19zZXRfMj1jYXN0PShHdGtBcnJvd1R5cGUpCi0KLU9TX19ndGtfYmluX2dldF9jaGlsZD0KLU9TX19ndGtfYmluX2dldF9jaGlsZF8wPWNhc3Q9KEd0a0JpbiAqKQotCi1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZz0KLU9TX19ndGtfYm94X3NldF9jaGlsZF9wYWNraW5nXzA9Y2FzdD0oR3RrQm94ICopCi1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZ18xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmdfMj0KLU9TX19ndGtfYm94X3NldF9jaGlsZF9wYWNraW5nXzM9Ci1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZ180PQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmdfNT0KLQotT1NfX2d0a19idXR0b25fY2xpY2tlZD0KLU9TX19ndGtfYnV0dG9uX2NsaWNrZWRfMD1jYXN0PShHdGtCdXR0b24gKikKLQotT1NfX2d0a19idXR0b25fbmV3PQotCi1PU19fZ3RrX2J1dHRvbl9zZXRfcmVsaWVmPQotT1NfX2d0a19idXR0b25fc2V0X3JlbGllZl8wPWNhc3Q9KEd0a0J1dHRvbiAqKQotT1NfX2d0a19idXR0b25fc2V0X3JlbGllZl8xPWNhc3Q9KEd0a1JlbGllZlN0eWxlKQotCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemU9Ci1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfMD1jYXN0PShHdGtDZWxsUmVuZGVyZXIgKikKLU9TX19ndGtfY2VsbF9yZW5kZXJlcl9nZXRfc2l6ZV8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzI9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfMz1jYXN0PShnaW50ICopCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfND1jYXN0PShnaW50ICopCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfNT1jYXN0PShnaW50ICopCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfNj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfY2VsbF9yZW5kZXJlcl9waXhidWZfbmV3PQotCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXc9Ci0KLU9TX19ndGtfY2VsbF9yZW5kZXJlcl90b2dnbGVfbmV3PQotCi1PU19fZ3RrX2NoZWNrX2J1dHRvbl9uZXc9Ci0KLU9TX19ndGtfY2hlY2tfbWVudV9pdGVtX2dldF9hY3RpdmU9Ci1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9nZXRfYWN0aXZlXzA9Y2FzdD0oR3RrQ2hlY2tNZW51SXRlbSAqKQotCi1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9uZXdfd2l0aF9sYWJlbD0KLU9TX19ndGtfY2hlY2tfbWVudV9pdGVtX25ld193aXRoX2xhYmVsXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZT0KLU9TX19ndGtfY2hlY2tfbWVudV9pdGVtX3NldF9hY3RpdmVfMD1jYXN0PShHdGtDaGVja01lbnVJdGVtICopCi1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9zZXRfYWN0aXZlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfY2hlY2tfdmVyc2lvbj0KLU9TX19ndGtfY2hlY2tfdmVyc2lvbl8wPQotT1NfX2d0a19jaGVja192ZXJzaW9uXzE9Ci1PU19fZ3RrX2NoZWNrX3ZlcnNpb25fMj0KLQotT1NfX2d0a19jbGlwYm9hcmRfY2xlYXI9Ci1PU19fZ3RrX2NsaXBib2FyZF9jbGVhcl8wPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotCi1PU19fZ3RrX2NsaXBib2FyZF9nZXQ9Ci1PU19fZ3RrX2NsaXBib2FyZF9nZXRfMD1jYXN0PShHZGtBdG9tKQotCi1PU19fZ3RrX2NsaXBib2FyZF9zZXRfd2l0aF9kYXRhPQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV8wPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV8xPWNhc3Q9KGNvbnN0IEd0a1RhcmdldEVudHJ5ICopCi1PU19fZ3RrX2NsaXBib2FyZF9zZXRfd2l0aF9kYXRhXzI9Y2FzdD0oZ3VpbnQpCi1PU19fZ3RrX2NsaXBib2FyZF9zZXRfd2l0aF9kYXRhXzM9Y2FzdD0oR3RrQ2xpcGJvYXJkR2V0RnVuYykKLU9TX19ndGtfY2xpcGJvYXJkX3NldF93aXRoX2RhdGFfND1jYXN0PShHdGtDbGlwYm9hcmRDbGVhckZ1bmMpCi1PU19fZ3RrX2NsaXBib2FyZF9zZXRfd2l0aF9kYXRhXzU9Y2FzdD0oR09iamVjdCAqKQotCi1PU19fZ3RrX2NsaXBib2FyZF93YWl0X2Zvcl9jb250ZW50cz0KLU9TX19ndGtfY2xpcGJvYXJkX3dhaXRfZm9yX2NvbnRlbnRzXzA9Y2FzdD0oR3RrQ2xpcGJvYXJkICopCi1PU19fZ3RrX2NsaXBib2FyZF93YWl0X2Zvcl9jb250ZW50c18xPWNhc3Q9KEdka0F0b20pCi0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX2RpYWxvZ19uZXc9Ci1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9kaWFsb2dfbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZ2V0X2N1cnJlbnRfY29sb3I9Ci1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9nZXRfY3VycmVudF9jb2xvcl8wPWNhc3Q9KEd0a0NvbG9yU2VsZWN0aW9uICopCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9nZXRfY3VycmVudF9jb2xvcl8xPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX2luCi0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9jdXJyZW50X2NvbG9yPQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fc2V0X2N1cnJlbnRfY29sb3JfMD1jYXN0PShHdGtDb2xvclNlbGVjdGlvbiAqKQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fc2V0X2N1cnJlbnRfY29sb3JfMT1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fc2V0X2hhc19wYWxldHRlPQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fc2V0X2hhc19wYWxldHRlXzA9Y2FzdD0oR3RrQ29sb3JTZWxlY3Rpb24gKikKLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9oYXNfcGFsZXR0ZV8xPQotCi1PU19fZ3RrX2NvbWJvX2Rpc2FibGVfYWN0aXZhdGU9Ci1PU19fZ3RrX2NvbWJvX2Rpc2FibGVfYWN0aXZhdGVfMD1jYXN0PShHdGtDb21ibyAqKQotCi1PU19fZ3RrX2NvbWJvX25ldz0KLQotT1NfX2d0a19jb21ib19zZXRfY2FzZV9zZW5zaXRpdmU9Ci1PU19fZ3RrX2NvbWJvX3NldF9jYXNlX3NlbnNpdGl2ZV8wPWNhc3Q9KEd0a0NvbWJvICopCi1PU19fZ3RrX2NvbWJvX3NldF9jYXNlX3NlbnNpdGl2ZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2NvbWJvX3NldF9wb3Bkb3duX3N0cmluZ3M9Ci1PU19fZ3RrX2NvbWJvX3NldF9wb3Bkb3duX3N0cmluZ3NfMD1jYXN0PShHdGtDb21ibyAqKQotT1NfX2d0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzXzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2d0a19jb250YWluZXJfYWRkPQotT1NfX2d0a19jb250YWluZXJfYWRkXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi1PU19fZ3RrX2NvbnRhaW5lcl9hZGRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19jb250YWluZXJfZm9yYWxsPQotT1NfX2d0a19jb250YWluZXJfZm9yYWxsXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi1PU19fZ3RrX2NvbnRhaW5lcl9mb3JhbGxfMT1jYXN0PUd0a0NhbGxiYWNrCi1PU19fZ3RrX2NvbnRhaW5lcl9mb3JhbGxfMj1jYXN0PWdwb2ludGVyCi0KLU9TX19ndGtfY29udGFpbmVyX2dldF9ib3JkZXJfd2lkdGg9Ci1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfYm9yZGVyX3dpZHRoXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi0KLU9TX19ndGtfY29udGFpbmVyX2dldF9jaGlsZHJlbj0KLU9TX19ndGtfY29udGFpbmVyX2dldF9jaGlsZHJlbl8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotCi1PU19fZ3RrX2NvbnRhaW5lcl9yZW1vdmU9Ci1PU19fZ3RrX2NvbnRhaW5lcl9yZW1vdmVfMD1jYXN0PShHdGtDb250YWluZXIgKikKLU9TX19ndGtfY29udGFpbmVyX3JlbW92ZV8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX2NvbnRhaW5lcl9yZXNpemVfY2hpbGRyZW49Ci1PU19fZ3RrX2NvbnRhaW5lcl9yZXNpemVfY2hpbGRyZW5fMD1jYXN0PShHdGtDb250YWluZXIgKikKLQotT1NfX2d0a19jb250YWluZXJfc2V0X2JvcmRlcl93aWR0aD0KLU9TX19ndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGhfMD1jYXN0PShHdGtDb250YWluZXIgKikKLU9TX19ndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGhfMT1jYXN0PShndWludCkKLQotT1NfX2d0a19kaWFsb2dfYWRkX2J1dHRvbj0KLU9TX19ndGtfZGlhbG9nX2FkZF9idXR0b25fMD1jYXN0PShHdGtEaWFsb2cgKikKLU9TX19ndGtfZGlhbG9nX2FkZF9idXR0b25fMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19kaWFsb2dfYWRkX2J1dHRvbl8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfZGlhbG9nX3J1bj0KLU9TX19ndGtfZGlhbG9nX3J1bl8wPWNhc3Q9KEd0a0RpYWxvZyAqKQotCi1PU19fZ3RrX2RyYWdfYmVnaW49Ci1PU19fZ3RrX2RyYWdfYmVnaW5fMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfZHJhZ19iZWdpbl8xPWNhc3Q9KEd0a1RhcmdldExpc3QgKikKLU9TX19ndGtfZHJhZ19iZWdpbl8yPWNhc3Q9KEdka0RyYWdBY3Rpb24pCi1PU19fZ3RrX2RyYWdfYmVnaW5fMz1jYXN0PShnaW50KQotT1NfX2d0a19kcmFnX2JlZ2luXzQ9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfX2d0a19kcmFnX2NoZWNrX3RocmVzaG9sZD0KLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGRfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGRfMT1jYXN0PShnaW50KQotT1NfX2d0a19kcmFnX2NoZWNrX3RocmVzaG9sZF8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzM9Y2FzdD0oZ2ludCkKLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGRfND1jYXN0PShnaW50KQotCi1PU19fZ3RrX2RyYWdfZGVzdF9maW5kX3RhcmdldD0KLU9TX19ndGtfZHJhZ19kZXN0X2ZpbmRfdGFyZ2V0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2RyYWdfZGVzdF9maW5kX3RhcmdldF8xPWNhc3Q9KEdka0RyYWdDb250ZXh0ICopCi1PU19fZ3RrX2RyYWdfZGVzdF9maW5kX3RhcmdldF8yPWNhc3Q9KEd0a1RhcmdldExpc3QgKikKLQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0PQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2RyYWdfZGVzdF9zZXRfMT1jYXN0PShHdGtEZXN0RGVmYXVsdHMpCi1PU19fZ3RrX2RyYWdfZGVzdF9zZXRfMj1jYXN0PShjb25zdCBHdGtUYXJnZXRFbnRyeSAqKQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0XzM9Y2FzdD0oZ2ludCkKLU9TX19ndGtfZHJhZ19kZXN0X3NldF80PWNhc3Q9KEdka0RyYWdBY3Rpb24pCi0KLU9TX19ndGtfZHJhZ19kZXN0X3Vuc2V0PQotT1NfX2d0a19kcmFnX2Rlc3RfdW5zZXRfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19kcmFnX2ZpbmlzaD0KLU9TX19ndGtfZHJhZ19maW5pc2hfMD1jYXN0PShHZGtEcmFnQ29udGV4dCAqKQotT1NfX2d0a19kcmFnX2ZpbmlzaF8xPWNhc3Q9KGdib29sZWFuKQotT1NfX2d0a19kcmFnX2ZpbmlzaF8yPWNhc3Q9KGdib29sZWFuKQotT1NfX2d0a19kcmFnX2ZpbmlzaF8zPWNhc3Q9KGd1aW50MzIpCi0KLU9TX19ndGtfZHJhZ19nZXRfZGF0YT0KLU9TX19ndGtfZHJhZ19nZXRfZGF0YV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19kcmFnX2dldF9kYXRhXzE9Y2FzdD0oR2RrRHJhZ0NvbnRleHQgKikKLU9TX19ndGtfZHJhZ19nZXRfZGF0YV8yPWNhc3Q9KEdka0F0b20pCi1PU19fZ3RrX2RyYWdfZ2V0X2RhdGFfMz1jYXN0PShndWludDMyKQotCi1PU19fZ3RrX2RyYXdpbmdfYXJlYV9uZXc9Ci0KLU9TX19ndGtfZWRpdGFibGVfY29weV9jbGlwYm9hcmQ9Ci1PU19fZ3RrX2VkaXRhYmxlX2NvcHlfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9jdXRfY2xpcGJvYXJkPQotT1NfX2d0a19lZGl0YWJsZV9jdXRfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfc2VsZWN0aW9uPQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfc2VsZWN0aW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfdGV4dD0KLU9TX19ndGtfZWRpdGFibGVfZGVsZXRlX3RleHRfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfdGV4dF8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX2RlbGV0ZV90ZXh0XzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19lZGl0YWJsZV9nZXRfY2hhcnM9Ci1PU19fZ3RrX2VkaXRhYmxlX2dldF9jaGFyc18wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9jaGFyc18xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9jaGFyc18yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X2VkaXRhYmxlPQotT1NfX2d0a19lZGl0YWJsZV9nZXRfZWRpdGFibGVfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9wb3NpdGlvbj0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X3Bvc2l0aW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9nZXRfc2VsZWN0aW9uX2JvdW5kcz0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9nZXRfc2VsZWN0aW9uX2JvdW5kc18xPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfZWRpdGFibGVfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfZWRpdGFibGVfaW5zZXJ0X3RleHQ9Ci1PU19fZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0XzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfaW5zZXJ0X3RleHRfMT1jYXN0PShnY2hhciAqKQotT1NfX2d0a19lZGl0YWJsZV9pbnNlcnRfdGV4dF8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0XzM9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX2VkaXRhYmxlX3Bhc3RlX2NsaXBib2FyZD0KLU9TX19ndGtfZWRpdGFibGVfcGFzdGVfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9zZWxlY3RfcmVnaW9uPQotT1NfX2d0a19lZGl0YWJsZV9zZWxlY3RfcmVnaW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfc2VsZWN0X3JlZ2lvbl8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX3NlbGVjdF9yZWdpb25fMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VkaXRhYmxlX3NldF9lZGl0YWJsZT0KLU9TX19ndGtfZWRpdGFibGVfc2V0X2VkaXRhYmxlXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfc2V0X2VkaXRhYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfZWRpdGFibGVfc2V0X3Bvc2l0aW9uPQotT1NfX2d0a19lZGl0YWJsZV9zZXRfcG9zaXRpb25fMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9zZXRfcG9zaXRpb25fMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VudHJ5X2dldF9pbnZpc2libGVfY2hhcj0KLU9TX19ndGtfZW50cnlfZ2V0X2ludmlzaWJsZV9jaGFyXzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9nZXRfbGF5b3V0PQotT1NfX2d0a19lbnRyeV9nZXRfbGF5b3V0XzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9nZXRfbWF4X2xlbmd0aD0KLU9TX19ndGtfZW50cnlfZ2V0X21heF9sZW5ndGhfMD1jYXN0PShHdGtFbnRyeSAqKQotCi1PU19fZ3RrX2VudHJ5X2dldF90ZXh0PQotT1NfX2d0a19lbnRyeV9nZXRfdGV4dF8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX19ndGtfZW50cnlfZ2V0X3Zpc2liaWxpdHk9Ci1PU19fZ3RrX2VudHJ5X2dldF92aXNpYmlsaXR5XzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9uZXc9Ci0KLU9TX19ndGtfZW50cnlfc2V0X2FjdGl2YXRlc19kZWZhdWx0PQotT1NfX2d0a19lbnRyeV9zZXRfYWN0aXZhdGVzX2RlZmF1bHRfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfYWN0aXZhdGVzX2RlZmF1bHRfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19lbnRyeV9zZXRfYWxpZ25tZW50PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZW50cnlfc2V0X2FsaWdubWVudF8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9hbGlnbm1lbnRfMT1jYXN0PShnZmxvYXQpCi0KLU9TX19ndGtfZW50cnlfc2V0X2hhc19mcmFtZT0KLU9TX19ndGtfZW50cnlfc2V0X2hhc19mcmFtZV8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9oYXNfZnJhbWVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19lbnRyeV9zZXRfaW52aXNpYmxlX2NoYXI9Ci1PU19fZ3RrX2VudHJ5X3NldF9pbnZpc2libGVfY2hhcl8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9pbnZpc2libGVfY2hhcl8xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfZW50cnlfc2V0X21heF9sZW5ndGg9Ci1PU19fZ3RrX2VudHJ5X3NldF9tYXhfbGVuZ3RoXzA9Y2FzdD0oR3RrRW50cnkgKikKLU9TX19ndGtfZW50cnlfc2V0X21heF9sZW5ndGhfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VudHJ5X3NldF90ZXh0PQotT1NfX2d0a19lbnRyeV9zZXRfdGV4dF8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF90ZXh0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19lbnRyeV9zZXRfdmlzaWJpbGl0eT0KLU9TX19ndGtfZW50cnlfc2V0X3Zpc2liaWxpdHlfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfdmlzaWJpbGl0eV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2V2ZW50c19wZW5kaW5nPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9hZGRfZmlsdGVyPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX2FkZF9maWx0ZXJfMD0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2FkZF9maWx0ZXJfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfZGlhbG9nX25ldz1mbGFncz1ub19nZW4KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMD0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMT0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMj0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMz0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfND0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfNT0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfNj0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfNz0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2N1cnJlbnRfZm9sZGVyPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9jdXJyZW50X2ZvbGRlcl8wPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9nZXRfZmlsZW5hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2ZpbGVuYW1lXzA9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9maWxlbmFtZXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2ZpbGVuYW1lc18wPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9mb2xkZXI9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfZm9sZGVyXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9mb2xkZXJfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfbmFtZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9uYW1lXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9uYW1lXzE9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9leHRyYV93aWRnZXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2V4dHJhX3dpZGdldF8wPQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2V4dHJhX3dpZGdldF8xPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfZmlsZW5hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2ZpbGVuYW1lXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfZmlsZW5hbWVfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X3NlbGVjdF9tdWx0aXBsZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfc2VsZWN0X211bHRpcGxlXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfc2VsZWN0X211bHRpcGxlXzE9Ci0KLU9TX19ndGtfZmlsZV9maWx0ZXJfYWRkX3BhdHRlcm49ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2ZpbHRlcl9hZGRfcGF0dGVybl8wPQotT1NfX2d0a19maWxlX2ZpbHRlcl9hZGRfcGF0dGVybl8xPQotCi1PU19fZ3RrX2ZpbGVfZmlsdGVyX25ldz1mbGFncz1keW5hbWljCi0KLU9TX19ndGtfZmlsZV9maWx0ZXJfc2V0X25hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2ZpbHRlcl9zZXRfbmFtZV8wPQotT1NfX2d0a19maWxlX2ZpbHRlcl9zZXRfbmFtZV8xPQotCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZT0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lXzA9Y2FzdD0oR3RrRmlsZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9zZWxlY3Rpb25zPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9nZXRfc2VsZWN0aW9uc18wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9oaWRlX2ZpbGVvcF9idXR0b25zPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9oaWRlX2ZpbGVvcF9idXR0b25zXzA9Y2FzdD0oR3RrRmlsZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX25ldz0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfZmlsZW5hbWU9Ci1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX3NldF9maWxlbmFtZV8wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fc2V0X2ZpbGVuYW1lXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfc2VsZWN0X211bHRpcGxlPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfc2VsZWN0X211bHRpcGxlXzA9Y2FzdD0oR3RrRmlsZVNlbGVjdGlvbiAqKQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfc2VsZWN0X211bHRpcGxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfZml4ZWRfbW92ZT0KLU9TX19ndGtfZml4ZWRfbW92ZV8wPWNhc3Q9KEd0a0ZpeGVkICopCi1PU19fZ3RrX2ZpeGVkX21vdmVfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfZml4ZWRfbW92ZV8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2ZpeGVkX21vdmVfMz1jYXN0PShnaW50KQotCi1PU19fZ3RrX2ZpeGVkX25ldz0KLQotT1NfX2d0a19maXhlZF9zZXRfaGFzX3dpbmRvdz0KLU9TX19ndGtfZml4ZWRfc2V0X2hhc193aW5kb3dfMD1jYXN0PShHdGtGaXhlZCAqKQotT1NfX2d0a19maXhlZF9zZXRfaGFzX3dpbmRvd18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19nZXRfZm9udF9uYW1lPQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfZ2V0X2ZvbnRfbmFtZV8wPWNhc3Q9KEd0a0ZvbnRTZWxlY3Rpb25EaWFsb2cgKikKLQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfbmV3PQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfc2V0X2ZvbnRfbmFtZT0KLU9TX19ndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX3NldF9mb250X25hbWVfMD1jYXN0PShHdGtGb250U2VsZWN0aW9uRGlhbG9nICopCi1PU19fZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZm9udF9uYW1lXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19mcmFtZV9nZXRfbGFiZWxfd2lkZ2V0PQotT1NfX2d0a19mcmFtZV9nZXRfbGFiZWxfd2lkZ2V0XzA9Y2FzdD0oR3RrRnJhbWUgKikKLQotT1NfX2d0a19mcmFtZV9uZXc9Ci1PU19fZ3RrX2ZyYW1lX25ld18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZnJhbWVfc2V0X2xhYmVsPQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfMD1jYXN0PShHdGtGcmFtZSAqKQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2ZyYW1lX3NldF9sYWJlbF93aWRnZXQ9Ci1PU19fZ3RrX2ZyYW1lX3NldF9sYWJlbF93aWRnZXRfMD1jYXN0PShHdGtGcmFtZSAqKQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfd2lkZ2V0XzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfZnJhbWVfc2V0X3NoYWRvd190eXBlPQotT1NfX2d0a19mcmFtZV9zZXRfc2hhZG93X3R5cGVfMD1jYXN0PShHdGtGcmFtZSAqKQotT1NfX2d0a19mcmFtZV9zZXRfc2hhZG93X3R5cGVfMT1jYXN0PShHdGtTaGFkb3dUeXBlKQotCi1PU19fZ3RrX2dldF9jdXJyZW50X2V2ZW50PQotCi1PU19fZ3RrX2dldF9jdXJyZW50X2V2ZW50X3N0YXRlPQotT1NfX2d0a19nZXRfY3VycmVudF9ldmVudF9zdGF0ZV8wPWNhc3Q9R2RrTW9kaWZpZXJUeXBlKgotCi1PU19fZ3RrX2dldF9jdXJyZW50X2V2ZW50X3RpbWU9Ci0KLU9TX19ndGtfZ2V0X2RlZmF1bHRfbGFuZ3VhZ2U9Ci0KLU9TX19ndGtfZ2V0X2V2ZW50X3dpZGdldD0KLU9TX19ndGtfZ2V0X2V2ZW50X3dpZGdldF8wPWNhc3Q9R2RrRXZlbnQgKgotCi1PU19fZ3RrX2dyYWJfYWRkPQotT1NfX2d0a19ncmFiX2FkZF8wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotT1NfX2d0a19ncmFiX2dldF9jdXJyZW50PQotCi1PU19fZ3RrX2dyYWJfcmVtb3ZlPQotT1NfX2d0a19ncmFiX3JlbW92ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX2hib3hfbmV3PQotT1NfX2d0a19oYm94X25ld18wPWNhc3Q9KGdib29sZWFuKQotT1NfX2d0a19oYm94X25ld18xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfaHNjYWxlX25ldz0KLU9TX19ndGtfaHNjYWxlX25ld18wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a19oc2Nyb2xsYmFyX25ldz0KLU9TX19ndGtfaHNjcm9sbGJhcl9uZXdfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfaHNlcGFyYXRvcl9uZXc9Ci0KLU9TX19ndGtfaWNvbl9mYWN0b3J5X2xvb2t1cF9kZWZhdWx0PQotT1NfX2d0a19pY29uX2ZhY3RvcnlfbG9va3VwX2RlZmF1bHRfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uPQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl8wPWNhc3Q9KEd0a0ljb25TZXQgKikKLU9TX19ndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fMT1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl8yPWNhc3Q9R3RrVGV4dERpcmVjdGlvbikKLU9TX19ndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fMz1jYXN0PShHdGtTdGF0ZVR5cGUpCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzQ9Y2FzdD0oR3RrSWNvblNpemUpCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzY9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfZmlsdGVyX2tleXByZXNzPQotT1NfX2d0a19pbV9jb250ZXh0X2ZpbHRlcl9rZXlwcmVzc18wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotT1NfX2d0a19pbV9jb250ZXh0X2ZpbHRlcl9rZXlwcmVzc18xPWNhc3Q9KEdka0V2ZW50S2V5ICopCi0KLU9TX19ndGtfaW1fY29udGV4dF9mb2N1c19pbj0KLU9TX19ndGtfaW1fY29udGV4dF9mb2N1c19pbl8wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfZm9jdXNfb3V0PQotT1NfX2d0a19pbV9jb250ZXh0X2ZvY3VzX291dF8wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfZ2V0X3ByZWVkaXRfc3RyaW5nPQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZ18wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZ18xPWNhc3Q9KGdjaGFyICoqKQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZ18yPWNhc3Q9KFBhbmdvQXR0ckxpc3QgKiopCi1PU19fZ3RrX2ltX2NvbnRleHRfZ2V0X3ByZWVkaXRfc3RyaW5nXzM9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfZ2V0X3R5cGU9Ci0KLU9TX19ndGtfaW1fY29udGV4dF9yZXNldD0KLU9TX19ndGtfaW1fY29udGV4dF9yZXNldF8wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2NsaWVudF93aW5kb3c9Ci1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2NsaWVudF93aW5kb3dfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLU9TX19ndGtfaW1fY29udGV4dF9zZXRfY2xpZW50X3dpbmRvd18xPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2N1cnNvcl9sb2NhdGlvbj0KLU9TX19ndGtfaW1fY29udGV4dF9zZXRfY3Vyc29yX2xvY2F0aW9uXzA9Y2FzdD0oR3RrSU1Db250ZXh0ICopCi1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2N1cnNvcl9sb2NhdGlvbl8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a19pbV9tdWx0aWNvbnRleHRfYXBwZW5kX21lbnVpdGVtcz0KLU9TX19ndGtfaW1fbXVsdGljb250ZXh0X2FwcGVuZF9tZW51aXRlbXNfMD1jYXN0PShHdGtJTU11bHRpY29udGV4dCAqKQotT1NfX2d0a19pbV9tdWx0aWNvbnRleHRfYXBwZW5kX21lbnVpdGVtc18xPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotCi1PU19fZ3RrX2ltX211bHRpY29udGV4dF9uZXc9Ci0KLU9TX19ndGtfaW1hZ2VfbWVudV9pdGVtX25ld193aXRoX2xhYmVsPQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWxfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2ltYWdlX21lbnVfaXRlbV9zZXRfaW1hZ2U9Ci1PU19fZ3RrX2ltYWdlX21lbnVfaXRlbV9zZXRfaW1hZ2VfMD1jYXN0PShHdGtJbWFnZU1lbnVJdGVtICopCi1PU19fZ3RrX2ltYWdlX21lbnVfaXRlbV9zZXRfaW1hZ2VfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19pbWFnZV9uZXc9Ci0KLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4YnVmPQotT1NfX2d0a19pbWFnZV9uZXdfZnJvbV9waXhidWZfMD1jYXN0PUdka1BpeGJ1ZiAqCi0KLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4bWFwPQotT1NfX2d0a19pbWFnZV9uZXdfZnJvbV9waXhtYXBfMD1jYXN0PShHZGtQaXhtYXAgKikKLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4bWFwXzE9Y2FzdD0oR2RrQml0bWFwICopCi0KLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4YnVmPQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhidWZfMD1jYXN0PShHdGtJbWFnZSAqKQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhidWZfMT1jYXN0PShHZGtQaXhidWYgKikKLQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhtYXA9Ci1PU19fZ3RrX2ltYWdlX3NldF9mcm9tX3BpeG1hcF8wPWNhc3Q9KEd0a0ltYWdlICopCi1PU19fZ3RrX2ltYWdlX3NldF9mcm9tX3BpeG1hcF8xPWNhc3Q9KEdka0JpdG1hcCAqKQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhtYXBfMj1jYXN0PShHZGtCaXRtYXAgKikKLQotT1NfX2d0a19pbml0X2NoZWNrPQotT1NfX2d0a19pbml0X2NoZWNrXzA9Y2FzdD0oaW50ICopCi1PU19fZ3RrX2luaXRfY2hlY2tfMT1jYXN0PShjaGFyICoqKikKLQotT1NfX2d0a19sYWJlbF9nZXRfbW5lbW9uaWNfa2V5dmFsPQotT1NfX2d0a19sYWJlbF9nZXRfbW5lbW9uaWNfa2V5dmFsXzA9Y2FzdD1HdGtMYWJlbCAqCi0KLU9TX19ndGtfbGFiZWxfbmV3PQotT1NfX2d0a19sYWJlbF9uZXdfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2xhYmVsX25ld193aXRoX21uZW1vbmljPQotT1NfX2d0a19sYWJlbF9uZXdfd2l0aF9tbmVtb25pY18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfbGFiZWxfc2V0X2F0dHJpYnV0ZXM9Ci1PU19fZ3RrX2xhYmVsX3NldF9hdHRyaWJ1dGVzXzA9Y2FzdD0oR3RrTGFiZWwgKikKLU9TX19ndGtfbGFiZWxfc2V0X2F0dHJpYnV0ZXNfMT1jYXN0PShQYW5nb0F0dHJMaXN0ICopCi0KLU9TX19ndGtfbGFiZWxfc2V0X2p1c3RpZnk9Ci1PU19fZ3RrX2xhYmVsX3NldF9qdXN0aWZ5XzA9Y2FzdD0oR3RrTGFiZWwgKikKLU9TX19ndGtfbGFiZWxfc2V0X2p1c3RpZnlfMT1jYXN0PShHdGtKdXN0aWZpY2F0aW9uKQotCi1PU19fZ3RrX2xhYmVsX3NldF9saW5lX3dyYXA9Ci1PU19fZ3RrX2xhYmVsX3NldF9saW5lX3dyYXBfMD1jYXN0PShHdGtMYWJlbCAqKQotT1NfX2d0a19sYWJlbF9zZXRfbGluZV93cmFwXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX18xZ3RrXzFsYWJlbF8xc2V0XzF0ZXh0X19JST0KLU9TX18xZ3RrXzFsYWJlbF8xc2V0XzF0ZXh0X19JSV8wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSUlfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSV8zQj0KLU9TX18xZ3RrXzFsYWJlbF8xc2V0XzF0ZXh0X19JXzNCXzA9Y2FzdD0oR3RrTGFiZWwgKikKLU9TX18xZ3RrXzFsYWJlbF8xc2V0XzF0ZXh0X19JXzNCXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19sYWJlbF9zZXRfdGV4dF93aXRoX21uZW1vbmljPQotT1NfX2d0a19sYWJlbF9zZXRfdGV4dF93aXRoX21uZW1vbmljXzA9Y2FzdD0oR3RrTGFiZWwgKikKLU9TX19ndGtfbGFiZWxfc2V0X3RleHRfd2l0aF9tbmVtb25pY18xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfbGlzdF9hcHBlbmRfaXRlbXM9Ci1PU19fZ3RrX2xpc3RfYXBwZW5kX2l0ZW1zXzA9Y2FzdD0oR3RrTGlzdCAqKQotT1NfX2d0a19saXN0X2FwcGVuZF9pdGVtc18xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19ndGtfbGlzdF9jbGVhcl9pdGVtcz0KLU9TX19ndGtfbGlzdF9jbGVhcl9pdGVtc18wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF9jbGVhcl9pdGVtc18xPQotT1NfX2d0a19saXN0X2NsZWFyX2l0ZW1zXzI9Ci0KLU9TX19ndGtfbGlzdF9pbnNlcnRfaXRlbXM9Ci1PU19fZ3RrX2xpc3RfaW5zZXJ0X2l0ZW1zXzA9Y2FzdD0oR3RrTGlzdCAqKQotT1NfX2d0a19saXN0X2luc2VydF9pdGVtc18xPWNhc3Q9KEdMaXN0ICopCi1PU19fZ3RrX2xpc3RfaW5zZXJ0X2l0ZW1zXzI9Ci0KLU9TX19ndGtfbGlzdF9pdGVtX25ld193aXRoX2xhYmVsPQotT1NfX2d0a19saXN0X2l0ZW1fbmV3X3dpdGhfbGFiZWxfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2xpc3RfcmVtb3ZlX2l0ZW1zPQotT1NfX2d0a19saXN0X3JlbW92ZV9pdGVtc18wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF9yZW1vdmVfaXRlbXNfMT1jYXN0PShHTGlzdCAqKQotCi1PU19fZ3RrX2xpc3Rfc2VsZWN0X2l0ZW09Ci1PU19fZ3RrX2xpc3Rfc2VsZWN0X2l0ZW1fMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3Rfc2VsZWN0X2l0ZW1fMT0KLQotT1NfX2d0a19saXN0X3N0b3JlX2FwcGVuZD0KLU9TX19ndGtfbGlzdF9zdG9yZV9hcHBlbmRfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX19ndGtfbGlzdF9zdG9yZV9hcHBlbmRfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX2xpc3Rfc3RvcmVfY2xlYXI9Ci1PU19fZ3RrX2xpc3Rfc3RvcmVfY2xlYXJfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLQotT1NfX2d0a19saXN0X3N0b3JlX2luc2VydD0KLU9TX19ndGtfbGlzdF9zdG9yZV9pbnNlcnRfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX19ndGtfbGlzdF9zdG9yZV9pbnNlcnRfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a19saXN0X3N0b3JlX2luc2VydF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfbGlzdF9zdG9yZV9uZXd2PQotT1NfX2d0a19saXN0X3N0b3JlX25ld3ZfMD1jYXN0PShnaW50KQotT1NfX2d0a19saXN0X3N0b3JlX25ld3ZfMT1jYXN0PShHVHlwZSAqKQotCi1PU19fZ3RrX2xpc3Rfc3RvcmVfcmVtb3ZlPQotT1NfX2d0a19saXN0X3N0b3JlX3JlbW92ZV8wPWNhc3Q9KEd0a0xpc3RTdG9yZSAqKQotT1NfX2d0a19saXN0X3N0b3JlX3JlbW92ZV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJST0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJSV8wPWNhc3Q9KEd0a0xpc3RTdG9yZSAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUlJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJSV8yPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUlJXzM9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUlfND0KLQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJXzI9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSklfMz0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKSV80PQotCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMkk9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMj0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV8zPWZsYWdzPW5vX291dAotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzQ9Ci0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaST0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaSV8wPWNhc3Q9KEd0a0xpc3RTdG9yZSAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSVpJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaSV8yPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSVpJXzM9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWklfND0KLQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQkk9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJXzNCSV8wPWNhc3Q9KEd0a0xpc3RTdG9yZSAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQklfMj0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJXzM9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJXzNCSV80PQotCi1PU19fZ3RrX2xpc3RfdW5zZWxlY3RfYWxsPQotT1NfX2d0a19saXN0X3Vuc2VsZWN0X2FsbF8wPWNhc3Q9KEd0a0xpc3QgKikKLQotT1NfX2d0a19saXN0X3Vuc2VsZWN0X2l0ZW09Ci1PU19fZ3RrX2xpc3RfdW5zZWxlY3RfaXRlbV8wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF91bnNlbGVjdF9pdGVtXzE9Ci0KLU9TX19ndGtfbWFpbj0KLQotT1NfX2d0a19tYWluX2RvX2V2ZW50PQotT1NfX2d0a19tYWluX2RvX2V2ZW50XzA9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfX2d0a19tYWluX2l0ZXJhdGlvbj0KLQotT1NfX2d0a19tYWpvcl92ZXJzaW9uPWZsYWdzPWNvbnN0Ci0KLU9TX19ndGtfbWVudV9iYXJfbmV3PQotCi1PU19fZ3RrX21lbnVfaXRlbV9yZW1vdmVfc3VibWVudT0KLU9TX19ndGtfbWVudV9pdGVtX3JlbW92ZV9zdWJtZW51XzA9Y2FzdD0oR3RrTWVudUl0ZW0gKikKLQotT1NfX2d0a19tZW51X2l0ZW1fc2V0X3N1Ym1lbnU9Ci1PU19fZ3RrX21lbnVfaXRlbV9zZXRfc3VibWVudV8wPWNhc3Q9KEd0a01lbnVJdGVtICopCi1PU19fZ3RrX21lbnVfaXRlbV9zZXRfc3VibWVudV8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX21lbnVfbmV3PQotCi1PU19fZ3RrX21lbnVfcG9wZG93bj0KLU9TX19ndGtfbWVudV9wb3Bkb3duXzA9Y2FzdD0oR3RrTWVudSAqKQotCi1PU19fZ3RrX21lbnVfcG9wdXA9Ci1PU19fZ3RrX21lbnVfcG9wdXBfMD1jYXN0PShHdGtNZW51ICopCi1PU19fZ3RrX21lbnVfcG9wdXBfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfbWVudV9wb3B1cF8yPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19tZW51X3BvcHVwXzM9Y2FzdD0oR3RrTWVudVBvc2l0aW9uRnVuYykKLU9TX19ndGtfbWVudV9wb3B1cF80PWNhc3Q9KGdwb2ludGVyKQotT1NfX2d0a19tZW51X3BvcHVwXzU9Y2FzdD0oZ3VpbnQpCi1PU19fZ3RrX21lbnVfcG9wdXBfNj1jYXN0PShndWludDMyKQotCi1PU19fZ3RrX21lbnVfc2hlbGxfZGVhY3RpdmF0ZT0KLU9TX19ndGtfbWVudV9zaGVsbF9kZWFjdGl2YXRlXzA9Y2FzdD0oR3RrTWVudVNoZWxsICopCi0KLU9TX19ndGtfbWVudV9zaGVsbF9pbnNlcnQ9Ci1PU19fZ3RrX21lbnVfc2hlbGxfaW5zZXJ0XzA9Y2FzdD0oR3RrTWVudVNoZWxsICopCi1PU19fZ3RrX21lbnVfc2hlbGxfaW5zZXJ0XzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX21lbnVfc2hlbGxfaW5zZXJ0XzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19tZW51X3NoZWxsX3NlbGVjdF9pdGVtPQotT1NfX2d0a19tZW51X3NoZWxsX3NlbGVjdF9pdGVtXzA9Y2FzdD0oR3RrTWVudVNoZWxsICopCi1PU19fZ3RrX21lbnVfc2hlbGxfc2VsZWN0X2l0ZW1fMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19tZXNzYWdlX2RpYWxvZ19uZXc9Ci1PU19fZ3RrX21lc3NhZ2VfZGlhbG9nX25ld18wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a19tZXNzYWdlX2RpYWxvZ19uZXdfMT1jYXN0PShHdGtEaWFsb2dGbGFncykKLU9TX19ndGtfbWVzc2FnZV9kaWFsb2dfbmV3XzI9Y2FzdD0oR3RrTWVzc2FnZVR5cGUpCi1PU19fZ3RrX21lc3NhZ2VfZGlhbG9nX25ld18zPWNhc3Q9KEd0a0J1dHRvbnNUeXBlKQotT1NfX2d0a19tZXNzYWdlX2RpYWxvZ19uZXdfND1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX21pY3JvX3ZlcnNpb249ZmxhZ3M9Y29uc3QKLQotT1NfX2d0a19taW5vcl92ZXJzaW9uPWZsYWdzPWNvbnN0Ci0KLU9TX19ndGtfbWlzY19zZXRfYWxpZ25tZW50PQotT1NfX2d0a19taXNjX3NldF9hbGlnbm1lbnRfMD1jYXN0PShHdGtNaXNjICopCi1PU19fZ3RrX21pc2Nfc2V0X2FsaWdubWVudF8xPWNhc3Q9KGdmbG9hdCkKLU9TX19ndGtfbWlzY19zZXRfYWxpZ25tZW50XzI9Y2FzdD0oZ2Zsb2F0KQotCi1PU19fZ3RrX25vdGVib29rX2dldF9jdXJyZW50X3BhZ2U9Ci1PU19fZ3RrX25vdGVib29rX2dldF9jdXJyZW50X3BhZ2VfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotCi1PU19fZ3RrX25vdGVib29rX2dldF9zY3JvbGxhYmxlPQotT1NfX2d0a19ub3RlYm9va19nZXRfc2Nyb2xsYWJsZV8wPWNhc3Q9KEd0a05vdGVib29rICopCi0KLU9TX19ndGtfbm90ZWJvb2tfaW5zZXJ0X3BhZ2U9Ci1PU19fZ3RrX25vdGVib29rX2luc2VydF9wYWdlXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLU9TX19ndGtfbm90ZWJvb2tfaW5zZXJ0X3BhZ2VfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfbm90ZWJvb2tfaW5zZXJ0X3BhZ2VfMj1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfbm90ZWJvb2tfaW5zZXJ0X3BhZ2VfMz1jYXN0PShnaW50KQotCi1PU19fZ3RrX25vdGVib29rX25ldz0KLQotT1NfX2d0a19ub3RlYm9va19yZW1vdmVfcGFnZT0KLU9TX19ndGtfbm90ZWJvb2tfcmVtb3ZlX3BhZ2VfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotT1NfX2d0a19ub3RlYm9va19yZW1vdmVfcGFnZV8xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X2N1cnJlbnRfcGFnZT0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X2N1cnJlbnRfcGFnZV8wPWNhc3Q9KEd0a05vdGVib29rICopCi1PU19fZ3RrX25vdGVib29rX3NldF9jdXJyZW50X3BhZ2VfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX25vdGVib29rX3NldF9zY3JvbGxhYmxlPQotT1NfX2d0a19ub3RlYm9va19zZXRfc2Nyb2xsYWJsZV8wPWNhc3Q9KEd0a05vdGVib29rICopCi1PU19fZ3RrX25vdGVib29rX3NldF9zY3JvbGxhYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X3Nob3dfdGFicz0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X3Nob3dfdGFic18wPWNhc3Q9KEd0a05vdGVib29rICopCi1PU19fZ3RrX25vdGVib29rX3NldF9zaG93X3RhYnNfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19ub3RlYm9va19zZXRfdGFiX3Bvcz0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X3RhYl9wb3NfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotT1NfX2d0a19ub3RlYm9va19zZXRfdGFiX3Bvc18xPWNhc3Q9KEd0a1Bvc2l0aW9uVHlwZSkKLQotT1NfX2d0a19vYmplY3Rfc2luaz0KLU9TX19ndGtfb2JqZWN0X3NpbmtfMD1jYXN0PShHdGtPYmplY3QgKikKLQotT1NfX2d0a19wYWludF9mb2N1cz0KLU9TX19ndGtfcGFpbnRfZm9jdXNfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19wYWludF9mb2N1c18xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2d0a19wYWludF9mb2N1c18yPQotT1NfX2d0a19wYWludF9mb2N1c18zPWZsYWdzPW5vX291dAotT1NfX2d0a19wYWludF9mb2N1c180PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9mb2N1c181PWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3BhaW50X2ZvY3VzXzY9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzc9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzg9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzk9Ci0KLU9TX19ndGtfcGFpbnRfaGFuZGxlPQotT1NfX2d0a19wYWludF9oYW5kbGVfMD1jYXN0PUd0a1N0eWxlICoKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzE9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2d0a19wYWludF9oYW5kbGVfMj0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzM9Ci1PU19fZ3RrX3BhaW50X2hhbmRsZV80PWZsYWdzPW5vX291dAotT1NfX2d0a19wYWludF9oYW5kbGVfNT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzY9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzc9Ci1PU19fZ3RrX3BhaW50X2hhbmRsZV84PQotT1NfX2d0a19wYWludF9oYW5kbGVfOT0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzEwPQotT1NfX2d0a19wYWludF9oYW5kbGVfMTE9Ci0KLU9TX19ndGtfcGx1Z19nZXRfaWQ9Ci1PU19fZ3RrX3BsdWdfZ2V0X2lkXzA9Y2FzdD0oR3RrUGx1ZyAqKQotCi1PU19fZ3RrX3BsdWdfbmV3PQotT1NfX2d0a19wbHVnX25ld18wPQotCi1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9uZXc9Ci0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3B1bHNlPQotT1NfX2d0a19wcm9ncmVzc19iYXJfcHVsc2VfMD1jYXN0PShHdGtQcm9ncmVzc0JhciAqKQotCi1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9zZXRfZnJhY3Rpb249Ci1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9zZXRfZnJhY3Rpb25fMD1jYXN0PShHdGtQcm9ncmVzc0JhciAqKQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X2ZyYWN0aW9uXzE9Y2FzdD0oZ2RvdWJsZSkKLQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X29yaWVudGF0aW9uPQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X29yaWVudGF0aW9uXzA9Y2FzdD0oR3RrUHJvZ3Jlc3NCYXIgKikKLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbl8xPWNhc3Q9KEd0a1Byb2dyZXNzQmFyT3JpZW50YXRpb24pCi0KLU9TX19ndGtfcmFkaW9fYnV0dG9uX2dldF9ncm91cD0KLU9TX19ndGtfcmFkaW9fYnV0dG9uX2dldF9ncm91cF8wPWNhc3Q9KEd0a1JhZGlvQnV0dG9uICopCi0KLU9TX19ndGtfcmFkaW9fYnV0dG9uX25ldz0KLU9TX19ndGtfcmFkaW9fYnV0dG9uX25ld18wPWNhc3Q9KEdTTGlzdCAqKQotCi1PU19fZ3RrX3JhZGlvX21lbnVfaXRlbV9nZXRfZ3JvdXA9Ci1PU19fZ3RrX3JhZGlvX21lbnVfaXRlbV9nZXRfZ3JvdXBfMD1jYXN0PUd0a1JhZGlvTWVudUl0ZW0gKgotCi1PU19fZ3RrX3JhZGlvX21lbnVfaXRlbV9uZXc9Ci1PU19fZ3RrX3JhZGlvX21lbnVfaXRlbV9uZXdfMD1jYXN0PShHU0xpc3QgKikKLQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWw9Ci1PU19fZ3RrX3JhZGlvX21lbnVfaXRlbV9uZXdfd2l0aF9sYWJlbF8wPWNhc3Q9KEdTTGlzdCAqKQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWxfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3JhbmdlX2dldF9hZGp1c3RtZW50PQotT1NfX2d0a19yYW5nZV9nZXRfYWRqdXN0bWVudF8wPWNhc3Q9KEd0a1JhbmdlICopCi0KLU9TX19ndGtfcmFuZ2Vfc2V0X2luY3JlbWVudHM9Ci1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzXzA9Y2FzdD0oR3RrUmFuZ2UgKikKLU9TX19ndGtfcmFuZ2Vfc2V0X2luY3JlbWVudHNfMT0KLU9TX19ndGtfcmFuZ2Vfc2V0X2luY3JlbWVudHNfMj0KLQotT1NfX2d0a19yYW5nZV9zZXRfaW52ZXJ0ZWQ9Ci1PU19fZ3RrX3JhbmdlX3NldF9pbnZlcnRlZF8wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF9pbnZlcnRlZF8xPQotCi1PU19fZ3RrX3JhbmdlX3NldF9yYW5nZT0KLU9TX19ndGtfcmFuZ2Vfc2V0X3JhbmdlXzA9Y2FzdD0oR3RrUmFuZ2UgKikKLU9TX19ndGtfcmFuZ2Vfc2V0X3JhbmdlXzE9Ci1PU19fZ3RrX3JhbmdlX3NldF9yYW5nZV8yPQotCi1PU19fZ3RrX3JhbmdlX3NldF92YWx1ZT0KLU9TX19ndGtfcmFuZ2Vfc2V0X3ZhbHVlXzA9Y2FzdD0oR3RrUmFuZ2UgKikKLU9TX19ndGtfcmFuZ2Vfc2V0X3ZhbHVlXzE9Ci0KLU9TX19ndGtfcmNfcGFyc2Vfc3RyaW5nPQotT1NfX2d0a19yY19wYXJzZV9zdHJpbmdfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3JjX3N0eWxlX2dldF9iZ19waXhtYXBfbmFtZT0KLU9TX19ndGtfcmNfc3R5bGVfZ2V0X2JnX3BpeG1hcF9uYW1lXzA9Y2FzdD0oR3RrUmNTdHlsZSAqKQotT1NfX2d0a19yY19zdHlsZV9nZXRfYmdfcGl4bWFwX25hbWVfMT0KLQotT1NfX2d0a19yY19zdHlsZV9nZXRfY29sb3JfZmxhZ3M9Ci1PU19fZ3RrX3JjX3N0eWxlX2dldF9jb2xvcl9mbGFnc18wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfZ2V0X2NvbG9yX2ZsYWdzXzE9Ci0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnPQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZ18xPQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfMj1mbGFncz1ub19vdXQKLQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfcGl4bWFwX25hbWU9Ci1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZ19waXhtYXBfbmFtZV8wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnX3BpeG1hcF9uYW1lXzE9Ci1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZ19waXhtYXBfbmFtZV8yPWNhc3Q9KGNoYXIgKikKLQotT1NfX2d0a19yY19zdHlsZV9zZXRfY29sb3JfZmxhZ3M9Ci1PU19fZ3RrX3JjX3N0eWxlX3NldF9jb2xvcl9mbGFnc18wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfc2V0X2NvbG9yX2ZsYWdzXzE9Ci1PU19fZ3RrX3JjX3N0eWxlX3NldF9jb2xvcl9mbGFnc18yPQotCi1PU19fZ3RrX3NjYWxlX3NldF9kaWdpdHM9Ci1PU19fZ3RrX3NjYWxlX3NldF9kaWdpdHNfMD1jYXN0PShHdGtTY2FsZSAqKQotT1NfX2d0a19zY2FsZV9zZXRfZGlnaXRzXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19zY2FsZV9zZXRfZHJhd192YWx1ZT0KLU9TX19ndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWVfMD1jYXN0PShHdGtTY2FsZSAqKQotT1NfX2d0a19zY2FsZV9zZXRfZHJhd192YWx1ZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfaGFkanVzdG1lbnQ9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfaGFkanVzdG1lbnRfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfcG9saWN5PQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3BvbGljeV8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfcG9saWN5XzE9Y2FzdD0oR3RrUG9saWN5VHlwZSAqKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3BvbGljeV8yPWNhc3Q9KEd0a1BvbGljeVR5cGUgKikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3NoYWRvd190eXBlPQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3NoYWRvd190eXBlXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3ZhZGp1c3RtZW50PQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfZ2V0X3ZhZGp1c3RtZW50XzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfbmV3PQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfbmV3XzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfbmV3XzE9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcGxhY2VtZW50PQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BsYWNlbWVudF8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcGxhY2VtZW50XzE9Y2FzdD0oR3RrQ29ybmVyVHlwZSkKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BvbGljeT0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3lfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BvbGljeV8xPWNhc3Q9KEd0a1BvbGljeVR5cGUpCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcG9saWN5XzI9Y2FzdD0oR3RrUG9saWN5VHlwZSkKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3NoYWRvd190eXBlPQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3NoYWRvd190eXBlXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9zaGFkb3dfdHlwZV8xPWNhc3Q9KEd0a1NoYWRvd1R5cGUpCi0KLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfZnJlZT0KLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfZnJlZV8wPWNhc3Q9KEd0a1NlbGVjdGlvbkRhdGEgKikKLQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9zZXQ9Ci1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX3NldF8wPWNhc3Q9KEd0a1NlbGVjdGlvbkRhdGEgKikKLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfc2V0XzE9Y2FzdD0oR2RrQXRvbSkKLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfc2V0XzI9Y2FzdD0oZ2ludCkKLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfc2V0XzM9Y2FzdD0oY29uc3QgZ3VjaGFyICopCi1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX3NldF80PWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfc2VwYXJhdG9yX21lbnVfaXRlbV9uZXc9Ci0KLU9TX19ndGtfc2V0X2xvY2FsZT0KLQotT1NfX2d0a19zZXR0aW5nc19nZXRfZGVmYXVsdD0KLQotT1NfX2d0a19zb2NrZXRfZ2V0X2lkPQotT1NfX2d0a19zb2NrZXRfZ2V0X2lkXzA9Y2FzdD1HdGtTb2NrZXQgKgotCi1PU19fZ3RrX3NvY2tldF9uZXc9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fZ2V0X2FkanVzdG1lbnQ9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX2dldF9hZGp1c3RtZW50XzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX2dldF9kaWdpdHM9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX2dldF9kaWdpdHNfMD1jYXN0PUd0a1NwaW5CdXR0b24qCi0KLU9TX19ndGtfc3Bpbl9idXR0b25fbmV3PQotT1NfX2d0a19zcGluX2J1dHRvbl9uZXdfMD1jYXN0PUd0a0FkanVzdG1lbnQgKgotT1NfX2d0a19zcGluX2J1dHRvbl9uZXdfMT0KLU9TX19ndGtfc3Bpbl9idXR0b25fbmV3XzI9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2RpZ2l0cz0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2RpZ2l0c18wPWNhc3Q9R3RrU3BpbkJ1dHRvbioKLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2RpZ2l0c18xPQotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9pbmNyZW1lbnRzPQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfaW5jcmVtZW50c18wPWNhc3Q9R3RrU3BpbkJ1dHRvbioKLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2luY3JlbWVudHNfMT0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2luY3JlbWVudHNfMj0KLQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfcmFuZ2U9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9yYW5nZV8wPWNhc3Q9R3RrU3BpbkJ1dHRvbioKLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3JhbmdlXzE9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9yYW5nZV8yPQotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF92YWx1ZT0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3ZhbHVlXzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfdmFsdWVfMT0KLQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfd3JhcD0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3dyYXBfMD1jYXN0PUd0a1NwaW5CdXR0b24qCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF93cmFwXzE9Ci0KLU9TX19ndGtfc3R5bGVfZ2V0X2Jhc2U9Ci1PU19fZ3RrX3N0eWxlX2dldF9iYXNlXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2Jhc2VfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X2Jhc2VfMj1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF9iZz0KLU9TX19ndGtfc3R5bGVfZ2V0X2JnXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2JnXzE9Ci1PU19fZ3RrX3N0eWxlX2dldF9iZ18yPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X2JsYWNrPQotT1NfX2d0a19zdHlsZV9nZXRfYmxhY2tfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfYmxhY2tfMT1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF9kYXJrPQotT1NfX2d0a19zdHlsZV9nZXRfZGFya18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9kYXJrXzE9Ci1PU19fZ3RrX3N0eWxlX2dldF9kYXJrXzI9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfZmc9Ci1PU19fZ3RrX3N0eWxlX2dldF9mZ18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9mZ18xPQotT1NfX2d0a19zdHlsZV9nZXRfZmdfMj1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF9mb250X2Rlc2M9Ci1PU19fZ3RrX3N0eWxlX2dldF9mb250X2Rlc2NfMD1jYXN0PShHdGtTdHlsZSAqKQotCi1PU19fZ3RrX3N0eWxlX2dldF9saWdodD0KLU9TX19ndGtfc3R5bGVfZ2V0X2xpZ2h0XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2xpZ2h0XzE9Ci1PU19fZ3RrX3N0eWxlX2dldF9saWdodF8yPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X3RleHQ9Ci1PU19fZ3RrX3N0eWxlX2dldF90ZXh0XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X3RleHRfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X3RleHRfMj1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF94dGhpY2tuZXNzPQotT1NfX2d0a19zdHlsZV9nZXRfeHRoaWNrbmVzc18wPWNhc3Q9KEd0a1N0eWxlICopCi0KLU9TX19ndGtfc3R5bGVfZ2V0X3l0aGlja25lc3M9Ci1PU19fZ3RrX3N0eWxlX2dldF95dGhpY2tuZXNzXzA9Y2FzdD0oR3RrU3R5bGUgKikKLQotT1NfX2d0a190YXJnZXRfbGlzdF9uZXc9Ci1PU19fZ3RrX3RhcmdldF9saXN0X25ld18wPWNhc3Q9KGNvbnN0IEd0a1RhcmdldEVudHJ5ICopCi1PU19fZ3RrX3RhcmdldF9saXN0X25ld18xPWNhc3Q9KGd1aW50KQotCi1PU19fZ3RrX3RhcmdldF9saXN0X3VucmVmPQotT1NfX2d0a190YXJnZXRfbGlzdF91bnJlZl8wPWNhc3Q9KEd0a1RhcmdldExpc3QgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9jb3B5X2NsaXBib2FyZD0KLU9TX19ndGtfdGV4dF9idWZmZXJfY29weV9jbGlwYm9hcmRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2NvcHlfY2xpcGJvYXJkXzE9Y2FzdD0oR3RrQ2xpcGJvYXJkICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfY3V0X2NsaXBib2FyZD0KLU9TX19ndGtfdGV4dF9idWZmZXJfY3V0X2NsaXBib2FyZF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfY3V0X2NsaXBib2FyZF8xPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9jdXRfY2xpcGJvYXJkXzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZGVsZXRlPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9kZWxldGVfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2RlbGV0ZV8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2RlbGV0ZV8yPWNhc3Q9KEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2JvdW5kcz0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2JvdW5kc18wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2JvdW5kc18xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHNfMj1jYXN0PShHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9jaGFyX2NvdW50PQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfY2hhcl9jb3VudF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXI9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcl8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaW5zZXJ0PQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaW5zZXJ0XzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X2xpbmU9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X2xpbmVfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X2xpbmVfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9tYXJrPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9tYXJrXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9tYXJrXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFya18yPWNhc3Q9KEd0a1RleHRNYXJrICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfb2Zmc2V0PQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9vZmZzZXRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X29mZnNldF8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X29mZnNldF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2xpbmVfY291bnQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9saW5lX2NvdW50XzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9zZWxlY3Rpb25fYm91bmQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9zZWxlY3Rpb25fYm91bmRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3NlbGVjdGlvbl9ib3VuZHM9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9zZWxlY3Rpb25fYm91bmRzXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kc18xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9zZWxlY3Rpb25fYm91bmRzXzI9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfdGV4dD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3RleHRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF90ZXh0XzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3RleHRfMj1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfdGV4dF8zPWNhc3Q9KGdib29sZWFuKQotCi1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lJXzNCST0KLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JSV8zQklfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JSV8zQklfMj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JSV8zQklfMz1jYXN0PShnaW50KQotCi1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lfM0JfM0JJPQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JXzNCXzNCSV8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSV8zQl8zQklfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JXzNCXzNCSV8yPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lfM0JfM0JJXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9tb3ZlX21hcms9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX21vdmVfbWFya18wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfbW92ZV9tYXJrXzE9Y2FzdD0oR3RrVGV4dE1hcmsgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfbW92ZV9tYXJrXzI9Y2FzdD0oY29uc3QgR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX3Bhc3RlX2NsaXBib2FyZF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfcGFzdGVfY2xpcGJvYXJkXzE9Y2FzdD0oR3RrQ2xpcGJvYXJkICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX3Bhc3RlX2NsaXBib2FyZF8yPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX3Bhc3RlX2NsaXBib2FyZF8zPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX3BsYWNlX2N1cnNvcj0KLU9TX19ndGtfdGV4dF9idWZmZXJfcGxhY2VfY3Vyc29yXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wbGFjZV9jdXJzb3JfMT1jYXN0PShjb25zdCBHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX3NldF90ZXh0PQotT1NfX2d0a190ZXh0X2J1ZmZlcl9zZXRfdGV4dF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfc2V0X3RleHRfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9zZXRfdGV4dF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdGV4dF9pdGVyX2dldF9saW5lPQotT1NfX2d0a190ZXh0X2l0ZXJfZ2V0X2xpbmVfMD1jYXN0PShjb25zdCBHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfaXRlcl9nZXRfb2Zmc2V0PQotT1NfX2d0a190ZXh0X2l0ZXJfZ2V0X29mZnNldF8wPWNhc3Q9KGNvbnN0IEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzPQotT1NfX2d0a190ZXh0X3ZpZXdfYnVmZmVyX3RvX3dpbmRvd19jb29yZHNfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfYnVmZmVyX3RvX3dpbmRvd19jb29yZHNfMT1jYXN0PShHdGtUZXh0V2luZG93VHlwZSkKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzI9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzM9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzQ9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a190ZXh0X3ZpZXdfYnVmZmVyX3RvX3dpbmRvd19jb29yZHNfNT1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9idWZmZXI9Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2VkaXRhYmxlPQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2VkaXRhYmxlXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfYXRfbG9jYXRpb249Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9hdF9sb2NhdGlvbl8wPWNhc3Q9R3RrVGV4dFZpZXcgKgotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfYXRfbG9jYXRpb25fMT1jYXN0PUd0a1RleHRJdGVyICoKLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2F0X2xvY2F0aW9uXzI9Y2FzdD1naW50Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9hdF9sb2NhdGlvbl8zPWNhc3Q9Z2ludAotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbj0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2xvY2F0aW9uXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2xvY2F0aW9uXzE9Y2FzdD0oY29uc3QgR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2xvY2F0aW9uXzI9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9saW5lX2F0X3k9Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfbGluZV9hdF95XzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X2dldF9saW5lX2F0X3lfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2xpbmVfYXRfeV8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RleHRfdmlld19nZXRfbGluZV9hdF95XzM9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfdmlzaWJsZV9yZWN0PQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3Zpc2libGVfcmVjdF8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfdmlzaWJsZV9yZWN0XzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF93aW5kb3c9Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfd2luZG93XzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X2dldF93aW5kb3dfMT1jYXN0PShHdGtUZXh0V2luZG93VHlwZSkKLQotT1NfX2d0a190ZXh0X3ZpZXdfbmV3PQotCi1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfbWFya19vbnNjcmVlbj0KLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF9tYXJrX29uc2NyZWVuXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF9tYXJrX29uc2NyZWVuXzE9Y2FzdD0oR3RrVGV4dE1hcmsgKikKLQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXI9Ci1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfdG9faXRlcl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfdG9faXRlcl8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfdG9faXRlcl8yPWNhc3Q9KGdkb3VibGUpCi1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfdG9faXRlcl8zPWNhc3Q9KGdib29sZWFuKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfND1jYXN0PShnZG91YmxlKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfNT1jYXN0PShnZG91YmxlKQotCi1PU19fZ3RrX3RleHRfdmlld19zZXRfZWRpdGFibGU9Ci1PU19fZ3RrX3RleHRfdmlld19zZXRfZWRpdGFibGVfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2VkaXRhYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdGV4dF92aWV3X3NldF9qdXN0aWZpY2F0aW9uPQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2p1c3RpZmljYXRpb25fMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2p1c3RpZmljYXRpb25fMT0KLQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3RhYnM9Ci1PU19fZ3RrX3RleHRfdmlld19zZXRfdGFic18wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19zZXRfdGFic18xPWNhc3Q9KFBhbmdvVGFiQXJyYXkgKikKLQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3dyYXBfbW9kZT0KLU9TX19ndGtfdGV4dF92aWV3X3NldF93cmFwX21vZGVfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3dyYXBfbW9kZV8xPQotCi1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkcz0KLU9TX19ndGtfdGV4dF92aWV3X3dpbmRvd190b19idWZmZXJfY29vcmRzXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3dpbmRvd190b19idWZmZXJfY29vcmRzXzE9Y2FzdD1HdGtUZXh0V2luZG93VHlwZQotT1NfX2d0a190ZXh0X3ZpZXdfd2luZG93X3RvX2J1ZmZlcl9jb29yZHNfMj1jYXN0PWdpbnQKLU9TX19ndGtfdGV4dF92aWV3X3dpbmRvd190b19idWZmZXJfY29vcmRzXzM9Y2FzdD1naW50Ci1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc180PWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdGV4dF92aWV3X3dpbmRvd190b19idWZmZXJfY29vcmRzXzU9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RpbWVvdXRfYWRkPQotT1NfX2d0a190aW1lb3V0X2FkZF8wPWNhc3Q9KGd1aW50MzIpCi1PU19fZ3RrX3RpbWVvdXRfYWRkXzE9Y2FzdD0oR3RrRnVuY3Rpb24pCi1PU19fZ3RrX3RpbWVvdXRfYWRkXzI9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19ndGtfdGltZW91dF9yZW1vdmU9Ci1PU19fZ3RrX3RpbWVvdXRfcmVtb3ZlXzA9Y2FzdD0oZ3VpbnQpCi0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlPQotT1NfX2d0a190b2dnbGVfYnV0dG9uX2dldF9hY3RpdmVfMD1jYXN0PShHdGtUb2dnbGVCdXR0b24gKikKLQotT1NfX2d0a190b2dnbGVfYnV0dG9uX25ldz0KLQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9hY3RpdmU9Ci1PU19fZ3RrX3RvZ2dsZV9idXR0b25fc2V0X2FjdGl2ZV8wPWNhc3Q9KEd0a1RvZ2dsZUJ1dHRvbiAqKQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9hY3RpdmVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9tb2RlPQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9tb2RlXzA9Y2FzdD0oR3RrVG9nZ2xlQnV0dG9uICopCi1PU19fZ3RrX3RvZ2dsZV9idXR0b25fc2V0X21vZGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190b29sYmFyX2luc2VydF93aWRnZXQ9Ci1PU19fZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldF8wPWNhc3Q9KEd0a1Rvb2xiYXIgKikKLU9TX19ndGtfdG9vbGJhcl9pbnNlcnRfd2lkZ2V0XzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldF8yPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19ndGtfdG9vbGJhcl9pbnNlcnRfd2lkZ2V0XzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2d0a190b29sYmFyX2luc2VydF93aWRnZXRfND1jYXN0PShnaW50KQotCi1PU19fZ3RrX3Rvb2xiYXJfbmV3PQotCi1PU19fZ3RrX3Rvb2xiYXJfc2V0X29yaWVudGF0aW9uPQotT1NfX2d0a190b29sYmFyX3NldF9vcmllbnRhdGlvbl8wPWNhc3Q9KEd0a1Rvb2xiYXIgKikKLU9TX19ndGtfdG9vbGJhcl9zZXRfb3JpZW50YXRpb25fMT1jYXN0PShHdGtPcmllbnRhdGlvbikKLQotT1NfX2d0a190b29sdGlwc19kaXNhYmxlPQotT1NfX2d0a190b29sdGlwc19kaXNhYmxlXzA9Y2FzdD0oR3RrVG9vbHRpcHMgKikKLQotT1NfX2d0a190b29sdGlwc19lbmFibGU9Ci1PU19fZ3RrX3Rvb2x0aXBzX2VuYWJsZV8wPWNhc3Q9KEd0a1Rvb2x0aXBzICopCi0KLU9TX19ndGtfdG9vbHRpcHNfbmV3PQotCi1PU19fZ3RrX3Rvb2x0aXBzX3NldF90aXA9Ci1PU19fZ3RrX3Rvb2x0aXBzX3NldF90aXBfMD1jYXN0PShHdGtUb29sdGlwcyAqKQotT1NfX2d0a190b29sdGlwc19zZXRfdGlwXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3Rvb2x0aXBzX3NldF90aXBfMj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a190b29sdGlwc19zZXRfdGlwXzM9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSUk9Ci1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNJSV8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSUlfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSUlfMj0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0lJXzM9Ci1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNJSV80PQotCi1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNKST0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0pJXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNKSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNKSV8yPQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSklfMz0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0pJXzQ9Ci0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcj0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl8yPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl9maXJzdD0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl9maXJzdF8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyX2ZpcnN0XzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX21vZGVsX2dldF9uX2NvbHVtbnM9Ci1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X25fY29sdW1uc18wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X3BhdGg9Ci1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X3BhdGhfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfcGF0aF8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfdHlwZT0KLQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW49Ci1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9jaGlsZHJlbl8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW5fMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW5fMj1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9uX2NoaWxkcmVuPQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbl9jaGlsZHJlbl8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbl9jaGlsZHJlbl8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX25leHQ9Ci1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0XzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0XzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbnRoX2NoaWxkPQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbnRoX2NoaWxkXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9udGhfY2hpbGRfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbnRoX2NoaWxkXzI9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX250aF9jaGlsZF8zPQotCi1PU19fZ3RrX3RyZWVfcGF0aF9hcHBlbmRfaW5kZXg9Ci1PU19fZ3RrX3RyZWVfcGF0aF9hcHBlbmRfaW5kZXhfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3BhdGhfYXBwZW5kX2luZGV4XzE9Ci0KLU9TX19ndGtfdHJlZV9wYXRoX2NvbXBhcmU9Ci1PU19fZ3RrX3RyZWVfcGF0aF9jb21wYXJlXzA9Y2FzdD0oY29uc3QgR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV9wYXRoX2NvbXBhcmVfMT1jYXN0PShjb25zdCBHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9kb3duPQotT1NfX2d0a190cmVlX3BhdGhfZG93bl8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX2ZyZWU9Ci1PU19fZ3RrX3RyZWVfcGF0aF9mcmVlXzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfZ2V0X2RlcHRoPQotT1NfX2d0a190cmVlX3BhdGhfZ2V0X2RlcHRoXzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfZ2V0X2luZGljZXM9Ci1PU19fZ3RrX3RyZWVfcGF0aF9nZXRfaW5kaWNlc18wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX25ldz0KLQotT1NfX2d0a190cmVlX3BhdGhfbmV3X2ZpcnN0PQotCi1PU19fMWd0a18xdHJlZV8xcGF0aF8xbmV3XzFmcm9tXzFzdHJpbmdfX0k9Ci1PU19fMWd0a18xdHJlZV8xcGF0aF8xbmV3XzFmcm9tXzFzdHJpbmdfX0lfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fMWd0a18xdHJlZV8xcGF0aF8xbmV3XzFmcm9tXzFzdHJpbmdfX18zQj0KLU9TX18xZ3RrXzF0cmVlXzFwYXRoXzFuZXdfMWZyb21fMXN0cmluZ19fXzNCXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a190cmVlX3BhdGhfbmV4dD0KLU9TX19ndGtfdHJlZV9wYXRoX25leHRfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9wcmV2PQotT1NfX2d0a190cmVlX3BhdGhfcHJldl8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX3VwPQotT1NfX2d0a190cmVlX3BhdGhfdXBfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2NvdW50X3NlbGVjdGVkX3Jvd3M9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9jb3VudF9zZWxlY3RlZF9yb3dzXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZD0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWRfMT1jYXN0PShHdGtUcmVlTW9kZWwgKiopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZF8yPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkX3Jvd3M9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWRfcm93c18wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkX3Jvd3NfMT1jYXN0PShHdGtUcmVlTW9kZWwgKiopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fcGF0aF9pc19zZWxlY3RlZD0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fcGF0aF9pc19zZWxlY3RlZF8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fcGF0aF9pc19zZWxlY3RlZF8xPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0X2FsbD0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0X2FsbF8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RfaXRlcj0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0X2l0ZXJfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdF9pdGVyXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RlZF9mb3JlYWNoPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RlZF9mb3JlYWNoXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RlZF9mb3JlYWNoXzE9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbkZvcmVhY2hGdW5jKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RlZF9mb3JlYWNoXzI9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGU9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZXRfbW9kZV8xPWNhc3Q9KEd0a1NlbGVjdGlvbk1vZGUpCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fdW5zZWxlY3RfYWxsPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl91bnNlbGVjdF9hbGxfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fdW5zZWxlY3RfaXRlcj0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fdW5zZWxlY3RfaXRlcl8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fdW5zZWxlY3RfaXRlcl8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9zdG9yZV9hcHBlbmQ9Ci1PU19fZ3RrX3RyZWVfc3RvcmVfYXBwZW5kXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fZ3RrX3RyZWVfc3RvcmVfYXBwZW5kXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9zdG9yZV9hcHBlbmRfMj1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfc3RvcmVfY2xlYXI9Ci1PU19fZ3RrX3RyZWVfc3RvcmVfY2xlYXJfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLQotT1NfX2d0a190cmVlX3N0b3JlX2luc2VydD0KLU9TX19ndGtfdHJlZV9zdG9yZV9pbnNlcnRfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX19ndGtfdHJlZV9zdG9yZV9pbnNlcnRfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX3N0b3JlX2luc2VydF8yPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfc3RvcmVfaW5zZXJ0XzM9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3N0b3JlX25ld3Y9Ci1PU19fZ3RrX3RyZWVfc3RvcmVfbmV3dl8wPQotT1NfX2d0a190cmVlX3N0b3JlX25ld3ZfMT1jYXN0PShHVHlwZSAqKQotCi1PU19fZ3RrX3RyZWVfc3RvcmVfcmVtb3ZlPQotT1NfX2d0a190cmVlX3N0b3JlX3JlbW92ZV8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfX2d0a190cmVlX3N0b3JlX3JlbW92ZV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlJST0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlJSV8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUlJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlJSV8yPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUlJXzM9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSUlfND0KLQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUpJPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUpJXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUpJXzI9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSklfMz0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlKSV80PQotCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMkk9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMj0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV8zPWZsYWdzPW5vX291dAotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzQ9Ci0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlaST0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlaSV8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSVpJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlaSV8yPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSVpJXzM9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJWklfND0KLQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSV8zQkk9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJXzNCSV8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSV8zQklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSV8zQklfMj0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlfM0JJXzM9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJXzNCSV80PQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2xsYXBzZV9yb3c9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2xsYXBzZV9yb3dfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sbGFwc2Vfcm93XzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2FkZF9hdHRyaWJ1dGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fYWRkX2F0dHJpYnV0ZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fYWRkX2F0dHJpYnV0ZV8xPWNhc3Q9KEd0a0NlbGxSZW5kZXJlciAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2FkZF9hdHRyaWJ1dGVfMj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2FkZF9hdHRyaWJ1dGVfMz1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfcG9zaXRpb249ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3Bvc2l0aW9uXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9wb3NpdGlvbl8xPWNhc3Q9KEd0a0NlbGxSZW5kZXJlciAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3Bvc2l0aW9uXzI9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3Bvc2l0aW9uXzM9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplXzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZV8yPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplXzM9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemVfND1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZV81PWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfc2V0X2NlbGxfZGF0YT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX3NldF9jZWxsX2RhdGFfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX3NldF9jZWxsX2RhdGFfMT1jYXN0PUd0a1RyZWVNb2RlbCAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9zZXRfY2VsbF9kYXRhXzI9Y2FzdD1HdGtUcmVlSXRlciAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9zZXRfY2VsbF9kYXRhXzM9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9zZXRfY2VsbF9kYXRhXzQ9Ci0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jbGVhcj0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jbGVhcl8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfY2VsbF9yZW5kZXJlcnM9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X2NlbGxfcmVuZGVyZXJzXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9maXhlZF93aWR0aD0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfZml4ZWRfd2lkdGhfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3Jlb3JkZXJhYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9yZW9yZGVyYWJsZV8wPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3Jlc2l6YWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfcmVzaXphYmxlXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9zb3J0X2luZGljYXRvcj0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc29ydF9pbmRpY2F0b3JfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9zb3J0X29yZGVyPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9zb3J0X29yZGVyXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc3BhY2luZz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc3BhY2luZ18wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfdmlzaWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfdmlzaWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfd2lkdGg9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3dpZHRoXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX25ldz0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfZW5kPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfZW5kXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX2VuZF8xPWNhc3Q9KEd0a0NlbGxSZW5kZXJlciAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfZW5kXzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0PQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnRfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnRfMT1jYXN0PShHdGtDZWxsUmVuZGVyZXIgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0XzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYWxpZ25tZW50PQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hbGlnbm1lbnRfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hbGlnbm1lbnRfMT0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jZWxsX2RhdGFfZnVuYz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfMT1jYXN0PUd0a0NlbGxSZW5kZXJlciAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NlbGxfZGF0YV9mdW5jXzI9Y2FzdD0oR3RrVHJlZUNlbGxEYXRhRnVuYykKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfMz1jYXN0PShncG9pbnRlcikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfND1jYXN0PUd0a0Rlc3Ryb3lOb3RpZnkKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jbGlja2FibGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NsaWNrYWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NsaWNrYWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2ZpeGVkX3dpZHRoPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9maXhlZF93aWR0aF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2ZpeGVkX3dpZHRoXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZW9yZGVyYWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVvcmRlcmFibGVfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVvcmRlcmFibGVfMT1jYXN0PWdib29sZWFuCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVzaXphYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZXNpemFibGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZXNpemFibGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zaXppbmc9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NpemluZ18wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NpemluZ18xPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uU2l6aW5nKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NvcnRfaW5kaWNhdG9yPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zb3J0X2luZGljYXRvcl8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NvcnRfaW5kaWNhdG9yXzE9Y2FzdD1nYm9vbGVhbgotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NvcnRfb3JkZXI9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NvcnRfb3JkZXJfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc29ydF9vcmRlcl8xPWNhc3Q9R3RrU29ydFR5cGUKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdGl0bGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGVfMT0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF93aWRnZXQ9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3dpZGdldF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3dpZGdldF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19leHBhbmRfcm93PQotT1NfX2d0a190cmVlX3ZpZXdfZXhwYW5kX3Jvd18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19leHBhbmRfcm93XzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV92aWV3X2V4cGFuZF9yb3dfMj1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2Jpbl93aW5kb3c9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfYmluX3dpbmRvd18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jZWxsX2FyZWE9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY2VsbF9hcmVhXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jZWxsX2FyZWFfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2NlbGxfYXJlYV8yPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY2VsbF9hcmVhXzM9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jb2x1bW49Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jb2x1bW5fMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1ucz0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jb2x1bW5zXzA9Y2FzdD1HdGtUcmVlVmlldyAqCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jdXJzb3I9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jdXJzb3JfMT1jYXN0PShHdGtUcmVlUGF0aCAqKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jdXJzb3JfMj1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2V4cGFuZGVyX2NvbHVtbj0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9leHBhbmRlcl9jb2x1bW5fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfaGVhZGVyc192aXNpYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2hlYWRlcnNfdmlzaWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvcz0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvc18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfMT1jYXN0PShnaW50KQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzI9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvc18zPWNhc3Q9KEd0a1RyZWVQYXRoICoqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzQ9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKiopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfNT1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfNj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9ydWxlc19oaW50PQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3J1bGVzX2hpbnRfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF92aXNpYmxlX3JlY3Q9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfdmlzaWJsZV9yZWN0XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF92aXNpYmxlX3JlY3RfMT1mbGFncz1ub19pbgotCi1PU19fZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uPQotT1NfX2d0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uXzE9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld19tb3ZlX2NvbHVtbl9hZnRlcj0KLU9TX19ndGtfdHJlZV92aWV3X21vdmVfY29sdW1uX2FmdGVyXzA9Y2FzdD1HdGtUcmVlVmlldyAqCi1PU19fZ3RrX3RyZWVfdmlld19tb3ZlX2NvbHVtbl9hZnRlcl8xPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotT1NfX2d0a190cmVlX3ZpZXdfbW92ZV9jb2x1bW5fYWZ0ZXJfMj1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLQotT1NfX2d0a190cmVlX3ZpZXdfbmV3X3dpdGhfbW9kZWw9Ci1PU19fZ3RrX3RyZWVfdmlld19uZXdfd2l0aF9tb2RlbF8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19yZW1vdmVfY29sdW1uPQotT1NfX2d0a190cmVlX3ZpZXdfcmVtb3ZlX2NvbHVtbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19yZW1vdmVfY29sdW1uXzE9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfcm93X2V4cGFuZGVkPQotT1NfX2d0a190cmVlX3ZpZXdfcm93X2V4cGFuZGVkXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZF8xPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsPQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMj1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMz1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzQ9Y2FzdD0oZ2Zsb2F0KQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfNT1jYXN0PShnZmxvYXQpCi0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludD0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludF8wPWNhc3Q9R3RrVHJlZVZpZXcgKgotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX3BvaW50XzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9jdXJzb3I9Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9jdXJzb3JfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2N1cnNvcl8yPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yXzM9Ci0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9kcmFnX2Rlc3Rfcm93PQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2RyYWdfZGVzdF9yb3dfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2RyYWdfZGVzdF9yb3dfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2RyYWdfZGVzdF9yb3dfMj0KLQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9oZWFkZXJzX3Zpc2libGVfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfbW9kZWw9Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfbW9kZWxfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X21vZGVsXzE9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50PQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnRfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnRfMT0KLQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X3NlYXJjaF9jb2x1bW49Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfc2VhcmNoX2NvbHVtbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfc2VhcmNoX2NvbHVtbl8xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdHJlZV92aWV3X3RyZWVfdG9fd2lkZ2V0X2Nvb3Jkcz0KLU9TX19ndGtfdHJlZV92aWV3X3RyZWVfdG9fd2lkZ2V0X2Nvb3Jkc18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld190cmVlX3RvX3dpZGdldF9jb29yZHNfMT1jYXN0PShnaW50KQotT1NfX2d0a190cmVlX3ZpZXdfdHJlZV90b193aWRnZXRfY29vcmRzXzI9Y2FzdD1naW50Ci1PU19fZ3RrX3RyZWVfdmlld190cmVlX3RvX3dpZGdldF9jb29yZHNfMz1jYXN0PWdpbnQgKgotT1NfX2d0a190cmVlX3ZpZXdfdHJlZV90b193aWRnZXRfY29vcmRzXzQ9Y2FzdD1naW50ICoKLQotT1NfX2d0a190cmVlX3ZpZXdfdW5zZXRfcm93c19kcmFnX2Rlc3Q9Ci1PU19fZ3RrX3RyZWVfdmlld191bnNldF9yb3dzX2RyYWdfZGVzdF8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X3dpZGdldF90b190cmVlX2Nvb3Jkcz0KLU9TX19ndGtfdHJlZV92aWV3X3dpZGdldF90b190cmVlX2Nvb3Jkc18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld193aWRnZXRfdG9fdHJlZV9jb29yZHNfMT0KLU9TX19ndGtfdHJlZV92aWV3X3dpZGdldF90b190cmVlX2Nvb3Jkc18yPQotT1NfX2d0a190cmVlX3ZpZXdfd2lkZ2V0X3RvX3RyZWVfY29vcmRzXzM9Ci1PU19fZ3RrX3RyZWVfdmlld193aWRnZXRfdG9fdHJlZV9jb29yZHNfND0KLQotT1NfX2d0a192Ym94X25ldz0KLU9TX19ndGtfdmJveF9uZXdfMD1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfdmJveF9uZXdfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX3ZzY2FsZV9uZXc9Ci1PU19fZ3RrX3ZzY2FsZV9uZXdfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfdnNjcm9sbGJhcl9uZXc9Ci1PU19fZ3RrX3ZzY3JvbGxiYXJfbmV3XzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotCi1PU19fZ3RrX3ZzZXBhcmF0b3JfbmV3PQotCi1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3I9Ci1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3JfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3JfMj1jYXN0PShHdGtBY2NlbEdyb3VwICopCi1PU19fZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3JfMz1jYXN0PShndWludCkKLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcl80PWNhc3Q9KEdka01vZGlmaWVyVHlwZSkKLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcl81PQotCi1PU19fZ3RrX3dpZGdldF9hZGRfZXZlbnRzPQotT1NfX2d0a193aWRnZXRfYWRkX2V2ZW50c18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfYWRkX2V2ZW50c18xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfd2lkZ2V0X2NoaWxkX2ZvY3VzPQotT1NfX2d0a193aWRnZXRfY2hpbGRfZm9jdXNfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X2NoaWxkX2ZvY3VzXzE9Ci0KLU9TX18xZ3RrXzF3aWRnZXRfMWNyZWF0ZV8xcGFuZ29fMWxheW91dF9fSUk9Ci1PU19fMWd0a18xd2lkZ2V0XzFjcmVhdGVfMXBhbmdvXzFsYXlvdXRfX0lJXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fMWd0a18xd2lkZ2V0XzFjcmVhdGVfMXBhbmdvXzFsYXlvdXRfX0lJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfXzFndGtfMXdpZGdldF8xY3JlYXRlXzFwYW5nb18xbGF5b3V0X19JXzNCPQotT1NfXzFndGtfMXdpZGdldF8xY3JlYXRlXzFwYW5nb18xbGF5b3V0X19JXzNCXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fMWd0a18xd2lkZ2V0XzFjcmVhdGVfMXBhbmdvXzFsYXlvdXRfX0lfM0JfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3dpZGdldF9kZXN0cm95PQotT1NfX2d0a193aWRnZXRfZGVzdHJveV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9ldmVudD0KLU9TX19ndGtfd2lkZ2V0X2V2ZW50XzA9Y2FzdD1HdGtXaWRnZXQgKgotT1NfX2d0a193aWRnZXRfZXZlbnRfMT1jYXN0PUdka0V2ZW50ICoKLQotT1NfX2d0a193aWRnZXRfZ2V0X2FjY2Vzc2libGU9Ci1PU19fZ3RrX3dpZGdldF9nZXRfYWNjZXNzaWJsZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfY2hpbGRfdmlzaWJsZT0KLU9TX19ndGtfd2lkZ2V0X2dldF9jaGlsZF92aXNpYmxlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9kZWZhdWx0X2RpcmVjdGlvbj0KLQotT1NfX2d0a193aWRnZXRfZ2V0X2RlZmF1bHRfc3R5bGU9Ci0KLU9TX19ndGtfd2lkZ2V0X2dldF9kaXJlY3Rpb249Ci1PU19fZ3RrX3dpZGdldF9nZXRfZGlyZWN0aW9uXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9ldmVudHM9Ci1PU19fZ3RrX3dpZGdldF9nZXRfZXZlbnRzXzA9Y2FzdD1HdGtXaWRnZXQgKgotCi1PU19fZ3RrX3dpZGdldF9nZXRfbW9kaWZpZXJfc3R5bGU9Ci1PU19fZ3RrX3dpZGdldF9nZXRfbW9kaWZpZXJfc3R5bGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X3BhbmdvX2NvbnRleHQ9Ci1PU19fZ3RrX3dpZGdldF9nZXRfcGFuZ29fY29udGV4dF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfcGFyZW50PQotT1NfX2d0a193aWRnZXRfZ2V0X3BhcmVudF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfc2l6ZV9yZXF1ZXN0PQotT1NfX2d0a193aWRnZXRfZ2V0X3NpemVfcmVxdWVzdF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfZ2V0X3NpemVfcmVxdWVzdF8xPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfd2lkZ2V0X2dldF9zaXplX3JlcXVlc3RfMj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9zdHlsZT0KLU9TX19ndGtfd2lkZ2V0X2dldF9zdHlsZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfdG9wbGV2ZWw9Ci1PU19fZ3RrX3dpZGdldF9nZXRfdG9wbGV2ZWxfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ3JhYl9mb2N1cz0KLU9TX19ndGtfd2lkZ2V0X2dyYWJfZm9jdXNfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfaGlkZT0KLU9TX19ndGtfd2lkZ2V0X2hpZGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfaXNfZm9jdXM9Ci1PU19fZ3RrX3dpZGdldF9pc19mb2N1c18wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9tYXA9Ci1PU19fZ3RrX3dpZGdldF9tYXBfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfbW5lbW9uaWNfYWN0aXZhdGU9Ci1PU19fZ3RrX3dpZGdldF9tbmVtb25pY19hY3RpdmF0ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW5lbW9uaWNfYWN0aXZhdGVfMT1jYXN0PWdib29sZWFuCi0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iYXNlPQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2Jhc2VfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iYXNlXzE9Y2FzdD0oR3RrU3RhdGVUeXBlKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2Jhc2VfMj1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2JnPQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2JnXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmdfMT1jYXN0PShHdGtTdGF0ZVR5cGUpCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmdfMj1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZnPQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZnXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZmdfMT1jYXN0PShHdGtTdGF0ZVR5cGUpCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZmdfMj1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZvbnQ9Ci1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZm9udF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2ZvbnRfMT1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfc3R5bGU9Ci1PU19fZ3RrX3dpZGdldF9tb2RpZnlfc3R5bGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9zdHlsZV8xPWNhc3Q9KEd0a1JjU3R5bGUgKikKLQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3RleHQ9Ci1PU19fZ3RrX3dpZGdldF9tb2RpZnlfdGV4dF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3RleHRfMT1jYXN0PShHdGtTdGF0ZVR5cGUpCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfdGV4dF8yPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotCi1PU19fZ3RrX3dpZGdldF9yZWFsaXplPQotT1NfX2d0a193aWRnZXRfcmVhbGl6ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9yZW1vdmVfYWNjZWxlcmF0b3I9Ci1PU19fZ3RrX3dpZGdldF9yZW1vdmVfYWNjZWxlcmF0b3JfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3JlbW92ZV9hY2NlbGVyYXRvcl8xPWNhc3Q9KEd0a0FjY2VsR3JvdXAgKikKLU9TX19ndGtfd2lkZ2V0X3JlbW92ZV9hY2NlbGVyYXRvcl8yPWNhc3Q9KGd1aW50KQotT1NfX2d0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yXzM9Y2FzdD0oR2RrTW9kaWZpZXJUeXBlKQotCi1PU19fZ3RrX3dpZGdldF9yZXBhcmVudD0KLU9TX19ndGtfd2lkZ2V0X3JlcGFyZW50XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9yZXBhcmVudF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfZGVmYXVsdF9kaXJlY3Rpb249Ci1PU19fZ3RrX3dpZGdldF9zZXRfZGVmYXVsdF9kaXJlY3Rpb25fMD1jYXN0PShHdGtUZXh0RGlyZWN0aW9uKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uPQotT1NfX2d0a193aWRnZXRfc2V0X2RpcmVjdGlvbl8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X2RpcmVjdGlvbl8xPWNhc3Q9KEd0a1RleHREaXJlY3Rpb24pCi0KLU9TX19ndGtfd2lkZ2V0X3NldF9kb3VibGVfYnVmZmVyZWQ9Ci1PU19fZ3RrX3dpZGdldF9zZXRfZG91YmxlX2J1ZmZlcmVkXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zZXRfZG91YmxlX2J1ZmZlcmVkXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfd2lkZ2V0X3NldF9uYW1lPQotT1NfX2d0a193aWRnZXRfc2V0X25hbWVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9uYW1lXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfcGFyZW50X3dpbmRvdz0KLU9TX19ndGtfd2lkZ2V0X3NldF9wYXJlbnRfd2luZG93XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zZXRfcGFyZW50X3dpbmRvd18xPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfcmVkcmF3X29uX2FsbG9jYXRlPQotT1NfX2d0a193aWRnZXRfc2V0X3JlZHJhd19vbl9hbGxvY2F0ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3JlZHJhd19vbl9hbGxvY2F0ZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlPQotT1NfX2d0a193aWRnZXRfc2V0X3NlbnNpdGl2ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3NlbnNpdGl2ZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0PQotT1NfX2d0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdF8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0XzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a193aWRnZXRfc2V0X3N0YXRlPQotT1NfX2d0a193aWRnZXRfc2V0X3N0YXRlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zZXRfc3RhdGVfMT1jYXN0PShHdGtTdGF0ZVR5cGUpCi0KLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFzaz0KLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFza18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2hhcGVfY29tYmluZV9tYXNrXzE9Y2FzdD0oR2RrQml0bWFwICopCi1PU19fZ3RrX3dpZGdldF9zaGFwZV9jb21iaW5lX21hc2tfMj1jYXN0PWdpbnQKLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFza18zPWNhc3Q9Z2ludAotCi1PU19fZ3RrX3dpZGdldF9zaG93PQotT1NfX2d0a193aWRnZXRfc2hvd18wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9zaG93X25vdz0KLU9TX19ndGtfd2lkZ2V0X3Nob3dfbm93XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X3NpemVfYWxsb2NhdGU9Ci1PU19fZ3RrX3dpZGdldF9zaXplX2FsbG9jYXRlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zaXplX2FsbG9jYXRlXzE9Y2FzdD0oR3RrQWxsb2NhdGlvbiAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a193aWRnZXRfc2l6ZV9yZXF1ZXN0PQotT1NfX2d0a193aWRnZXRfc2l6ZV9yZXF1ZXN0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zaXplX3JlcXVlc3RfMT1jYXN0PShHdGtSZXF1aXNpdGlvbiAqKSxmbGFncz1ub19pbgotCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJST0KLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0lJXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJSV8yPQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSUlfMz0KLQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSkk9Ci1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNKSV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSklfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSklfMj0KLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0pJXzM9Ci0KLU9TX19ndGtfd2lkZ2V0X3VucmVhbGl6ZT0KLU9TX19ndGtfd2lkZ2V0X3VucmVhbGl6ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpbmRvd19hY3RpdmF0ZV9kZWZhdWx0PQotT1NfX2d0a193aW5kb3dfYWN0aXZhdGVfZGVmYXVsdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXA9Ci1PU19fZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXBfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X2FkZF9hY2NlbF9ncm91cF8xPWNhc3Q9KEd0a0FjY2VsR3JvdXAgKikKLQotT1NfX2d0a193aW5kb3dfZGVpY29uaWZ5PQotT1NfX2d0a193aW5kb3dfZGVpY29uaWZ5XzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X2dldF9mb2N1cz0KLU9TX19ndGtfd2luZG93X2dldF9mb2N1c18wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfaWNvbl9saXN0PQotT1NfX2d0a193aW5kb3dfZ2V0X2ljb25fbGlzdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfbW5lbW9uaWNfbW9kaWZpZXI9Ci1PU19fZ3RrX3dpbmRvd19nZXRfbW5lbW9uaWNfbW9kaWZpZXJfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfZ2V0X3Bvc2l0aW9uPQotT1NfX2d0a193aW5kb3dfZ2V0X3Bvc2l0aW9uXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19nZXRfcG9zaXRpb25fMT1jYXN0PShnaW50ICopCi1PU19fZ3RrX3dpbmRvd19nZXRfcG9zaXRpb25fMj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfd2luZG93X2dldF9zaXplPQotT1NfX2d0a193aW5kb3dfZ2V0X3NpemVfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X2dldF9zaXplXzE9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a193aW5kb3dfZ2V0X3NpemVfMj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfd2luZG93X2ljb25pZnk9Ci1PU19fZ3RrX3dpbmRvd19pY29uaWZ5XzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X21heGltaXplPQotT1NfX2d0a193aW5kb3dfbWF4aW1pemVfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfbW92ZT0KLU9TX19ndGtfd2luZG93X21vdmVfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X21vdmVfMT1jYXN0PShnaW50KQotT1NfX2d0a193aW5kb3dfbW92ZV8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfd2luZG93X25ldz0KLU9TX19ndGtfd2luZG93X25ld18wPWNhc3Q9KEd0a1dpbmRvd1R5cGUpCi0KLU9TX19ndGtfd2luZG93X3ByZXNlbnQ9Ci1PU19fZ3RrX3dpbmRvd19wcmVzZW50XzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X3JlbW92ZV9hY2NlbF9ncm91cD0KLU9TX19ndGtfd2luZG93X3JlbW92ZV9hY2NlbF9ncm91cF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfcmVtb3ZlX2FjY2VsX2dyb3VwXzE9Y2FzdD0oR3RrQWNjZWxHcm91cCAqKQotCi1PU19fZ3RrX3dpbmRvd19yZXNpemU9Ci1PU19fZ3RrX3dpbmRvd19yZXNpemVfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X3Jlc2l6ZV8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3dpbmRvd19yZXNpemVfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3dpbmRvd19zZXRfZGVmYXVsdD0KLU9TX19ndGtfd2luZG93X3NldF9kZWZhdWx0XzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfZGVmYXVsdF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpbmRvd19zZXRfZGVzdHJveV93aXRoX3BhcmVudD0KLU9TX19ndGtfd2luZG93X3NldF9kZXN0cm95X3dpdGhfcGFyZW50XzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfZGVzdHJveV93aXRoX3BhcmVudF8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHM9Ci1PU19fZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHNfMD1jYXN0PUd0a1dpbmRvdyAqCi1PU19fZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHNfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2luZG93X3NldF9nZW9tZXRyeV9oaW50c18yPWZsYWdzPW5vX291dAotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzXzM9Ci0KLU9TX19ndGtfd2luZG93X3NldF9pY29uX2xpc3Q9Ci1PU19fZ3RrX3dpbmRvd19zZXRfaWNvbl9saXN0XzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfaWNvbl9saXN0XzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X21vZGFsPQotT1NfX2d0a193aW5kb3dfc2V0X21vZGFsXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfbW9kYWxfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aW5kb3dfc2V0X3Jlc2l6YWJsZT0KLU9TX19ndGtfd2luZG93X3NldF9yZXNpemFibGVfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X3NldF9yZXNpemFibGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aW5kb3dfc2V0X3RpdGxlPQotT1NfX2d0a193aW5kb3dfc2V0X3RpdGxlXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfdGl0bGVfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3dpbmRvd19zZXRfdHJhbnNpZW50X2Zvcj0KLU9TX19ndGtfd2luZG93X3NldF90cmFuc2llbnRfZm9yXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfdHJhbnNpZW50X2Zvcl8xPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19zZXRfdHlwZV9oaW50PQotT1NfX2d0a193aW5kb3dfc2V0X3R5cGVfaGludF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X3R5cGVfaGludF8xPQotCi1PU19fZ3RrX3dpbmRvd191bm1heGltaXplPQotT1NfX2d0a193aW5kb3dfdW5tYXhpbWl6ZV8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fcGFuZ29fYXR0cl9iYWNrZ3JvdW5kX25ldz0KLU9TX19wYW5nb19hdHRyX2JhY2tncm91bmRfbmV3XzA9Ci1PU19fcGFuZ29fYXR0cl9iYWNrZ3JvdW5kX25ld18xPQotT1NfX3BhbmdvX2F0dHJfYmFja2dyb3VuZF9uZXdfMj0KLQotT1NfX3BhbmdvX2F0dHJfZm9udF9kZXNjX25ldz0KLU9TX19wYW5nb19hdHRyX2ZvbnRfZGVzY19uZXdfMD1jYXN0PWNvbnN0IFBhbmdvRm9udERlc2NyaXB0aW9uICoKLQotT1NfX3BhbmdvX2F0dHJfZm9yZWdyb3VuZF9uZXc9Ci1PU19fcGFuZ29fYXR0cl9mb3JlZ3JvdW5kX25ld18wPQotT1NfX3BhbmdvX2F0dHJfZm9yZWdyb3VuZF9uZXdfMT0KLU9TX19wYW5nb19hdHRyX2ZvcmVncm91bmRfbmV3XzI9Ci0KLU9TX19wYW5nb19hdHRyX2xpc3RfY2hhbmdlPQotT1NfX3BhbmdvX2F0dHJfbGlzdF9jaGFuZ2VfMD1jYXN0PVBhbmdvQXR0ckxpc3QgKgotT1NfX3BhbmdvX2F0dHJfbGlzdF9jaGFuZ2VfMT1jYXN0PVBhbmdvQXR0cmlidXRlICoKLQotT1NfX3BhbmdvX2F0dHJfbGlzdF9pbnNlcnQ9Ci1PU19fcGFuZ29fYXR0cl9saXN0X2luc2VydF8wPWNhc3Q9UGFuZ29BdHRyTGlzdCAqCi1PU19fcGFuZ29fYXR0cl9saXN0X2luc2VydF8xPWNhc3Q9UGFuZ29BdHRyaWJ1dGUgKgotCi1PU19fcGFuZ29fYXR0cl9saXN0X25ldz0KLQotT1NfX3BhbmdvX2F0dHJfbGlzdF91bnJlZj0KLU9TX19wYW5nb19hdHRyX2xpc3RfdW5yZWZfMD1jYXN0PShQYW5nb0F0dHJMaXN0ICopCi0KLU9TX19wYW5nb19hdHRyX3Jpc2VfbmV3PQotT1NfX3BhbmdvX2F0dHJfcmlzZV9uZXdfMD0KLQotT1NfX3BhbmdvX2F0dHJfc2hhcGVfbmV3PQotT1NfX3BhbmdvX2F0dHJfc2hhcGVfbmV3XzA9ZmxhZ3M9bm9fb3V0Ci1PU19fcGFuZ29fYXR0cl9zaGFwZV9uZXdfMT1mbGFncz1ub19vdXQKLQotT1NfX3BhbmdvX2F0dHJfc3RyaWtldGhyb3VnaF9uZXc9Ci1PU19fcGFuZ29fYXR0cl9zdHJpa2V0aHJvdWdoX25ld18wPQotCi1PU19fcGFuZ29fYXR0cl91bmRlcmxpbmVfbmV3PQotT1NfX3BhbmdvX2F0dHJfdW5kZXJsaW5lX25ld18wPQotCi1PU19fcGFuZ29fYXR0cl93ZWlnaHRfbmV3PQotT1NfX3BhbmdvX2F0dHJfd2VpZ2h0X25ld18wPQotCi1PU19fcGFuZ29fY29udGV4dF9nZXRfYmFzZV9kaXI9Ci1PU19fcGFuZ29fY29udGV4dF9nZXRfYmFzZV9kaXJfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X2xhbmd1YWdlPQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X2xhbmd1YWdlXzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi0KLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzPQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X21ldHJpY3NfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzXzE9Y2FzdD0oY29uc3QgUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzXzI9Y2FzdD0oUGFuZ29MYW5ndWFnZSAqKQotCi1PU19fcGFuZ29fY29udGV4dF9saXN0X2ZhbWlsaWVzPQotT1NfX3BhbmdvX2NvbnRleHRfbGlzdF9mYW1pbGllc18wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NvbnRleHRfbGlzdF9mYW1pbGllc18xPWNhc3Q9KFBhbmdvRm9udEZhbWlseSAqKiopCi1PU19fcGFuZ29fY29udGV4dF9saXN0X2ZhbWlsaWVzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19wYW5nb19jb250ZXh0X3NldF9iYXNlX2Rpcj0KLU9TX19wYW5nb19jb250ZXh0X3NldF9iYXNlX2Rpcl8wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NvbnRleHRfc2V0X2Jhc2VfZGlyXzE9Ci0KLU9TX19wYW5nb19jb250ZXh0X3NldF9sYW5ndWFnZT0KLU9TX19wYW5nb19jb250ZXh0X3NldF9sYW5ndWFnZV8wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NvbnRleHRfc2V0X2xhbmd1YWdlXzE9Y2FzdD0oUGFuZ29MYW5ndWFnZSAqKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9jb3B5PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fY29weV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlXzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJvbV9zdHJpbmc9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcm9tX3N0cmluZ18wPWNhc3Q9KGNvbnN0IGNoYXIgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9mYW1pbHk9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfZmFtaWx5XzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X3NpemU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfc2l6ZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zdHlsZT0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zdHlsZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF93ZWlnaHQ9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfd2VpZ2h0XzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fbmV3PQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfZmFtaWx5PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X2ZhbWlseV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfZmFtaWx5XzE9Y2FzdD0oY29uc3QgY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3NpemU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc2l6ZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc2l6ZV8xPWNhc3Q9KGdpbnQpCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHJldGNoPQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3N0cmV0Y2hfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3N0cmV0Y2hfMT1jYXN0PShQYW5nb1N0cmV0Y2gpCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZT0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3R5bGVfMT1jYXN0PShQYW5nb1N0eWxlKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfd2VpZ2h0PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3dlaWdodF8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfd2VpZ2h0XzE9Y2FzdD0oUGFuZ29XZWlnaHQpCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3RvX3N0cmluZz0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3RvX3N0cmluZ18wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2ZhY2VfZGVzY3JpYmU9Ci1PU19fcGFuZ29fZm9udF9mYWNlX2Rlc2NyaWJlXzA9Y2FzdD0oUGFuZ29Gb250RmFjZSAqKQotCi1PU19fcGFuZ29fZm9udF9mYW1pbHlfZ2V0X25hbWU9Ci1PU19fcGFuZ29fZm9udF9mYW1pbHlfZ2V0X25hbWVfMD1jYXN0PShQYW5nb0ZvbnRGYW1pbHkgKikKLQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2xpc3RfZmFjZXM9Ci1PU19fcGFuZ29fZm9udF9mYW1pbHlfbGlzdF9mYWNlc18wPWNhc3Q9KFBhbmdvRm9udEZhbWlseSAqKQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2xpc3RfZmFjZXNfMT1jYXN0PShQYW5nb0ZvbnRGYWNlICoqKikKLU9TX19wYW5nb19mb250X2ZhbWlseV9saXN0X2ZhY2VzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19wYW5nb19mb250X2dldF9tZXRyaWNzPQotT1NfX3BhbmdvX2ZvbnRfZ2V0X21ldHJpY3NfMD1jYXN0PVBhbmdvRm9udCAqCi1PU19fcGFuZ29fZm9udF9nZXRfbWV0cmljc18xPWNhc3Q9UGFuZ29MYW5ndWFnZSAqCi0KLU9TX19wYW5nb19mb250X21ldHJpY3NfZ2V0X2FwcHJveGltYXRlX2NoYXJfd2lkdGg9Ci1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hcHByb3hpbWF0ZV9jaGFyX3dpZHRoXzA9Y2FzdD0oUGFuZ29Gb250TWV0cmljcyAqKQotCi1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hc2NlbnQ9Ci1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hc2NlbnRfMD1jYXN0PShQYW5nb0ZvbnRNZXRyaWNzICopCi0KLU9TX19wYW5nb19mb250X21ldHJpY3NfZ2V0X2Rlc2NlbnQ9Ci1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9kZXNjZW50XzA9Y2FzdD0oUGFuZ29Gb250TWV0cmljcyAqKQotCi1PU19fcGFuZ29fZm9udF9tZXRyaWNzX3VucmVmPQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc191bnJlZl8wPWNhc3Q9KFBhbmdvRm9udE1ldHJpY3MgKikKLQotT1NfX3BhbmdvX2xhbmd1YWdlX2Zyb21fc3RyaW5nPQotT1NfX3BhbmdvX2xhbmd1YWdlX2Zyb21fc3RyaW5nXzA9Y2FzdD0oY29uc3QgY2hhciAqKSxmbGFncz1ub19vdXQKLQotT1NfX3BhbmdvX2xheW91dF9jb250ZXh0X2NoYW5nZWQ9Ci1PU19fcGFuZ29fbGF5b3V0X2NvbnRleHRfY2hhbmdlZF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9hbGlnbm1lbnQ9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9hbGlnbm1lbnRfMD1jYXN0PVBhbmdvTGF5b3V0KgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9hdHRyaWJ1dGVzPQotT1NfX3BhbmdvX2xheW91dF9nZXRfYXR0cmlidXRlc18wPWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9pbmRlbnQ9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9pbmRlbnRfMD1jYXN0PShQYW5nb0xheW91dCopCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2l0ZXI9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9pdGVyXzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9qdXN0aWZ5PQotT1NfX3BhbmdvX2xheW91dF9nZXRfanVzdGlmeV8wPWNhc3Q9KFBhbmdvTGF5b3V0KikKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfbGluZT0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmVfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmVfMT0KLQotT1NfX3BhbmdvX2xheW91dF9nZXRfbGluZV9jb3VudD0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmVfY291bnRfMD1jYXN0PVBhbmdvTGF5b3V0KgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9sb2dfYXR0cnM9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9sb2dfYXR0cnNfMD1jYXN0PVBhbmdvTGF5b3V0KgotT1NfX3BhbmdvX2xheW91dF9nZXRfbG9nX2F0dHJzXzE9Y2FzdD1QYW5nb0xvZ0F0dHIgKioKLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xvZ19hdHRyc18yPWNhc3Q9KGludCAqKQotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9zaXplPQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZV8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X2dldF9zaXplXzE9Y2FzdD0oaW50ICopCi1PU19fcGFuZ29fbGF5b3V0X2dldF9zaXplXzI9Y2FzdD0oaW50ICopCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3NwYWNpbmc9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9zcGFjaW5nXzA9Y2FzdD1QYW5nb0xheW91dCoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfdGFicz0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3RhYnNfMD1jYXN0PVBhbmdvTGF5b3V0KgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF90ZXh0PQotT1NfX3BhbmdvX2xheW91dF9nZXRfdGV4dF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF93aWR0aD0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3dpZHRoXzA9Y2FzdD1QYW5nb0xheW91dCAqCi0KLU9TX19wYW5nb19sYXlvdXRfaW5kZXhfdG9fcG9zPQotT1NfX3BhbmdvX2xheW91dF9pbmRleF90b19wb3NfMD1jYXN0PShQYW5nb0xheW91dCopCi1PU19fcGFuZ29fbGF5b3V0X2luZGV4X3RvX3Bvc18xPQotT1NfX3BhbmdvX2xheW91dF9pbmRleF90b19wb3NfMj1mbGFncz1ub19pbgotCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZnJlZT0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9mcmVlXzA9Y2FzdD1QYW5nb0xheW91dEl0ZXIqCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9nZXRfaW5kZXg9Ci1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2luZGV4XzA9Y2FzdD0oUGFuZ29MYXlvdXRJdGVyKikKLQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHM9Ci1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2xpbmVfZXh0ZW50c18wPWNhc3Q9KFBhbmdvTGF5b3V0SXRlciopCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2xpbmVfZXh0ZW50c18xPWZsYWdzPW5vX2luCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2xpbmVfZXh0ZW50c18yPWZsYWdzPW5vX2luCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9nZXRfcnVuPQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9ydW5fMD1jYXN0PVBhbmdvTGF5b3V0SXRlcioKLQotT1NfX3BhbmdvX2xheW91dF9pdGVyX25leHRfbGluZT0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X2xpbmVfMD1jYXN0PVBhbmdvTGF5b3V0SXRlcioKLQotT1NfX3BhbmdvX2xheW91dF9pdGVyX25leHRfcnVuPQotT1NfX3BhbmdvX2xheW91dF9pdGVyX25leHRfcnVuXzA9Y2FzdD1QYW5nb0xheW91dEl0ZXIqCi0KLU9TX19wYW5nb19sYXlvdXRfbGluZV9nZXRfZXh0ZW50cz0KLU9TX19wYW5nb19sYXlvdXRfbGluZV9nZXRfZXh0ZW50c18wPWNhc3Q9UGFuZ29MYXlvdXRMaW5lKgotT1NfX3BhbmdvX2xheW91dF9saW5lX2dldF9leHRlbnRzXzE9Y2FzdD1QYW5nb1JlY3RhbmdsZSAqLGZsYWdzPW5vX2luCi1PU19fcGFuZ29fbGF5b3V0X2xpbmVfZ2V0X2V4dGVudHNfMj1jYXN0PVBhbmdvUmVjdGFuZ2xlICosZmxhZ3M9bm9faW4KLQotT1NfX3BhbmdvX2xheW91dF9saW5lX3hfdG9faW5kZXg9Ci1PU19fcGFuZ29fbGF5b3V0X2xpbmVfeF90b19pbmRleF8wPWNhc3Q9UGFuZ29MYXlvdXRMaW5lKgotT1NfX3BhbmdvX2xheW91dF9saW5lX3hfdG9faW5kZXhfMT0KLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4XzI9Y2FzdD1pbnQgKgotT1NfX3BhbmdvX2xheW91dF9saW5lX3hfdG9faW5kZXhfMz1jYXN0PWludCAqCi0KLU9TX19wYW5nb19sYXlvdXRfbmV3PQotT1NfX3BhbmdvX2xheW91dF9uZXdfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLQotT1NfX3BhbmdvX2xheW91dF9zZXRfYWxpZ25tZW50PQotT1NfX3BhbmdvX2xheW91dF9zZXRfYWxpZ25tZW50XzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19wYW5nb19sYXlvdXRfc2V0X2FsaWdubWVudF8xPQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF9hdHRyaWJ1dGVzPQotT1NfX3BhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlc18wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9hdHRyaWJ1dGVzXzE9Y2FzdD1QYW5nb0F0dHJMaXN0ICoKLQotT1NfX3BhbmdvX2xheW91dF9zZXRfZm9udF9kZXNjcmlwdGlvbj0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2ZvbnRfZGVzY3JpcHRpb25fMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfZm9udF9kZXNjcmlwdGlvbl8xPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2luZGVudD0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2luZGVudF8wPWNhc3Q9KFBhbmdvTGF5b3V0KikKLU9TX19wYW5nb19sYXlvdXRfc2V0X2luZGVudF8xPQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF9qdXN0aWZ5PQotT1NfX3BhbmdvX2xheW91dF9zZXRfanVzdGlmeV8wPWNhc3Q9KFBhbmdvTGF5b3V0KikKLU9TX19wYW5nb19sYXlvdXRfc2V0X2p1c3RpZnlfMT0KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfc2luZ2xlX3BhcmFncmFwaF9tb2RlPQotT1NfX3BhbmdvX2xheW91dF9zZXRfc2luZ2xlX3BhcmFncmFwaF9tb2RlXzA9Y2FzdD1QYW5nb0xheW91dCAqCi1PU19fcGFuZ29fbGF5b3V0X3NldF9zaW5nbGVfcGFyYWdyYXBoX21vZGVfMT1jYXN0PWdib29sZWFuCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3NwYWNpbmc9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF9zcGFjaW5nXzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19wYW5nb19sYXlvdXRfc2V0X3NwYWNpbmdfMT0KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfdGFicz0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3RhYnNfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLU9TX19wYW5nb19sYXlvdXRfc2V0X3RhYnNfMT1jYXN0PShQYW5nb1RhYkFycmF5ICopCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3RleHQ9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF90ZXh0XzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19wYW5nb19sYXlvdXRfc2V0X3RleHRfMT1jYXN0PShjb25zdCBjaGFyICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfX3BhbmdvX2xheW91dF9zZXRfdGV4dF8yPWNhc3Q9KGludCkKLQotT1NfX3BhbmdvX2xheW91dF9zZXRfd2lkdGg9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF93aWR0aF8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF93aWR0aF8xPQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF93cmFwPQotT1NfX3BhbmdvX2xheW91dF9zZXRfd3JhcF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotT1NfX3BhbmdvX2xheW91dF9zZXRfd3JhcF8xPQotCi1PU19fcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4PQotT1NfX3BhbmdvX2xheW91dF94eV90b19pbmRleF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotT1NfX3BhbmdvX2xheW91dF94eV90b19pbmRleF8xPQotT1NfX3BhbmdvX2xheW91dF94eV90b19pbmRleF8yPQotT1NfX3BhbmdvX2xheW91dF94eV90b19pbmRleF8zPWNhc3Q9aW50ICoKLU9TX19wYW5nb19sYXlvdXRfeHlfdG9faW5kZXhfND1jYXN0PWludCAqCi0KLU9TX19wYW5nb190YWJfYXJyYXlfZnJlZT0KLU9TX19wYW5nb190YWJfYXJyYXlfZnJlZV8wPWNhc3Q9KFBhbmdvVGFiQXJyYXkgKikKLQotT1NfX3BhbmdvX3RhYl9hcnJheV9nZXRfc2l6ZT0KLU9TX19wYW5nb190YWJfYXJyYXlfZ2V0X3NpemVfMD1jYXN0PShQYW5nb1RhYkFycmF5ICopCi0KLU9TX19wYW5nb190YWJfYXJyYXlfZ2V0X3RhYnM9Ci1PU19fcGFuZ29fdGFiX2FycmF5X2dldF90YWJzXzA9Y2FzdD0oUGFuZ29UYWJBcnJheSAqKQotT1NfX3BhbmdvX3RhYl9hcnJheV9nZXRfdGFic18xPWNhc3Q9KFBhbmdvVGFiQWxpZ24gKiopCi1PU19fcGFuZ29fdGFiX2FycmF5X2dldF90YWJzXzI9Y2FzdD0oaW50ICoqKQotCi1PU19fcGFuZ29fdGFiX2FycmF5X25ldz0KLU9TX19wYW5nb190YWJfYXJyYXlfbmV3XzA9Y2FzdD0oZ2ludCkKLU9TX19wYW5nb190YWJfYXJyYXlfbmV3XzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19wYW5nb190YWJfYXJyYXlfc2V0X3RhYj0KLU9TX19wYW5nb190YWJfYXJyYXlfc2V0X3RhYl8wPWNhc3Q9KFBhbmdvVGFiQXJyYXkgKikKLU9TX19wYW5nb190YWJfYXJyYXlfc2V0X3RhYl8xPWNhc3Q9KGdpbnQpCi1PU19fcGFuZ29fdGFiX2FycmF5X3NldF90YWJfMj1jYXN0PShQYW5nb1RhYkFsaWduKQotT1NfX3BhbmdvX3RhYl9hcnJheV9zZXRfdGFiXzM9Y2FzdD0oZ2ludCkKLQotT1NfZ19tYWluX2NvbnRleHRfd2FrZXVwPQotT1NfZ19tYWluX2NvbnRleHRfd2FrZXVwXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotCi1PU19nZXRlbnY9Ci1PU19nZXRlbnZfMD1jYXN0PWNvbnN0IGNoYXIgKgotCi1PU19sb2NhbGVjb252X2RlY2ltYWxfcG9pbnQ9Ci0KLU9TX21lbW1vdmVfX0lJST0KLU9TX21lbW1vdmVfX0lJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0lJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HSW50ZXJmYWNlSW5mb18ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlSW5mb18yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZUluZm9fMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVJbmZvXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZUluZm9fMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50XzI9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudF8yXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0FkanVzdG1lbnRfMl8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZF8yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpeGVkXzJfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRml4ZWRfMl8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRFbnRyeV8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRFbnRyeV8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRFbnRyeV8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0RW50cnlfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzXzJfMD0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18yXzE9ZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENsaWVudE1lc3NhZ2VFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNCST0KLU9TX21lbW1vdmVfX0lfM0JJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfbWVtbW92ZV9fSV8zQklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lfM0NJPQotT1NfbWVtbW92ZV9fSV8zQ0lfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNDSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19tZW1tb3ZlX19JXzNDSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSV8zREk9Ci1PU19tZW1tb3ZlX19JXzNESV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0RJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX21lbW1vdmVfX0lfM0RJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNJST0KLU9TX21lbW1vdmVfX0lfM0lJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zSUlfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfbWVtbW92ZV9fSV8zSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lfM0pJPQotT1NfbWVtbW92ZV9fSV8zSklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNKSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19tZW1tb3ZlX19JXzNKSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR09iamVjdENsYXNzXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR09iamVjdENsYXNzXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR09iamVjdENsYXNzXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZVF1ZXJ5XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlUXVlcnlfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVRdWVyeV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZVF1ZXJ5XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtEcmFnQ29udGV4dF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtEcmFnQ29udGV4dF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtEcmFnQ29udGV4dF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtEcmFnQ29udGV4dF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QW55XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QW55XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QW55XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50QW55XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudENyb3NzaW5nXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Q3Jvc3NpbmdfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRDcm9zc2luZ18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudENyb3NzaW5nXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRFeHBvc2VfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRFeHBvc2VfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRFeHBvc2VfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRFeHBvc2VfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEZvY3VzXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Rm9jdXNfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRGb2N1c18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEZvY3VzXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRLZXlfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRLZXlfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRLZXlfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRLZXlfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudE1vdGlvbl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudE1vdGlvbl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudE1vdGlvbl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudE1vdGlvbl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50U2Nyb2xsXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50U2Nyb2xsXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50U2Nyb2xsXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50U2Nyb2xsXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRWaXNpYmlsaXR5XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50VmlzaWJpbGl0eV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFZpc2liaWxpdHlfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRWaXNpYmlsaXR5XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRXaW5kb3dTdGF0ZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFdpbmRvd1N0YXRlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50V2luZG93U3RhdGVfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRXaW5kb3dTdGF0ZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrSW1hZ2VfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtJbWFnZV8ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0ltYWdlXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtSZWN0YW5nbGVfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrUmVjdGFuZ2xlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1JlY3RhbmdsZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtSZWN0YW5nbGVfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtWaXN1YWxfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtWaXN1YWxfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtWaXN1YWxfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0FkanVzdG1lbnRfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50XzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQm9yZGVyXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0JvcmRlcl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtCb3JkZXJfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQm9yZGVyXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ18ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDb21ib18yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbWJvXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29tYm9fMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpbGVTZWxlY3Rpb25fMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaWxlU2VsZWN0aW9uXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRmlsZVNlbGVjdGlvbl8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRml4ZWRfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZF8ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpeGVkXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1NlbGVjdGlvbkRhdGFfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrU2VsZWN0aW9uRGF0YV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRQYWlyXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldFBhaXJfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrV2lkZ2V0Q2xhc3NfMklfMD1mbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrV2lkZ2V0Q2xhc3NfMklfMT0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0l0ZW1fMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29JdGVtXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvSXRlbV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0l0ZW1fMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dExpbmVfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRMaW5lXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0TGluZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dExpbmVfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dFJ1bl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dFJ1bl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dFJ1bl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dFJ1bl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTG9nQXR0cl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xvZ0F0dHJfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29Mb2dBdHRyXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTG9nQXR0cl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDcm9zc2luZ0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDcm9zc2luZ0V2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDcm9zc2luZ0V2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDcm9zc2luZ0V2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YVmlzaWJpbGl0eUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hWaXNpYmlsaXR5RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFZpc2liaWxpdHlFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YVmlzaWJpbGl0eUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNCSUk9Ci1PU19tZW1tb3ZlX19fM0JJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX21lbW1vdmVfX18zQklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNCSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zQ0lJPQotT1NfbWVtbW92ZV9fXzNDSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19tZW1tb3ZlX19fM0NJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zQ0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19fM0lJST0KLU9TX21lbW1vdmVfX18zSUlJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfbWVtbW92ZV9fXzNJSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19fM0lJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNJXzNCST0KLU9TX21lbW1vdmVfX18zSV8zQklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19tZW1tb3ZlX19fM0lfM0JJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNJXzNCSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNKSUk9Ci1PU19tZW1tb3ZlX19fM0pJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX21lbW1vdmVfX18zSklJXzE9Y2FzdD1jb25zdCB2b2lkICosZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19tZW1tb3ZlX19fM0pJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtc2V0PQotT1NfbWVtc2V0XzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtc2V0XzE9Y2FzdD0oY2hhcikKLU9TX21lbXNldF8yPWNhc3Q9KHNpemVfdCkKLQotT1Nfc3RybGVuPQotT1Nfc3RybGVuXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGU9Ci1QYW5nb0F0dHJpYnV0ZV9rbGFzcz1jYXN0PWNvbnN0IFBhbmdvQXR0ckNsYXNzICoKLVBhbmdvQXR0cmlidXRlX3N0YXJ0X2luZGV4PQotUGFuZ29BdHRyaWJ1dGVfZW5kX2luZGV4PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvSXRlbT0KLVBhbmdvSXRlbV9vZmZzZXQ9Ci1QYW5nb0l0ZW1fbGVuZ3RoPQotUGFuZ29JdGVtX251bV9jaGFycz0KLVBhbmdvSXRlbV9hbmFseXNpc19zaGFwZV9lbmdpbmU9YWNjZXNzb3I9YW5hbHlzaXMuc2hhcGVfZW5naW5lLGNhc3Q9KFBhbmdvRW5naW5lU2hhcGUgKikKLVBhbmdvSXRlbV9hbmFseXNpc19sYW5nX2VuZ2luZT1hY2Nlc3Nvcj1hbmFseXNpcy5sYW5nX2VuZ2luZSxjYXN0PVBhbmdvRW5naW5lTGFuZyAqCi1QYW5nb0l0ZW1fYW5hbHlzaXNfZm9udD1hY2Nlc3Nvcj1hbmFseXNpcy5mb250LGNhc3Q9UGFuZ29Gb250ICoKLVBhbmdvSXRlbV9hbmFseXNpc19sZXZlbD1hY2Nlc3Nvcj1hbmFseXNpcy5sZXZlbAotUGFuZ29JdGVtX2FuYWx5c2lzX2xhbmd1YWdlPWFjY2Vzc29yPWFuYWx5c2lzLmxhbmd1YWdlLGNhc3Q9KFBhbmdvTGFuZ3VhZ2UgKikKLVBhbmdvSXRlbV9hbmFseXNpc19leHRyYV9hdHRycz1hY2Nlc3Nvcj1hbmFseXNpcy5leHRyYV9hdHRycyxjYXN0PUdTTGlzdCAqCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRMaW5lPQotUGFuZ29MYXlvdXRMaW5lX2xheW91dD1jYXN0PVBhbmdvTGF5b3V0ICoKLVBhbmdvTGF5b3V0TGluZV9zdGFydF9pbmRleD0KLVBhbmdvTGF5b3V0TGluZV9sZW5ndGg9Ci1QYW5nb0xheW91dExpbmVfcnVucz1jYXN0PUdTTGlzdCAqCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRSdW49Ci1QYW5nb0xheW91dFJ1bl9pdGVtPWNhc3Q9UGFuZ29JdGVtICoKLVBhbmdvTGF5b3V0UnVuX2dseXBocz1jYXN0PVBhbmdvR2x5cGhTdHJpbmcgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTG9nQXR0cj0KLVBhbmdvTG9nQXR0cl9pc19saW5lX2JyZWFrPQotUGFuZ29Mb2dBdHRyX2lzX21hbmRhdG9yeV9icmVhaz0KLVBhbmdvTG9nQXR0cl9pc19jaGFyX2JyZWFrPQotUGFuZ29Mb2dBdHRyX2lzX3doaXRlPQotUGFuZ29Mb2dBdHRyX2lzX2N1cnNvcl9wb3NpdGlvbj0KLVBhbmdvTG9nQXR0cl9pc193b3JkX3N0YXJ0PQotUGFuZ29Mb2dBdHRyX2lzX3dvcmRfZW5kPQotUGFuZ29Mb2dBdHRyX2lzX3NlbnRlbmNlX2JvdW5kYXJ5PQotUGFuZ29Mb2dBdHRyX2lzX3NlbnRlbmNlX3N0YXJ0PQotUGFuZ29Mb2dBdHRyX2lzX3NlbnRlbmNlX2VuZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb1JlY3RhbmdsZT0KLVBhbmdvUmVjdGFuZ2xlX3g9Ci1QYW5nb1JlY3RhbmdsZV95PQotUGFuZ29SZWN0YW5nbGVfd2lkdGg9Ci1QYW5nb1JlY3RhbmdsZV9oZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEFueUV2ZW50PQotWEFueUV2ZW50X3NlcmlhbD0KLVhBbnlFdmVudF9zZW5kX2V2ZW50PQotWEFueUV2ZW50X2Rpc3BsYXk9Y2FzdD1EaXNwbGF5ICoKLVhBbnlFdmVudF93aW5kb3c9Y2FzdD1XaW5kb3cKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnQ9Ci1YQnV0dG9uRXZlbnRfcm9vdD0KLVhCdXR0b25FdmVudF9zdWJ3aW5kb3c9Ci1YQnV0dG9uRXZlbnRfdGltZT0KLVhCdXR0b25FdmVudF94PQotWEJ1dHRvbkV2ZW50X3k9Ci1YQnV0dG9uRXZlbnRfeF9yb290PQotWEJ1dHRvbkV2ZW50X3lfcm9vdD0KLVhCdXR0b25FdmVudF9zdGF0ZT0KLVhCdXR0b25FdmVudF9idXR0b249Ci1YQnV0dG9uRXZlbnRfc2FtZV9zY3JlZW49Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENsaWVudE1lc3NhZ2VFdmVudD0KLVhDbGllbnRNZXNzYWdlRXZlbnRfdHlwZT0KLVhDbGllbnRNZXNzYWdlRXZlbnRfc2VyaWFsPQotWENsaWVudE1lc3NhZ2VFdmVudF9zZW5kX2V2ZW50PQotWENsaWVudE1lc3NhZ2VFdmVudF9kaXNwbGF5PWNhc3Q9KERpc3BsYXkgKikKLVhDbGllbnRNZXNzYWdlRXZlbnRfd2luZG93PWNhc3Q9KFdpbmRvdykKLVhDbGllbnRNZXNzYWdlRXZlbnRfbWVzc2FnZV90eXBlPWNhc3Q9KEF0b20pCi1YQ2xpZW50TWVzc2FnZUV2ZW50X2Zvcm1hdD0KLVhDbGllbnRNZXNzYWdlRXZlbnRfZGF0YT1hY2Nlc3Nvcj1kYXRhLmwsY2FzdD0obG9uZyAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDcm9zc2luZ0V2ZW50PQotWENyb3NzaW5nRXZlbnRfcm9vdD1jYXN0PShXaW5kb3cpCi1YQ3Jvc3NpbmdFdmVudF9zdWJ3aW5kb3c9Y2FzdD0oV2luZG93KQotWENyb3NzaW5nRXZlbnRfdGltZT1jYXN0PVRpbWUKLVhDcm9zc2luZ0V2ZW50X3g9Ci1YQ3Jvc3NpbmdFdmVudF95PQotWENyb3NzaW5nRXZlbnRfeF9yb290PQotWENyb3NzaW5nRXZlbnRfeV9yb290PQotWENyb3NzaW5nRXZlbnRfbW9kZT0KLVhDcm9zc2luZ0V2ZW50X2RldGFpbD0KLVhDcm9zc2luZ0V2ZW50X3NhbWVfc2NyZWVuPWNhc3Q9Qm9vbAotWENyb3NzaW5nRXZlbnRfZm9jdXM9Y2FzdD1Cb29sCi1YQ3Jvc3NpbmdFdmVudF9zdGF0ZT1jYXN0PXVuc2lnbmVkIGludAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFdmVudD0KLVhFdmVudF90eXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudD0KLVhFeHBvc2VFdmVudF94PQotWEV4cG9zZUV2ZW50X3k9Ci1YRXhwb3NlRXZlbnRfd2lkdGg9Ci1YRXhwb3NlRXZlbnRfaGVpZ2h0PQotWEV4cG9zZUV2ZW50X2NvdW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50PQotWEZvY3VzQ2hhbmdlRXZlbnRfbW9kZT0KLVhGb2N1c0NoYW5nZUV2ZW50X2RldGFpbD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXM9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcmVwZWF0PQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX21hcD0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV94X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV95X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jbGlwX3hfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NsaXBfeV9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY2xpcF9tYXNrPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2dyYXBoaWNzX2V4cG9zdXJlcz0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19zdWJ3aW5kb3dfbW9kZT0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19wb2x5X2VkZ2U9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcG9seV9tb2RlPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2RpdGhlcj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jb21wb25lbnRfYWxwaGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFZpc2liaWxpdHlFdmVudD0KLVhWaXNpYmlsaXR5RXZlbnRfc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFdpbmRvd0NoYW5nZXM9Ci1YV2luZG93Q2hhbmdlc194PQotWFdpbmRvd0NoYW5nZXNfeT0KLVhXaW5kb3dDaGFuZ2VzX3dpZHRoPQotWFdpbmRvd0NoYW5nZXNfaGVpZ2h0PQotWFdpbmRvd0NoYW5nZXNfYm9yZGVyX3dpZHRoPQotWFdpbmRvd0NoYW5nZXNfc2libGluZz0KLVhXaW5kb3dDaGFuZ2VzX3N0YWNrX21vZGU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWNjNWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXNcblwKLSAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpIFZlcnNpb24gMi4xIHRoYXRcblwKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIChsZ3BsLXYyMS50eHQpLiAgVGhlIExHUEwgaXMgYWxzb1xuXAotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWwuICBJZiB0aGUgdmVyc2lvblxuXAotICogb2YgdGhlIExHUEwgYXQgaHR0cDovL3d3dy5nbnUub3JnIGlzIGRpZmZlcmVudCB0byB0aGUgdmVyc2lvbiBvZlxuXAotICogdGhlIExHUEwgYWNjb21wYW55aW5nIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCB0aGVyZSBpcyBhbnkgY29uZmxpY3RcblwKLSAqIGJldHdlZW4gdGhlIHR3byBsaWNlbnNlIHZlcnNpb25zLCB0aGUgdGVybXMgb2YgdGhlIExHUEwgYWNjb21wYW55aW5nXG5cCi0gKiB0aGlzIGRpc3RyaWJ1dGlvbiBzaGFsbCBnb3Zlcm4uXG5cCi0gKiBcblwKLSAqIENvbnRyaWJ1dG9yczpcblwKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cblwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi5PUy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI0ZmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuT1MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3NDEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX09TPQotT1NfQ09ERVNFVD1mbGFncz1jb25zdAotCi1PU19GRF9JU1NFVD0KLU9TX0ZEX0lTU0VUXzA9Ci1PU19GRF9JU1NFVF8xPWNhc3Q9KGZkX3NldCAqKQotCi1PU19GRF9TRVQ9Ci1PU19GRF9TRVRfMD0KLU9TX0ZEX1NFVF8xPWNhc3Q9KGZkX3NldCAqKQotCi1PU19GRF9aRVJPPQotT1NfRkRfWkVST18wPWNhc3Q9KGZkX3NldCAqKQotCi1PU19MQ19DVFlQRT1mbGFncz1jb25zdAotCi1PU19NQl9DVVJfTUFYPWZsYWdzPWNvbnN0Ci0KLU9TX01vbml0b3JFbnRlcj1mbGFncz1ub19nZW4KLU9TX01vbml0b3JFbnRlcl8wPQotCi1PU19Nb25pdG9yRXhpdD1mbGFncz1ub19nZW4KLU9TX01vbml0b3JFeGl0XzA9Ci0KLU9TX1hSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19zaXplb2Y9Ci0KLU9TX19DYWxsPQotT1NfX0NhbGxfMD0KLU9TX19DYWxsXzE9Ci1PU19fQ2FsbF8yPQotCi1PU19fQ29ubmVjdGlvbk51bWJlcj0KLU9TX19Db25uZWN0aW9uTnVtYmVyXzA9Ci0KLU9TX19YQWxsb2NDb2xvcj0KLU9TX19YQWxsb2NDb2xvcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQWxsb2NDb2xvcl8xPQotT1NfX1hBbGxvY0NvbG9yXzI9Ci0KLU9TX19YQmVsbD0KLU9TX19YQmVsbF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQmVsbF8xPQotCi1PU19fWEJsYWNrUGl4ZWw9Ci1PU19fWEJsYWNrUGl4ZWxfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEJsYWNrUGl4ZWxfMT0KLQotT1NfX1hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYj0KLU9TX19YQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWJfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiXzE9Ci1PU19fWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiXzI9Y2FzdD0oQ3Vyc29yKQotT1NfX1hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYl8zPWNhc3Q9KFRpbWUpCi0KLU9TX19YQ2hhbmdlUHJvcGVydHk9Ci1PU19fWENoYW5nZVByb3BlcnR5XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YQ2hhbmdlUHJvcGVydHlfMT1jYXN0PVdpbmRvdwotT1NfX1hDaGFuZ2VQcm9wZXJ0eV8yPWNhc3Q9QXRvbQotT1NfX1hDaGFuZ2VQcm9wZXJ0eV8zPWNhc3Q9QXRvbQotT1NfX1hDaGFuZ2VQcm9wZXJ0eV80PQotT1NfX1hDaGFuZ2VQcm9wZXJ0eV81PQotT1NfX1hDaGFuZ2VQcm9wZXJ0eV82PWNhc3Q9dW5zaWduZWQgY2hhciAqCi1PU19fWENoYW5nZVByb3BlcnR5Xzc9Ci0KLU9TX19YQ2hhbmdlV2luZG93QXR0cmlidXRlcz0KLU9TX19YQ2hhbmdlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hhbmdlV2luZG93QXR0cmlidXRlc18xPQotT1NfX1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzI9Ci1PU19fWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNfMz0KLQotT1NfX1hDaGVja0lmRXZlbnQ9Ci1PU19fWENoZWNrSWZFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hlY2tJZkV2ZW50XzE9Y2FzdD0oWEV2ZW50ICopCi1PU19fWENoZWNrSWZFdmVudF8yPWNhc3Q9KEJvb2wgKCopKCkpCi1PU19fWENoZWNrSWZFdmVudF8zPWNhc3Q9KFhQb2ludGVyKQotCi1PU19fWENoZWNrTWFza0V2ZW50PQotT1NfX1hDaGVja01hc2tFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hlY2tNYXNrRXZlbnRfMT0KLU9TX19YQ2hlY2tNYXNrRXZlbnRfMj1jYXN0PShYRXZlbnQgKikKLQotT1NfX1hDaGVja1dpbmRvd0V2ZW50PQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzE9Y2FzdD0oV2luZG93KQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzI9Ci1PU19fWENoZWNrV2luZG93RXZlbnRfMz1jYXN0PShYRXZlbnQgKikKLQotT1NfX1hDbGVhckFyZWE9Ci1PU19fWENsZWFyQXJlYV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2xlYXJBcmVhXzE9Ci1PU19fWENsZWFyQXJlYV8yPQotT1NfX1hDbGVhckFyZWFfMz0KLU9TX19YQ2xlYXJBcmVhXzQ9Ci1PU19fWENsZWFyQXJlYV81PQotT1NfX1hDbGVhckFyZWFfNj0KLQotT1NfX1hDbGlwQm94PQotT1NfX1hDbGlwQm94XzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hDbGlwQm94XzE9Y2FzdD0oWFJlY3RhbmdsZSAqKQotCi1PU19fWENsb3NlRGlzcGxheT0KLU9TX19YQ2xvc2VEaXNwbGF5XzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWENvcHlBcmVhPQotT1NfX1hDb3B5QXJlYV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ29weUFyZWFfMT0KLU9TX19YQ29weUFyZWFfMj0KLU9TX19YQ29weUFyZWFfMz1jYXN0PShHQykKLU9TX19YQ29weUFyZWFfND0KLU9TX19YQ29weUFyZWFfNT0KLU9TX19YQ29weUFyZWFfNj0KLU9TX19YQ29weUFyZWFfNz0KLU9TX19YQ29weUFyZWFfOD0KLU9TX19YQ29weUFyZWFfOT0KLQotT1NfX1hDb3B5UGxhbmU9Ci1PU19fWENvcHlQbGFuZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ29weVBsYW5lXzE9Ci1PU19fWENvcHlQbGFuZV8yPQotT1NfX1hDb3B5UGxhbmVfMz1jYXN0PShHQykKLU9TX19YQ29weVBsYW5lXzQ9Ci1PU19fWENvcHlQbGFuZV81PQotT1NfX1hDb3B5UGxhbmVfNj0KLU9TX19YQ29weVBsYW5lXzc9Ci1PU19fWENvcHlQbGFuZV84PQotT1NfX1hDb3B5UGxhbmVfOT0KLU9TX19YQ29weVBsYW5lXzEwPQotCi1PU19fWENyZWF0ZUJpdG1hcEZyb21EYXRhPQotT1NfX1hDcmVhdGVCaXRtYXBGcm9tRGF0YV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlQml0bWFwRnJvbURhdGFfMT0KLU9TX19YQ3JlYXRlQml0bWFwRnJvbURhdGFfMj1jYXN0PShjaGFyICopCi1PU19fWENyZWF0ZUJpdG1hcEZyb21EYXRhXzM9Ci1PU19fWENyZWF0ZUJpdG1hcEZyb21EYXRhXzQ9Ci0KLU9TX19YQ3JlYXRlQ29sb3JtYXA9Ci1PU19fWENyZWF0ZUNvbG9ybWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVDb2xvcm1hcF8xPWNhc3Q9KFdpbmRvdykKLU9TX19YQ3JlYXRlQ29sb3JtYXBfMj1jYXN0PShWaXN1YWwgKikKLU9TX19YQ3JlYXRlQ29sb3JtYXBfMz0KLQotT1NfX1hDcmVhdGVGb250Q3Vyc29yPQotT1NfX1hDcmVhdGVGb250Q3Vyc29yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVGb250Q3Vyc29yXzE9Ci0KLU9TX19YQ3JlYXRlR0M9Ci1PU19fWENyZWF0ZUdDXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVHQ18xPQotT1NfX1hDcmVhdGVHQ18yPQotT1NfX1hDcmVhdGVHQ18zPQotCi1PU19fWENyZWF0ZUltYWdlPQotT1NfX1hDcmVhdGVJbWFnZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlSW1hZ2VfMT1jYXN0PShWaXN1YWwgKikKLU9TX19YQ3JlYXRlSW1hZ2VfMj0KLU9TX19YQ3JlYXRlSW1hZ2VfMz0KLU9TX19YQ3JlYXRlSW1hZ2VfND0KLU9TX19YQ3JlYXRlSW1hZ2VfNT1jYXN0PShjaGFyICopCi1PU19fWENyZWF0ZUltYWdlXzY9Ci1PU19fWENyZWF0ZUltYWdlXzc9Ci1PU19fWENyZWF0ZUltYWdlXzg9Ci1PU19fWENyZWF0ZUltYWdlXzk9Ci0KLU9TX19YQ3JlYXRlUGl4bWFwPQotT1NfX1hDcmVhdGVQaXhtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZVBpeG1hcF8xPQotT1NfX1hDcmVhdGVQaXhtYXBfMj0KLU9TX19YQ3JlYXRlUGl4bWFwXzM9Ci1PU19fWENyZWF0ZVBpeG1hcF80PQotCi1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcj0KLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfMT1jYXN0PShQaXhtYXApCi1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl8yPWNhc3Q9KFBpeG1hcCkKLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzM9Ci1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl80PQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfNT0KLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzY9Ci0KLU9TX19YQ3JlYXRlUmVnaW9uPQotCi1PU19fWENyZWF0ZVdpbmRvdz0KLU9TX19YQ3JlYXRlV2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVXaW5kb3dfMT1jYXN0PShXaW5kb3cpCi1PU19fWENyZWF0ZVdpbmRvd18yPQotT1NfX1hDcmVhdGVXaW5kb3dfMz0KLU9TX19YQ3JlYXRlV2luZG93XzQ9Ci1PU19fWENyZWF0ZVdpbmRvd181PQotT1NfX1hDcmVhdGVXaW5kb3dfNj0KLU9TX19YQ3JlYXRlV2luZG93Xzc9Ci1PU19fWENyZWF0ZVdpbmRvd184PQotT1NfX1hDcmVhdGVXaW5kb3dfOT1jYXN0PShWaXN1YWwgKikKLU9TX19YQ3JlYXRlV2luZG93XzEwPQotT1NfX1hDcmVhdGVXaW5kb3dfMTE9Y2FzdD0oWFNldFdpbmRvd0F0dHJpYnV0ZXMgKikKLQotT1NfX1hEZWZhdWx0Q29sb3JtYXA9Ci1PU19fWERlZmF1bHRDb2xvcm1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGVmYXVsdENvbG9ybWFwXzE9Ci0KLU9TX19YRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW49Ci1PU19fWERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuXzA9Y2FzdD0oU2NyZWVuICopCi0KLU9TX19YRGVmYXVsdERlcHRoT2ZTY3JlZW49Ci1PU19fWERlZmF1bHREZXB0aE9mU2NyZWVuXzA9Y2FzdD0oU2NyZWVuICopCi0KLU9TX19YRGVmYXVsdEdDT2ZTY3JlZW49Ci1PU19fWERlZmF1bHRHQ09mU2NyZWVuXzA9Y2FzdD0oU2NyZWVuICopCi0KLU9TX19YRGVmYXVsdFJvb3RXaW5kb3c9Ci1PU19fWERlZmF1bHRSb290V2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWERlZmF1bHRTY3JlZW49Ci1PU19fWERlZmF1bHRTY3JlZW5fMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YRGVmYXVsdFNjcmVlbk9mRGlzcGxheT0KLU9TX19YRGVmYXVsdFNjcmVlbk9mRGlzcGxheV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hEZWZhdWx0VmlzdWFsPQotT1NfX1hEZWZhdWx0VmlzdWFsXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEZWZhdWx0VmlzdWFsXzE9Ci0KLU9TX19YRGVmaW5lQ3Vyc29yPQotT1NfX1hEZWZpbmVDdXJzb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERlZmluZUN1cnNvcl8xPQotT1NfX1hEZWZpbmVDdXJzb3JfMj0KLQotT1NfX1hEZXN0cm95SW1hZ2U9Ci1PU19fWERlc3Ryb3lJbWFnZV8wPWNhc3Q9KFhJbWFnZSAqKQotCi1PU19fWERlc3Ryb3lSZWdpb249Ci1PU19fWERlc3Ryb3lSZWdpb25fMD1jYXN0PShSZWdpb24pCi0KLU9TX19YRGVzdHJveVdpbmRvdz0KLU9TX19YRGVzdHJveVdpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGVzdHJveVdpbmRvd18xPWNhc3Q9KFdpbmRvdykKLQotT1NfX1hEaXNwbGF5SGVpZ2h0PQotT1NfX1hEaXNwbGF5SGVpZ2h0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEaXNwbGF5SGVpZ2h0XzE9Ci0KLU9TX19YRGlzcGxheUhlaWdodE1NPQotT1NfX1hEaXNwbGF5SGVpZ2h0TU1fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERpc3BsYXlIZWlnaHRNTV8xPQotCi1PU19fWERpc3BsYXlXaWR0aD0KLU9TX19YRGlzcGxheVdpZHRoXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEaXNwbGF5V2lkdGhfMT0KLQotT1NfX1hEaXNwbGF5V2lkdGhNTT0KLU9TX19YRGlzcGxheVdpZHRoTU1fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERpc3BsYXlXaWR0aE1NXzE9Ci0KLU9TX19YRHJhd0FyYz0KLU9TX19YRHJhd0FyY18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRHJhd0FyY18xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hEcmF3QXJjXzI9Y2FzdD0oR0MpCi1PU19fWERyYXdBcmNfMz0KLU9TX19YRHJhd0FyY180PQotT1NfX1hEcmF3QXJjXzU9Ci1PU19fWERyYXdBcmNfNj0KLU9TX19YRHJhd0FyY183PQotT1NfX1hEcmF3QXJjXzg9Ci0KLU9TX19YRHJhd0xpbmU9Ci1PU19fWERyYXdMaW5lXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEcmF3TGluZV8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hEcmF3TGluZV8yPWNhc3Q9KEdDKQotT1NfX1hEcmF3TGluZV8zPQotT1NfX1hEcmF3TGluZV80PQotT1NfX1hEcmF3TGluZV81PQotT1NfX1hEcmF3TGluZV82PQotCi1PU19fWERyYXdMaW5lcz0KLU9TX19YRHJhd0xpbmVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEcmF3TGluZXNfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRHJhd0xpbmVzXzI9Y2FzdD0oR0MpCi1PU19fWERyYXdMaW5lc18zPWNhc3Q9KFhQb2ludCAqKQotT1NfX1hEcmF3TGluZXNfND0KLU9TX19YRHJhd0xpbmVzXzU9Ci0KLU9TX19YRHJhd1BvaW50PQotT1NfX1hEcmF3UG9pbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERyYXdQb2ludF8xPWNhc3Q9RHJhd2FibGUKLU9TX19YRHJhd1BvaW50XzI9Y2FzdD1HQwotT1NfX1hEcmF3UG9pbnRfMz0KLU9TX19YRHJhd1BvaW50XzQ9Ci0KLU9TX19YRHJhd1JlY3RhbmdsZT0KLU9TX19YRHJhd1JlY3RhbmdsZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRHJhd1JlY3RhbmdsZV8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hEcmF3UmVjdGFuZ2xlXzI9Y2FzdD0oR0MpCi1PU19fWERyYXdSZWN0YW5nbGVfMz0KLU9TX19YRHJhd1JlY3RhbmdsZV80PQotT1NfX1hEcmF3UmVjdGFuZ2xlXzU9Ci1PU19fWERyYXdSZWN0YW5nbGVfNj0KLQotT1NfX1hFbXB0eVJlZ2lvbj0KLU9TX19YRW1wdHlSZWdpb25fMD1jYXN0PShSZWdpb24pCi0KLU9TX19YRXZlbnRzUXVldWVkPQotT1NfX1hFdmVudHNRdWV1ZWRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEV2ZW50c1F1ZXVlZF8xPQotCi1PU19fWEZpbGxBcmM9Ci1PU19fWEZpbGxBcmNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZpbGxBcmNfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRmlsbEFyY18yPWNhc3Q9KEdDKQotT1NfX1hGaWxsQXJjXzM9Ci1PU19fWEZpbGxBcmNfND0KLU9TX19YRmlsbEFyY181PQotT1NfX1hGaWxsQXJjXzY9Ci1PU19fWEZpbGxBcmNfNz0KLU9TX19YRmlsbEFyY184PQotCi1PU19fWEZpbGxQb2x5Z29uPQotT1NfX1hGaWxsUG9seWdvbl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRmlsbFBvbHlnb25fMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRmlsbFBvbHlnb25fMj1jYXN0PShHQykKLU9TX19YRmlsbFBvbHlnb25fMz1jYXN0PShYUG9pbnQgKikKLU9TX19YRmlsbFBvbHlnb25fND0KLU9TX19YRmlsbFBvbHlnb25fNT0KLU9TX19YRmlsbFBvbHlnb25fNj0KLQotT1NfX1hGaWxsUmVjdGFuZ2xlPQotT1NfX1hGaWxsUmVjdGFuZ2xlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGaWxsUmVjdGFuZ2xlXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWEZpbGxSZWN0YW5nbGVfMj1jYXN0PShHQykKLU9TX19YRmlsbFJlY3RhbmdsZV8zPQotT1NfX1hGaWxsUmVjdGFuZ2xlXzQ9Ci1PU19fWEZpbGxSZWN0YW5nbGVfNT0KLU9TX19YRmlsbFJlY3RhbmdsZV82PQotCi1PU19fWEZpbHRlckV2ZW50PQotT1NfX1hGaWx0ZXJFdmVudF8wPWNhc3Q9KFhFdmVudCAqKQotT1NfX1hGaWx0ZXJFdmVudF8xPWNhc3Q9KFdpbmRvdykKLQotT1NfX1hGbHVzaD0KLU9TX19YRmx1c2hfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YRm9udHNPZkZvbnRTZXQ9Ci1PU19fWEZvbnRzT2ZGb250U2V0XzA9Y2FzdD0oWEZvbnRTZXQpCi1PU19fWEZvbnRzT2ZGb250U2V0XzE9Y2FzdD0oWEZvbnRTdHJ1Y3QgKioqKQotT1NfX1hGb250c09mRm9udFNldF8yPWNhc3Q9KGNoYXIgKioqKQotCi1PU19fWEZyZWU9Ci1PU19fWEZyZWVfMD1jYXN0PShjaGFyICopCi0KLU9TX19YRnJlZUNvbG9ybWFwPQotT1NfX1hGcmVlQ29sb3JtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZyZWVDb2xvcm1hcF8xPWNhc3Q9KENvbG9ybWFwKQotCi1PU19fWEZyZWVDb2xvcnM9Ci1PU19fWEZyZWVDb2xvcnNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZyZWVDb2xvcnNfMT0KLU9TX19YRnJlZUNvbG9yc18yPWNhc3Q9KHVuc2lnbmVkIGxvbmcgKikKLU9TX19YRnJlZUNvbG9yc18zPQotT1NfX1hGcmVlQ29sb3JzXzQ9Ci0KLU9TX19YRnJlZUN1cnNvcj0KLU9TX19YRnJlZUN1cnNvcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZUN1cnNvcl8xPWNhc3Q9KEN1cnNvcikKLQotT1NfX1hGcmVlRm9udD0KLU9TX19YRnJlZUZvbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZyZWVGb250XzE9Y2FzdD0oWEZvbnRTdHJ1Y3QgKikKLQotT1NfX1hGcmVlRm9udE5hbWVzPQotT1NfX1hGcmVlRm9udE5hbWVzXzA9Y2FzdD0oY2hhciAqKikKLQotT1NfX1hGcmVlR0M9Ci1PU19fWEZyZWVHQ18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZUdDXzE9Y2FzdD0oR0MpCi0KLU9TX19YRnJlZU1vZGlmaWVybWFwPQotT1NfX1hGcmVlTW9kaWZpZXJtYXBfMD1jYXN0PShYTW9kaWZpZXJLZXltYXAgKikKLQotT1NfX1hGcmVlUGl4bWFwPQotT1NfX1hGcmVlUGl4bWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGcmVlUGl4bWFwXzE9Y2FzdD0oUGl4bWFwKQotCi1PU19fWEZyZWVTdHJpbmdMaXN0PQotT1NfX1hGcmVlU3RyaW5nTGlzdF8wPWNhc3Q9KGNoYXIgKiopCi0KLU9TX19YR2V0R0NWYWx1ZXM9Ci1PU19fWEdldEdDVmFsdWVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHZXRHQ1ZhbHVlc18xPWNhc3Q9KEdDKQotT1NfX1hHZXRHQ1ZhbHVlc18yPQotT1NfX1hHZXRHQ1ZhbHVlc18zPQotCi1PU19fWEdldEdlb21ldHJ5PQotT1NfX1hHZXRHZW9tZXRyeV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0R2VvbWV0cnlfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YR2V0R2VvbWV0cnlfMj1jYXN0PShXaW5kb3cgKikKLU9TX19YR2V0R2VvbWV0cnlfMz1jYXN0PShpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfND1jYXN0PShpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfNT1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfNj1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfNz1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfOD1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLQotT1NfX1hHZXRJY29uU2l6ZXM9Ci1PU19fWEdldEljb25TaXplc18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEdldEljb25TaXplc18xPWNhc3Q9V2luZG93Ci1PU19fWEdldEljb25TaXplc18yPWNhc3Q9WEljb25TaXplICoqCi1PU19fWEdldEljb25TaXplc18zPWNhc3Q9aW50ICoKLQotT1NfX1hHZXRJbWFnZT0KLU9TX19YR2V0SW1hZ2VfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEdldEltYWdlXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWEdldEltYWdlXzI9Ci1PU19fWEdldEltYWdlXzM9Ci1PU19fWEdldEltYWdlXzQ9Ci1PU19fWEdldEltYWdlXzU9Ci1PU19fWEdldEltYWdlXzY9Ci1PU19fWEdldEltYWdlXzc9Ci0KLU9TX19YR2V0SW5wdXRGb2N1cz0KLU9TX19YR2V0SW5wdXRGb2N1c18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0SW5wdXRGb2N1c18xPWNhc3Q9KFdpbmRvdyAqKQotT1NfX1hHZXRJbnB1dEZvY3VzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19YR2V0TW9kaWZpZXJNYXBwaW5nPQotT1NfX1hHZXRNb2RpZmllck1hcHBpbmdfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YR2V0V2luZG93QXR0cmlidXRlcz0KLU9TX19YR2V0V2luZG93QXR0cmlidXRlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0V2luZG93QXR0cmlidXRlc18xPQotT1NfX1hHZXRXaW5kb3dBdHRyaWJ1dGVzXzI9Ci0KLU9TX19YR2V0V2luZG93UHJvcGVydHk9Ci1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YR2V0V2luZG93UHJvcGVydHlfMT1jYXN0PVdpbmRvdwotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8yPWNhc3Q9QXRvbQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8zPQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV80PQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV81PWNhc3Q9Qm9vbAotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV82PWNhc3Q9QXRvbQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV83PWNhc3Q9QXRvbSAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5Xzg9Y2FzdD1pbnQgKgotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV85PWNhc3Q9dW5zaWduZWQgbG9uZyAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzEwPWNhc3Q9dW5zaWduZWQgbG9uZyAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzExPWNhc3Q9dW5zaWduZWQgY2hhciAqKgotCi1PU19fWEdyYWJLZXlib2FyZD0KLU9TX19YR3JhYktleWJvYXJkXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHcmFiS2V5Ym9hcmRfMT0KLU9TX19YR3JhYktleWJvYXJkXzI9Ci1PU19fWEdyYWJLZXlib2FyZF8zPQotT1NfX1hHcmFiS2V5Ym9hcmRfND0KLU9TX19YR3JhYktleWJvYXJkXzU9Ci0KLU9TX19YR3JhYlBvaW50ZXI9Ci1PU19fWEdyYWJQb2ludGVyXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHcmFiUG9pbnRlcl8xPQotT1NfX1hHcmFiUG9pbnRlcl8yPQotT1NfX1hHcmFiUG9pbnRlcl8zPQotT1NfX1hHcmFiUG9pbnRlcl80PQotT1NfX1hHcmFiUG9pbnRlcl81PQotT1NfX1hHcmFiUG9pbnRlcl82PQotT1NfX1hHcmFiUG9pbnRlcl83PQotT1NfX1hHcmFiUG9pbnRlcl84PQotCi1PU19fWEluaXRUaHJlYWRzPQotCi1PU19fWEludGVybkF0b209Ci1PU19fWEludGVybkF0b21fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEludGVybkF0b21fMT1jYXN0PShjaGFyICopCi1PU19fWEludGVybkF0b21fMj0KLQotT1NfX1hJbnRlcnNlY3RSZWdpb249Ci1PU19fWEludGVyc2VjdFJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLU9TX19YSW50ZXJzZWN0UmVnaW9uXzE9Y2FzdD0oUmVnaW9uKQotT1NfX1hJbnRlcnNlY3RSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YS2V5c3ltVG9LZXljb2RlPQotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEtleXN5bVRvS2V5Y29kZV8xPWNhc3Q9KEtleVN5bSkKLQotT1NfX1hLZXlzeW1Ub1N0cmluZz0KLU9TX19YS2V5c3ltVG9TdHJpbmdfMD0KLQotT1NfX1hMaXN0Rm9udHM9Ci1PU19fWExpc3RGb250c18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YTGlzdEZvbnRzXzE9Y2FzdD0oY2hhciAqKQotT1NfX1hMaXN0Rm9udHNfMj0KLU9TX19YTGlzdEZvbnRzXzM9Y2FzdD0oaW50ICopCi0KLU9TX19YTGlzdFByb3BlcnRpZXM9Ci1PU19fWExpc3RQcm9wZXJ0aWVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hMaXN0UHJvcGVydGllc18xPWNhc3Q9KFdpbmRvdykKLU9TX19YTGlzdFByb3BlcnRpZXNfMj1jYXN0PShpbnQgKikKLQotT1NfX1hMb2NhbGVPZkZvbnRTZXQ9Ci1PU19fWExvY2FsZU9mRm9udFNldF8wPWNhc3Q9KFhGb250U2V0KQotCi1PU19fWExvb2t1cFN0cmluZz0KLU9TX19YTG9va3VwU3RyaW5nXzA9Y2FzdD0oWEtleUV2ZW50ICopCi1PU19fWExvb2t1cFN0cmluZ18xPWNhc3Q9KGNoYXIgKikKLU9TX19YTG9va3VwU3RyaW5nXzI9Ci1PU19fWExvb2t1cFN0cmluZ18zPWNhc3Q9KEtleVN5bSAqKQotT1NfX1hMb29rdXBTdHJpbmdfND1jYXN0PShYQ29tcG9zZVN0YXR1cyAqKQotCi1PU19fWExvd2VyV2luZG93PQotT1NfX1hMb3dlcldpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YTG93ZXJXaW5kb3dfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YTWFwV2luZG93PQotT1NfX1hNYXBXaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hNYXBXaW5kb3dfMT1jYXN0PVdpbmRvdwotCi1PU19fWE1vdmVSZXNpemVXaW5kb3c9Ci1PU19fWE1vdmVSZXNpemVXaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hNb3ZlUmVzaXplV2luZG93XzE9Y2FzdD1XaW5kb3cKLU9TX19YTW92ZVJlc2l6ZVdpbmRvd18yPQotT1NfX1hNb3ZlUmVzaXplV2luZG93XzM9Ci1PU19fWE1vdmVSZXNpemVXaW5kb3dfND0KLU9TX19YTW92ZVJlc2l6ZVdpbmRvd181PQotCi1PU19fWE9mZnNldFJlZ2lvbj0KLU9TX19YT2Zmc2V0UmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hPZmZzZXRSZWdpb25fMT0KLU9TX19YT2Zmc2V0UmVnaW9uXzI9Ci0KLU9TX19YT3BlbkRpc3BsYXk9Ci1PU19fWE9wZW5EaXNwbGF5XzA9Y2FzdD0oY2hhciAqKQotCi1PU19fWFBvaW50SW5SZWdpb249Ci1PU19fWFBvaW50SW5SZWdpb25fMD1jYXN0PShSZWdpb24pCi1PU19fWFBvaW50SW5SZWdpb25fMT0KLU9TX19YUG9pbnRJblJlZ2lvbl8yPQotCi1PU19fWFBvbHlnb25SZWdpb249Ci1PU19fWFBvbHlnb25SZWdpb25fMD1jYXN0PShYUG9pbnQgKikKLU9TX19YUG9seWdvblJlZ2lvbl8xPQotT1NfX1hQb2x5Z29uUmVnaW9uXzI9Ci0KLU9TX19YUHV0SW1hZ2U9Ci1PU19fWFB1dEltYWdlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hQdXRJbWFnZV8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hQdXRJbWFnZV8yPWNhc3Q9KEdDKQotT1NfX1hQdXRJbWFnZV8zPWNhc3Q9KFhJbWFnZSAqKQotT1NfX1hQdXRJbWFnZV80PQotT1NfX1hQdXRJbWFnZV81PQotT1NfX1hQdXRJbWFnZV82PQotT1NfX1hQdXRJbWFnZV83PQotT1NfX1hQdXRJbWFnZV84PQotT1NfX1hQdXRJbWFnZV85PQotCi1PU19fWFF1ZXJ5QmVzdEN1cnNvcj0KLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzE9Ci1PU19fWFF1ZXJ5QmVzdEN1cnNvcl8yPQotT1NfX1hRdWVyeUJlc3RDdXJzb3JfMz0KLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzQ9Y2FzdD0odW5zaWduZWQgaW50ICopCi1PU19fWFF1ZXJ5QmVzdEN1cnNvcl81PWNhc3Q9KHVuc2lnbmVkIGludCAqKQotCi1PU19fWFF1ZXJ5Q29sb3I9Ci1PU19fWFF1ZXJ5Q29sb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFF1ZXJ5Q29sb3JfMT0KLU9TX19YUXVlcnlDb2xvcl8yPQotCi1PU19fWFF1ZXJ5UG9pbnRlcj0KLU9TX19YUXVlcnlQb2ludGVyXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hRdWVyeVBvaW50ZXJfMT1jYXN0PShXaW5kb3cpCi1PU19fWFF1ZXJ5UG9pbnRlcl8yPWNhc3Q9KFdpbmRvdyAqKQotT1NfX1hRdWVyeVBvaW50ZXJfMz1jYXN0PShXaW5kb3cgKikKLU9TX19YUXVlcnlQb2ludGVyXzQ9Y2FzdD0oaW50ICopCi1PU19fWFF1ZXJ5UG9pbnRlcl81PWNhc3Q9KGludCAqKQotT1NfX1hRdWVyeVBvaW50ZXJfNj1jYXN0PShpbnQgKikKLU9TX19YUXVlcnlQb2ludGVyXzc9Y2FzdD0oaW50ICopCi1PU19fWFF1ZXJ5UG9pbnRlcl84PWNhc3Q9KHVuc2lnbmVkIGludCAqKQotCi1PU19fWFF1ZXJ5VHJlZT0KLU9TX19YUXVlcnlUcmVlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hRdWVyeVRyZWVfMT1jYXN0PShXaW5kb3cpCi1PU19fWFF1ZXJ5VHJlZV8yPWNhc3Q9KFdpbmRvdyAqKQotT1NfX1hRdWVyeVRyZWVfMz1jYXN0PShXaW5kb3cgKikKLU9TX19YUXVlcnlUcmVlXzQ9Y2FzdD0oV2luZG93ICoqKQotT1NfX1hRdWVyeVRyZWVfNT1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLQotT1NfX1hSYWlzZVdpbmRvdz0KLU9TX19YUmFpc2VXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFJhaXNlV2luZG93XzE9Y2FzdD0oV2luZG93KQotCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3c9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMT1jYXN0PShXaW5kb3cpCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMj0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd18zPQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzQ9Ci0KLU9TX19YUmVjdEluUmVnaW9uPQotT1NfX1hSZWN0SW5SZWdpb25fMD1jYXN0PShSZWdpb24pCi1PU19fWFJlY3RJblJlZ2lvbl8xPQotT1NfX1hSZWN0SW5SZWdpb25fMj0KLU9TX19YUmVjdEluUmVnaW9uXzM9Ci1PU19fWFJlY3RJblJlZ2lvbl80PQotCi1PU19fWFJlbmRlckNvbXBvc2l0ZT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckNvbXBvc2l0ZV8wPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzI9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8zPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfND0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzU9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV82PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfNz0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzg9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV85PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMTA9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzEyPQotCi1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmU9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzA9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMT0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8yPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzM9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfND0KLQotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFN0YW5kYXJkRm9ybWF0XzE9Ci0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdD1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckZpbmRWaXN1YWxGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdF8xPQotCi1PU19fWFJlbmRlckZyZWVQaWN0dXJlPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMD0KLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMT0KLQotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbj1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzA9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzE9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzI9Ci0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzA9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18xPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMj0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzM9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc180PQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfNT0KLQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlZ2lvbj1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVnaW9uXzA9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVnaW9uXzE9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVnaW9uXzI9Ci0KLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm1fMD0KLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybV8xPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtXzI9Ci0KLU9TX19YUmVwYXJlbnRXaW5kb3c9Ci1PU19fWFJlcGFyZW50V2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hSZXBhcmVudFdpbmRvd18xPWNhc3Q9KFdpbmRvdykKLU9TX19YUmVwYXJlbnRXaW5kb3dfMj1jYXN0PShXaW5kb3cpCi1PU19fWFJlcGFyZW50V2luZG93XzM9Ci1PU19fWFJlcGFyZW50V2luZG93XzQ9Ci0KLU9TX19YUmVzaXplV2luZG93PQotT1NfX1hSZXNpemVXaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hSZXNpemVXaW5kb3dfMT1jYXN0PVdpbmRvdwotT1NfX1hSZXNpemVXaW5kb3dfMj0KLU9TX19YUmVzaXplV2luZG93XzM9Ci0KLU9TX19YUm9vdFdpbmRvd09mU2NyZWVuPQotT1NfX1hSb290V2luZG93T2ZTY3JlZW5fMD1jYXN0PShTY3JlZW4gKikKLQotT1NfX1hTZWxlY3RJbnB1dD0KLU9TX19YU2VsZWN0SW5wdXRfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTZWxlY3RJbnB1dF8xPWNhc3Q9V2luZG93Ci1PU19fWFNlbGVjdElucHV0XzI9Ci0KLU9TX19YU2VuZEV2ZW50PQotT1NfX1hTZW5kRXZlbnRfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTZW5kRXZlbnRfMT1jYXN0PVdpbmRvdwotT1NfX1hTZW5kRXZlbnRfMj1jYXN0PUJvb2wKLU9TX19YU2VuZEV2ZW50XzM9Y2FzdD1sb25nCi1PU19fWFNlbmRFdmVudF80PWNhc3Q9WEV2ZW50ICoKLQotT1NfX1hTZXRCYWNrZ3JvdW5kPQotT1NfX1hTZXRCYWNrZ3JvdW5kXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRCYWNrZ3JvdW5kXzE9Y2FzdD0oR0MpCi1PU19fWFNldEJhY2tncm91bmRfMj0KLQotT1NfX1hTZXRDbGlwTWFzaz0KLU9TX19YU2V0Q2xpcE1hc2tfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldENsaXBNYXNrXzE9Y2FzdD0oR0MpCi1PU19fWFNldENsaXBNYXNrXzI9Y2FzdD0oUGl4bWFwKQotCi1PU19fWFNldENsaXBSZWN0YW5nbGVzPQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfMT1jYXN0PShHQykKLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfMj0KLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfMz0KLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfND1jYXN0PShYUmVjdGFuZ2xlICopCi1PU19fWFNldENsaXBSZWN0YW5nbGVzXzU9Ci1PU19fWFNldENsaXBSZWN0YW5nbGVzXzY9Ci0KLU9TX19YU2V0RGFzaGVzPQotT1NfX1hTZXREYXNoZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldERhc2hlc18xPWNhc3Q9KEdDKQotT1NfX1hTZXREYXNoZXNfMj0KLU9TX19YU2V0RGFzaGVzXzM9Y2FzdD0oY2hhciAqKQotT1NfX1hTZXREYXNoZXNfND0KLQotT1NfX1hTZXRFcnJvckhhbmRsZXI9Ci1PU19fWFNldEVycm9ySGFuZGxlcl8wPWNhc3Q9KFhFcnJvckhhbmRsZXIpCi0KLU9TX19YU2V0RmlsbFJ1bGU9Ci1PU19fWFNldEZpbGxSdWxlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRGaWxsUnVsZV8xPWNhc3Q9KEdDKQotT1NfX1hTZXRGaWxsUnVsZV8yPQotCi1PU19fWFNldEZpbGxTdHlsZT0KLU9TX19YU2V0RmlsbFN0eWxlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRGaWxsU3R5bGVfMT1jYXN0PShHQykKLU9TX19YU2V0RmlsbFN0eWxlXzI9Ci0KLU9TX19YU2V0Rm9yZWdyb3VuZD0KLU9TX19YU2V0Rm9yZWdyb3VuZF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0Rm9yZWdyb3VuZF8xPWNhc3Q9KEdDKQotT1NfX1hTZXRGb3JlZ3JvdW5kXzI9Ci0KLU9TX19YU2V0RnVuY3Rpb249Ci1PU19fWFNldEZ1bmN0aW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRGdW5jdGlvbl8xPWNhc3Q9KEdDKQotT1NfX1hTZXRGdW5jdGlvbl8yPQotCi1PU19fWFNldEdyYXBoaWNzRXhwb3N1cmVzPQotT1NfX1hTZXRHcmFwaGljc0V4cG9zdXJlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0R3JhcGhpY3NFeHBvc3VyZXNfMT1jYXN0PShHQykKLU9TX19YU2V0R3JhcGhpY3NFeHBvc3VyZXNfMj1jYXN0PShCb29sKQotCi1PU19fWFNldElPRXJyb3JIYW5kbGVyPQotT1NfX1hTZXRJT0Vycm9ySGFuZGxlcl8wPWNhc3Q9KFhJT0Vycm9ySGFuZGxlcikKLQotT1NfX1hTZXRJbnB1dEZvY3VzPQotT1NfX1hTZXRJbnB1dEZvY3VzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRJbnB1dEZvY3VzXzE9Y2FzdD0oV2luZG93KQotT1NfX1hTZXRJbnB1dEZvY3VzXzI9Ci1PU19fWFNldElucHV0Rm9jdXNfMz0KLQotT1NfX1hTZXRMaW5lQXR0cmlidXRlcz0KLU9TX19YU2V0TGluZUF0dHJpYnV0ZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzE9Y2FzdD0oR0MpCi1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzI9Ci1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzM9Ci1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzQ9Ci1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzU9Ci0KLU9TX19YU2V0UmVnaW9uPQotT1NfX1hTZXRSZWdpb25fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldFJlZ2lvbl8xPWNhc3Q9KEdDKQotT1NfX1hTZXRSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YU2V0U3RpcHBsZT0KLU9TX19YU2V0U3RpcHBsZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0U3RpcHBsZV8xPWNhc3Q9KEdDKQotT1NfX1hTZXRTdGlwcGxlXzI9Y2FzdD0oUGl4bWFwKQotCi1PU19fWFNldFN1YndpbmRvd01vZGU9Ci1PU19fWFNldFN1YndpbmRvd01vZGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldFN1YndpbmRvd01vZGVfMT1jYXN0PShHQykKLU9TX19YU2V0U3Vid2luZG93TW9kZV8yPQotCi1PU19fWFNldFdNTm9ybWFsSGludHM9Ci1PU19fWFNldFdNTm9ybWFsSGludHNfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTZXRXTU5vcm1hbEhpbnRzXzE9Y2FzdD1XaW5kb3cKLU9TX19YU2V0V01Ob3JtYWxIaW50c18yPQotCi1PU19fWFNoYXBlQ29tYmluZU1hc2s9Ci1PU19fWFNoYXBlQ29tYmluZU1hc2tfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzE9Y2FzdD0oV2luZG93KQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzI9Ci1PU19fWFNoYXBlQ29tYmluZU1hc2tfMz0KLU9TX19YU2hhcGVDb21iaW5lTWFza180PQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzU9Y2FzdD1QaXhtYXAKLU9TX19YU2hhcGVDb21iaW5lTWFza182PQotCi1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbj0KLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb25fMT1jYXN0PShXaW5kb3cpCi1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl8yPQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb25fMz0KLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzQ9Ci1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl81PWNhc3Q9KFJlZ2lvbikKLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzY9Ci0KLU9TX19YU3VidHJhY3RSZWdpb249Ci1PU19fWFN1YnRyYWN0UmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hTdWJ0cmFjdFJlZ2lvbl8xPWNhc3Q9KFJlZ2lvbikKLU9TX19YU3VidHJhY3RSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YU3luYz0KLU9TX19YU3luY18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU3luY18xPWNhc3Q9KEJvb2wpCi0KLU9TX19YU3luY2hyb25pemU9Ci1PU19fWFN5bmNocm9uaXplXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTeW5jaHJvbml6ZV8xPWNhc3Q9KEJvb2wpCi0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudD0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUJ1dHRvbkV2ZW50XzM9Y2FzdD11bnNpZ25lZCBsb25nCi0KLU9TX19YVGVzdEZha2VLZXlFdmVudD0KLU9TX19YVGVzdEZha2VLZXlFdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMT0KLU9TX19YVGVzdEZha2VLZXlFdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzM9Y2FzdD11bnNpZ25lZCBsb25nCi0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudD0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8yPQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzM9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfND1jYXN0PXVuc2lnbmVkIGxvbmcKLQotT1NfX1hUcmFuc2xhdGVDb29yZGluYXRlcz0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hUcmFuc2xhdGVDb29yZGluYXRlc18xPWNhc3Q9V2luZG93Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzI9Y2FzdD1XaW5kb3cKLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfMz0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfND0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfNT0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfNj0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfNz1jYXN0PVdpbmRvdyAqCi0KLU9TX19YVW5kZWZpbmVDdXJzb3I9Ci1PU19fWFVuZGVmaW5lQ3Vyc29yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hVbmRlZmluZUN1cnNvcl8xPWNhc3Q9KFdpbmRvdykKLQotT1NfX1hVbmdyYWJLZXlib2FyZD0KLU9TX19YVW5ncmFiS2V5Ym9hcmRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFVuZ3JhYktleWJvYXJkXzE9Ci0KLU9TX19YVW5ncmFiUG9pbnRlcj0KLU9TX19YVW5ncmFiUG9pbnRlcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YVW5ncmFiUG9pbnRlcl8xPQotCi1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb249Ci1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb25fMD1jYXN0PShYUmVjdGFuZ2xlICopCi1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb25fMT1jYXN0PShSZWdpb24pCi1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YVW5pb25SZWdpb249Ci1PU19fWFVuaW9uUmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hVbmlvblJlZ2lvbl8xPWNhc3Q9KFJlZ2lvbikKLU9TX19YVW5pb25SZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YVW5tYXBXaW5kb3c9Ci1PU19fWFVubWFwV2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVW5tYXBXaW5kb3dfMT1jYXN0PVdpbmRvdwotCi1PU19fWFdhcnBQb2ludGVyPQotT1NfX1hXYXJwUG9pbnRlcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YV2FycFBvaW50ZXJfMT0KLU9TX19YV2FycFBvaW50ZXJfMj0KLU9TX19YV2FycFBvaW50ZXJfMz0KLU9TX19YV2FycFBvaW50ZXJfND0KLU9TX19YV2FycFBvaW50ZXJfNT0KLU9TX19YV2FycFBvaW50ZXJfNj0KLU9TX19YV2FycFBvaW50ZXJfNz0KLU9TX19YV2FycFBvaW50ZXJfOD0KLQotT1NfX1hXaGl0ZVBpeGVsPQotT1NfX1hXaGl0ZVBpeGVsXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hXaGl0ZVBpeGVsXzE9Ci0KLU9TX19YV2l0aGRyYXdXaW5kb3c9Ci1PU19fWFdpdGhkcmF3V2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hXaXRoZHJhd1dpbmRvd18xPWNhc3Q9KFdpbmRvdykKLU9TX19YV2l0aGRyYXdXaW5kb3dfMj0KLQotT1NfX1hpbmVyYW1hSXNBY3RpdmU9Ci1PU19fWGluZXJhbWFJc0FjdGl2ZV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hpbmVyYW1hUXVlcnlTY3JlZW5zPQotT1NfX1hpbmVyYW1hUXVlcnlTY3JlZW5zXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hpbmVyYW1hUXVlcnlTY3JlZW5zXzE9Ci0KLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFjaz0KLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFja18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFja18xPWNhc3Q9KEF0b20pCi1PU19fWG1BZGRXTVByb3RvY29sQ2FsbGJhY2tfMj1jYXN0PShYdENhbGxiYWNrUHJvYykKLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFja18zPWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1htQ2hhbmdlQ29sb3I9Ci1PU19fWG1DaGFuZ2VDb2xvcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNoYW5nZUNvbG9yXzE9Ci0KLU9TX19YbUNsaXBib2FyZENvcHk9Ci1PU19fWG1DbGlwYm9hcmRDb3B5XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkQ29weV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZENvcHlfMj0KLU9TX19YbUNsaXBib2FyZENvcHlfMz1jYXN0PShjaGFyICopCi1PU19fWG1DbGlwYm9hcmRDb3B5XzQ9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkQ29weV81PQotT1NfX1htQ2xpcGJvYXJkQ29weV82PQotT1NfX1htQ2xpcGJvYXJkQ29weV83PWNhc3Q9KHZvaWQgKikKLQotT1NfX1htQ2xpcGJvYXJkRW5kQ29weT0KLU9TX19YbUNsaXBib2FyZEVuZENvcHlfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRFbmRDb3B5XzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkRW5kQ29weV8yPQotCi1PU19fWG1DbGlwYm9hcmRFbmRSZXRyaWV2ZT0KLU9TX19YbUNsaXBib2FyZEVuZFJldHJpZXZlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkRW5kUmV0cmlldmVfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudD0KLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8yPWNhc3Q9KGludCAqKQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUNvdW50XzM9Y2FzdD0odW5zaWduZWQgbG9uZyAqKQotCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0PQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVGb3JtYXRfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0XzI9Ci1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0XzM9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF80PQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF81PWNhc3Q9KHVuc2lnbmVkIGxvbmcgKikKLQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUxlbmd0aD0KLU9TX19YbUNsaXBib2FyZElucXVpcmVMZW5ndGhfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlTGVuZ3RoXzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUxlbmd0aF8yPWNhc3Q9KGNoYXIgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVMZW5ndGhfMz1jYXN0PSh1bnNpZ25lZCBsb25nICopCi0KLU9TX19YbUNsaXBib2FyZFJldHJpZXZlPQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZFJldHJpZXZlXzI9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfMz1jYXN0PShjaGFyICopCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV80PQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfNT1jYXN0PSh1bnNpZ25lZCBsb25nICopCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV82PWNhc3Q9KGxvbmcgKikKLQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5PQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzI9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1DbGlwYm9hcmRTdGFydENvcHlfMz0KLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV80PWNhc3Q9KFdpZGdldCkKLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV81PWNhc3Q9KFhtQ3V0UGFzdGVQcm9jKQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzY9Y2FzdD0obG9uZyAqKQotCi1PU19fWG1DbGlwYm9hcmRTdGFydFJldHJpZXZlPQotT1NfX1htQ2xpcGJvYXJkU3RhcnRSZXRyaWV2ZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZFN0YXJ0UmV0cmlldmVfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRTdGFydFJldHJpZXZlXzI9Ci0KLU9TX19YbUNvbWJvQm94QWRkSXRlbT0KLU9TX19YbUNvbWJvQm94QWRkSXRlbV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNvbWJvQm94QWRkSXRlbV8xPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htQ29tYm9Cb3hBZGRJdGVtXzI9Ci1PU19fWG1Db21ib0JveEFkZEl0ZW1fMz0KLQotT1NfX1htQ29tYm9Cb3hEZWxldGVQb3M9Ci1PU19fWG1Db21ib0JveERlbGV0ZVBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNvbWJvQm94RGVsZXRlUG9zXzE9Ci0KLU9TX19YbUNvbWJvQm94U2VsZWN0SXRlbT0KLU9TX19YbUNvbWJvQm94U2VsZWN0SXRlbV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNvbWJvQm94U2VsZWN0SXRlbV8xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbj0KLU9TX19YbUNyZWF0ZUFycm93QnV0dG9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlQXJyb3dCdXR0b25fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbl8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbl8zPQotCi1PU19fWG1DcmVhdGVDYXNjYWRlQnV0dG9uR2FkZ2V0PQotT1NfX1htQ3JlYXRlQ2FzY2FkZUJ1dHRvbkdhZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUNhc2NhZGVCdXR0b25HYWRnZXRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVDYXNjYWRlQnV0dG9uR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUNhc2NhZGVCdXR0b25HYWRnZXRfMz0KLQotT1NfX1htQ3JlYXRlQ29tYm9Cb3g9Ci1PU19fWG1DcmVhdGVDb21ib0JveF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUNvbWJvQm94XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlQ29tYm9Cb3hfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlQ29tYm9Cb3hfMz0KLQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGw9Ci1PU19fWG1DcmVhdGVEaWFsb2dTaGVsbF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZURpYWxvZ1NoZWxsXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGxfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGxfMz0KLQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWE9Ci1PU19fWG1DcmVhdGVEcmF3aW5nQXJlYV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZURyYXdpbmdBcmVhXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWFfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWFfMz0KLQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b249Ci1PU19fWG1DcmVhdGVEcmF3bkJ1dHRvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZURyYXduQnV0dG9uXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b25fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b25fMz0KLQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2c9Ci1PU19fWG1DcmVhdGVFcnJvckRpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUVycm9yRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZz0KLU9TX19YbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVGaWxlU2VsZWN0aW9uRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVGaWxlU2VsZWN0aW9uRGlhbG9nXzM9Ci0KLU9TX19YbUNyZWF0ZUZvcm09Ci1PU19fWG1DcmVhdGVGb3JtXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlRm9ybV8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZUZvcm1fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRm9ybV8zPQotCi1PU19fWG1DcmVhdGVGcmFtZT0KLU9TX19YbUNyZWF0ZUZyYW1lXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlRnJhbWVfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVGcmFtZV8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVGcmFtZV8zPQotCi1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZz0KLU9TX19YbUNyZWF0ZUluZm9ybWF0aW9uRGlhbG9nXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlSW5mb3JtYXRpb25EaWFsb2dfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZ18zPQotCi1PU19fWG1DcmVhdGVMYWJlbD0KLU9TX19YbUNyZWF0ZUxhYmVsXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlTGFiZWxfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVMYWJlbF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVMYWJlbF8zPQotCi1PU19fWG1DcmVhdGVMaXN0PQotT1NfX1htQ3JlYXRlTGlzdF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUxpc3RfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVMaXN0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUxpc3RfMz0KLQotT1NfX1htQ3JlYXRlTWFpbldpbmRvdz0KLU9TX19YbUNyZWF0ZU1haW5XaW5kb3dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVNYWluV2luZG93XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlTWFpbldpbmRvd18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVNYWluV2luZG93XzM9Ci0KLU9TX19YbUNyZWF0ZU1lbnVCYXI9Ci1PU19fWG1DcmVhdGVNZW51QmFyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlTWVudUJhcl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZU1lbnVCYXJfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlTWVudUJhcl8zPQotCi1PU19fWG1DcmVhdGVNZXNzYWdlRGlhbG9nPQotT1NfX1htQ3JlYXRlTWVzc2FnZURpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZU1lc3NhZ2VEaWFsb2dfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVNZXNzYWdlRGlhbG9nXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZU1lc3NhZ2VEaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlUG9wdXBNZW51PQotT1NfX1htQ3JlYXRlUG9wdXBNZW51XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlUG9wdXBNZW51XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlUG9wdXBNZW51XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVBvcHVwTWVudV8zPQotCi1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnU9Ci1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnVfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnVfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlUHVsbGRvd25NZW51XzM9Ci0KLU9TX19YbUNyZWF0ZVB1c2hCdXR0b249Ci1PU19fWG1DcmVhdGVQdXNoQnV0dG9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbl8zPQotCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0PQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbkdhZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25HYWRnZXRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25HYWRnZXRfMz0KLQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2c9Ci1PU19fWG1DcmVhdGVRdWVzdGlvbkRpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVF1ZXN0aW9uRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlU2NhbGU9Ci1PU19fWG1DcmVhdGVTY2FsZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVNjYWxlXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2NhbGVfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2NhbGVfMz0KLQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyPQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNjcm9sbEJhcl8zPQotCi1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3Q9Ci1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3RfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3RfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3RfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRMaXN0XzM9Ci0KLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dD0KLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dF8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVTY3JvbGxlZFRleHRfMz0KLQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yPQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNlcGFyYXRvcl8zPQotCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXQ9Ci1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0XzM9Ci0KLU9TX19YbUNyZWF0ZVNpbXBsZVNwaW5Cb3g9Ci1PU19fWG1DcmVhdGVTaW1wbGVTcGluQm94XzA9Y2FzdD1XaWRnZXQKLU9TX19YbUNyZWF0ZVNpbXBsZVNwaW5Cb3hfMT1jYXN0PVN0cmluZwotT1NfX1htQ3JlYXRlU2ltcGxlU3BpbkJveF8yPWNhc3Q9QXJnTGlzdAotT1NfX1htQ3JlYXRlU2ltcGxlU3BpbkJveF8zPQotCi1PU19fWG1DcmVhdGVUZXh0RmllbGQ9Ci1PU19fWG1DcmVhdGVUZXh0RmllbGRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVUZXh0RmllbGRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVUZXh0RmllbGRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlVGV4dEZpZWxkXzM9Ci0KLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbj0KLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbl8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b25fMz0KLQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0PQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbkdhZGdldF8zPQotCi1PU19fWG1DcmVhdGVXYXJuaW5nRGlhbG9nPQotT1NfX1htQ3JlYXRlV2FybmluZ0RpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVdhcm5pbmdEaWFsb2dfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVXYXJuaW5nRGlhbG9nXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVdhcm5pbmdEaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlV29ya2luZ0RpYWxvZz0KLU9TX19YbUNyZWF0ZVdvcmtpbmdEaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVXb3JraW5nRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlV29ya2luZ0RpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVXb3JraW5nRGlhbG9nXzM9Ci0KLU9TX19YbURlc3Ryb3lQaXhtYXA9Ci1PU19fWG1EZXN0cm95UGl4bWFwXzA9Y2FzdD0oU2NyZWVuICopCi1PU19fWG1EZXN0cm95UGl4bWFwXzE9Y2FzdD0oUGl4bWFwKQotCi1PU19fWG1EcmFnQ2FuY2VsPQotT1NfX1htRHJhZ0NhbmNlbF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htRHJhZ1N0YXJ0PQotT1NfX1htRHJhZ1N0YXJ0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRHJhZ1N0YXJ0XzE9Y2FzdD0oWEV2ZW50ICopCi1PU19fWG1EcmFnU3RhcnRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htRHJhZ1N0YXJ0XzM9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbURyb3BTaXRlUmVnaXN0ZXI9Ci1PU19fWG1Ecm9wU2l0ZVJlZ2lzdGVyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRHJvcFNpdGVSZWdpc3Rlcl8xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1Ecm9wU2l0ZVJlZ2lzdGVyXzI9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbURyb3BTaXRlVW5yZWdpc3Rlcj0KLU9TX19YbURyb3BTaXRlVW5yZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htRHJvcFNpdGVVcGRhdGU9Ci1PU19fWG1Ecm9wU2l0ZVVwZGF0ZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyb3BTaXRlVXBkYXRlXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbURyb3BTaXRlVXBkYXRlXzI9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbURyb3BUcmFuc2ZlckFkZD0KLU9TX19YbURyb3BUcmFuc2ZlckFkZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyb3BUcmFuc2ZlckFkZF8xPWNhc3Q9KFhtRHJvcFRyYW5zZmVyRW50cnlSZWMgKikKLU9TX19YbURyb3BUcmFuc2ZlckFkZF8yPWNhc3Q9KENhcmRpbmFsKQotCi1PU19fWG1Ecm9wVHJhbnNmZXJTdGFydD0KLU9TX19YbURyb3BUcmFuc2ZlclN0YXJ0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRHJvcFRyYW5zZmVyU3RhcnRfMT1jYXN0PShBcmdMaXN0KQotT1NfX1htRHJvcFRyYW5zZmVyU3RhcnRfMj1jYXN0PShDYXJkaW5hbCkKLQotT1NfX1htRmlsZVNlbGVjdGlvbkJveEdldENoaWxkPQotT1NfX1htRmlsZVNlbGVjdGlvbkJveEdldENoaWxkXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRmlsZVNlbGVjdGlvbkJveEdldENoaWxkXzE9Ci0KLU9TX19YbUZvbnRMaXN0QXBwZW5kRW50cnk9Ci1PU19fWG1Gb250TGlzdEFwcGVuZEVudHJ5XzA9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbUZvbnRMaXN0QXBwZW5kRW50cnlfMT1jYXN0PShYbUZvbnRMaXN0RW50cnkpCi0KLU9TX19YbUZvbnRMaXN0Q29weT0KLU9TX19YbUZvbnRMaXN0Q29weV8wPWNhc3Q9KFhtRm9udExpc3QpCi0KLU9TX19YbUZvbnRMaXN0RW50cnlGcmVlPQotT1NfX1htRm9udExpc3RFbnRyeUZyZWVfMD1jYXN0PShYbUZvbnRMaXN0RW50cnkgKikKLQotT1NfX1htRm9udExpc3RFbnRyeUdldEZvbnQ9Ci1PU19fWG1Gb250TGlzdEVudHJ5R2V0Rm9udF8wPWNhc3Q9KFhtRm9udExpc3RFbnRyeSkKLU9TX19YbUZvbnRMaXN0RW50cnlHZXRGb250XzE9Y2FzdD0oWG1Gb250VHlwZSAqKQotCi1PU19fWG1Gb250TGlzdEVudHJ5TG9hZD0KLU9TX19YbUZvbnRMaXN0RW50cnlMb2FkXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htRm9udExpc3RFbnRyeUxvYWRfMT1jYXN0PShjaGFyICopCi1PU19fWG1Gb250TGlzdEVudHJ5TG9hZF8yPQotT1NfX1htRm9udExpc3RFbnRyeUxvYWRfMz1jYXN0PShjaGFyICopCi0KLU9TX19YbUZvbnRMaXN0RnJlZT0KLU9TX19YbUZvbnRMaXN0RnJlZV8wPWNhc3Q9KFhtRm9udExpc3QpCi0KLU9TX19YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0PQotT1NfX1htRm9udExpc3RGcmVlRm9udENvbnRleHRfMD1jYXN0PShYbUZvbnRDb250ZXh0KQotCi1PU19fWG1Gb250TGlzdEluaXRGb250Q29udGV4dD0KLU9TX19YbUZvbnRMaXN0SW5pdEZvbnRDb250ZXh0XzA9Y2FzdD0oWG1Gb250Q29udGV4dCAqKQotT1NfX1htRm9udExpc3RJbml0Rm9udENvbnRleHRfMT1jYXN0PShYbUZvbnRMaXN0KQotCi1PU19fWG1Gb250TGlzdE5leHRFbnRyeT0KLU9TX19YbUZvbnRMaXN0TmV4dEVudHJ5XzA9Y2FzdD0oWG1Gb250Q29udGV4dCkKLQotT1NfX1htR2V0QXRvbU5hbWU9Ci1PU19fWG1HZXRBdG9tTmFtZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUdldEF0b21OYW1lXzE9Y2FzdD0oQXRvbSkKLQotT1NfX1htR2V0RHJhZ0NvbnRleHQ9Ci1PU19fWG1HZXREcmFnQ29udGV4dF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUdldERyYWdDb250ZXh0XzE9Y2FzdD0oVGltZSkKLQotT1NfX1htR2V0Rm9jdXNXaWRnZXQ9Ci1PU19fWG1HZXRGb2N1c1dpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htR2V0UGl4bWFwPQotT1NfX1htR2V0UGl4bWFwXzA9Y2FzdD0oU2NyZWVuICopCi1PU19fWG1HZXRQaXhtYXBfMT1jYXN0PShjaGFyICopCi1PU19fWG1HZXRQaXhtYXBfMj1jYXN0PShQaXhlbCkKLU9TX19YbUdldFBpeG1hcF8zPWNhc3Q9KFBpeGVsKQotCi1PU19fWG1HZXRQaXhtYXBCeURlcHRoPQotT1NfX1htR2V0UGl4bWFwQnlEZXB0aF8wPWNhc3Q9KFNjcmVlbiAqKQotT1NfX1htR2V0UGl4bWFwQnlEZXB0aF8xPWNhc3Q9KGNoYXIgKikKLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfMj0KLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfMz0KLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfND0KLQotT1NfX1htR2V0WG1EaXNwbGF5PQotT1NfX1htR2V0WG1EaXNwbGF5XzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWG1JbU1iTG9va3VwU3RyaW5nPQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUltTWJMb29rdXBTdHJpbmdfMT1jYXN0PShYS2V5UHJlc3NlZEV2ZW50ICopCi1PU19fWG1JbU1iTG9va3VwU3RyaW5nXzI9Y2FzdD0oY2hhciAqKQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ18zPQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ180PWNhc3Q9KEtleVN5bSAqKQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ181PWNhc3Q9KGludCAqKQotCi1PU19fWG1JbVJlZ2lzdGVyPQotT1NfX1htSW1SZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUltUmVnaXN0ZXJfMT0KLQotT1NfX1htSW1TZXRGb2N1c1ZhbHVlcz0KLU9TX19YbUltU2V0Rm9jdXNWYWx1ZXNfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1JbVNldEZvY3VzVmFsdWVzXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUltU2V0Rm9jdXNWYWx1ZXNfMj0KLQotT1NfX1htSW1TZXRWYWx1ZXM9Ci1PU19fWG1JbVNldFZhbHVlc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUltU2V0VmFsdWVzXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUltU2V0VmFsdWVzXzI9Ci0KLU9TX19YbUltVW5yZWdpc3Rlcj0KLU9TX19YbUltVW5yZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htSW1VbnNldEZvY3VzPQotT1NfX1htSW1VbnNldEZvY3VzXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1JbnRlcm5BdG9tPQotT1NfX1htSW50ZXJuQXRvbV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUludGVybkF0b21fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1JbnRlcm5BdG9tXzI9Ci0KLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZD0KLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZF8xPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htTGlzdEFkZEl0ZW1VbnNlbGVjdGVkXzI9Ci0KLU9TX19YbUxpc3REZWxldGVBbGxJdGVtcz0KLU9TX19YbUxpc3REZWxldGVBbGxJdGVtc18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zPQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zXzE9Ci1PU19fWG1MaXN0RGVsZXRlSXRlbXNQb3NfMj0KLQotT1NfX1htTGlzdERlbGV0ZVBvcz0KLU9TX19YbUxpc3REZWxldGVQb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0RGVsZXRlUG9zXzE9Ci0KLU9TX19YbUxpc3REZWxldGVQb3NpdGlvbnM9Ci1PU19fWG1MaXN0RGVsZXRlUG9zaXRpb25zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdERlbGV0ZVBvc2l0aW9uc18xPWNhc3Q9KGludCAqKQotT1NfX1htTGlzdERlbGV0ZVBvc2l0aW9uc18yPQotCi1PU19fWG1MaXN0RGVzZWxlY3RBbGxJdGVtcz0KLU9TX19YbUxpc3REZXNlbGVjdEFsbEl0ZW1zXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1MaXN0RGVzZWxlY3RQb3M9Ci1PU19fWG1MaXN0RGVzZWxlY3RQb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0RGVzZWxlY3RQb3NfMT0KLQotT1NfX1htTGlzdEdldEtiZEl0ZW1Qb3M9Ci1PU19fWG1MaXN0R2V0S2JkSXRlbVBvc18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zPQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zXzE9Y2FzdD0oaW50ICoqKQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zXzI9Y2FzdD0oaW50ICopCi0KLU9TX19YbUxpc3RJdGVtUG9zPQotT1NfX1htTGlzdEl0ZW1Qb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0SXRlbVBvc18xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1MaXN0UG9zU2VsZWN0ZWQ9Ci1PU19fWG1MaXN0UG9zU2VsZWN0ZWRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0UG9zU2VsZWN0ZWRfMT0KLQotT1NfX1htTGlzdFJlcGxhY2VJdGVtc1Bvc1Vuc2VsZWN0ZWQ9Ci1PU19fWG1MaXN0UmVwbGFjZUl0ZW1zUG9zVW5zZWxlY3RlZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RSZXBsYWNlSXRlbXNQb3NVbnNlbGVjdGVkXzE9Y2FzdD0oWG1TdHJpbmcgKikKLU9TX19YbUxpc3RSZXBsYWNlSXRlbXNQb3NVbnNlbGVjdGVkXzI9Ci1PU19fWG1MaXN0UmVwbGFjZUl0ZW1zUG9zVW5zZWxlY3RlZF8zPQotCi1PU19fWG1MaXN0U2VsZWN0UG9zPQotT1NfX1htTGlzdFNlbGVjdFBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RTZWxlY3RQb3NfMT0KLU9TX19YbUxpc3RTZWxlY3RQb3NfMj0KLQotT1NfX1htTGlzdFNldEtiZEl0ZW1Qb3M9Ci1PU19fWG1MaXN0U2V0S2JkSXRlbVBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RTZXRLYmRJdGVtUG9zXzE9Ci0KLU9TX19YbUxpc3RTZXRQb3M9Ci1PU19fWG1MaXN0U2V0UG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdFNldFBvc18xPQotCi1PU19fWG1MaXN0VXBkYXRlU2VsZWN0ZWRMaXN0PQotT1NfX1htTGlzdFVwZGF0ZVNlbGVjdGVkTGlzdF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzPQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzE9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzI9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzM9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzQ9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzU9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1NZXNzYWdlQm94R2V0Q2hpbGQ9Ci1PU19fWG1NZXNzYWdlQm94R2V0Q2hpbGRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1NZXNzYWdlQm94R2V0Q2hpbGRfMT0KLQotT1NfX1htUGFyc2VNYXBwaW5nQ3JlYXRlPQotT1NfX1htUGFyc2VNYXBwaW5nQ3JlYXRlXzA9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbVBhcnNlTWFwcGluZ0NyZWF0ZV8xPQotCi1PU19fWG1QYXJzZU1hcHBpbmdGcmVlPQotT1NfX1htUGFyc2VNYXBwaW5nRnJlZV8wPWNhc3Q9KFhtUGFyc2VNYXBwaW5nKQotCi1PU19fWG1Qcm9jZXNzVHJhdmVyc2FsPQotT1NfX1htUHJvY2Vzc1RyYXZlcnNhbF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVByb2Nlc3NUcmF2ZXJzYWxfMT0KLQotT1NfX1htUmVuZGVyVGFibGVBZGRSZW5kaXRpb25zPQotT1NfX1htUmVuZGVyVGFibGVBZGRSZW5kaXRpb25zXzA9Y2FzdD0oWG1SZW5kZXJUYWJsZSkKLU9TX19YbVJlbmRlclRhYmxlQWRkUmVuZGl0aW9uc18xPWNhc3Q9KFhtUmVuZGl0aW9uICopCi1PU19fWG1SZW5kZXJUYWJsZUFkZFJlbmRpdGlvbnNfMj0KLU9TX19YbVJlbmRlclRhYmxlQWRkUmVuZGl0aW9uc18zPQotCi1PU19fWG1SZW5kZXJUYWJsZUZyZWU9Ci1PU19fWG1SZW5kZXJUYWJsZUZyZWVfMD1jYXN0PShYbVJlbmRlclRhYmxlKQotCi1PU19fWG1SZW5kaXRpb25DcmVhdGU9Ci1PU19fWG1SZW5kaXRpb25DcmVhdGVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1SZW5kaXRpb25DcmVhdGVfMT1jYXN0PShYbVN0cmluZ1RhZykKLU9TX19YbVJlbmRpdGlvbkNyZWF0ZV8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1SZW5kaXRpb25DcmVhdGVfMz0KLQotT1NfX1htUmVuZGl0aW9uRnJlZT0KLU9TX19YbVJlbmRpdGlvbkZyZWVfMD1jYXN0PShYbVJlbmRpdGlvbikKLQotT1NfX1htU3RyaW5nQmFzZWxpbmU9Ci1PU19fWG1TdHJpbmdCYXNlbGluZV8wPWNhc3Q9WG1SZW5kZXJUYWJsZQotT1NfX1htU3RyaW5nQmFzZWxpbmVfMT1jYXN0PVhtU3RyaW5nCi0KLU9TX19YbVN0cmluZ0NvbXBhcmU9Ci1PU19fWG1TdHJpbmdDb21wYXJlXzA9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdDb21wYXJlXzE9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVN0cmluZ0NvbXBvbmVudENyZWF0ZT0KLU9TX19YbVN0cmluZ0NvbXBvbmVudENyZWF0ZV8wPQotT1NfX1htU3RyaW5nQ29tcG9uZW50Q3JlYXRlXzE9Ci1PU19fWG1TdHJpbmdDb21wb25lbnRDcmVhdGVfMj1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YbVN0cmluZ0NvbmNhdD0KLU9TX19YbVN0cmluZ0NvbmNhdF8wPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htU3RyaW5nQ29uY2F0XzE9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVN0cmluZ0NyZWF0ZT0KLU9TX19YbVN0cmluZ0NyZWF0ZV8wPWNhc3Q9KGNoYXIgKikKLU9TX19YbVN0cmluZ0NyZWF0ZV8xPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htU3RyaW5nQ3JlYXRlTG9jYWxpemVkPQotT1NfX1htU3RyaW5nQ3JlYXRlTG9jYWxpemVkXzA9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1TdHJpbmdEcmF3PQotT1NfX1htU3RyaW5nRHJhd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbVN0cmluZ0RyYXdfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1TdHJpbmdEcmF3XzI9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbVN0cmluZ0RyYXdfMz1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ0RyYXdfND1jYXN0PShHQykKLU9TX19YbVN0cmluZ0RyYXdfNT0KLU9TX19YbVN0cmluZ0RyYXdfNj0KLU9TX19YbVN0cmluZ0RyYXdfNz0KLU9TX19YbVN0cmluZ0RyYXdfOD0KLU9TX19YbVN0cmluZ0RyYXdfOT0KLU9TX19YbVN0cmluZ0RyYXdfMTA9Ci0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZT0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8yPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfMz1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV80PWNhc3Q9KEdDKQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzU9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfNj0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV83PQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzg9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfOT0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8xMD0KLQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZT0KLU9TX19YbVN0cmluZ0RyYXdVbmRlcmxpbmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzE9Y2FzdD0oV2luZG93KQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8yPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzM9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzQ9Y2FzdD0oR0MpCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzU9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzY9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzc9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzg9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzk9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzEwPQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8xMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htU3RyaW5nRW1wdHk9Ci1PU19fWG1TdHJpbmdFbXB0eV8wPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1TdHJpbmdFeHRlbnQ9Ci1PU19fWG1TdHJpbmdFeHRlbnRfMD1jYXN0PVhtUmVuZGVyVGFibGUKLU9TX19YbVN0cmluZ0V4dGVudF8xPWNhc3Q9WG1TdHJpbmcKLU9TX19YbVN0cmluZ0V4dGVudF8yPWNhc3Q9RGltZW5zaW9uICoKLU9TX19YbVN0cmluZ0V4dGVudF8zPWNhc3Q9RGltZW5zaW9uICoKLQotT1NfX1htU3RyaW5nRnJlZT0KLU9TX19YbVN0cmluZ0ZyZWVfMD1jYXN0PShYbVN0cmluZykKLQotT1NfX1htU3RyaW5nR2VuZXJhdGU9Ci1PU19fWG1TdHJpbmdHZW5lcmF0ZV8wPWNhc3Q9KFh0UG9pbnRlcikKLU9TX19YbVN0cmluZ0dlbmVyYXRlXzE9Y2FzdD0oWG1TdHJpbmdUYWcpCi1PU19fWG1TdHJpbmdHZW5lcmF0ZV8yPQotT1NfX1htU3RyaW5nR2VuZXJhdGVfMz1jYXN0PShYbVN0cmluZ1RhZykKLQotT1NfX1htU3RyaW5nSGVpZ2h0PQotT1NfX1htU3RyaW5nSGVpZ2h0XzA9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbVN0cmluZ0hlaWdodF8xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1TdHJpbmdQYXJzZVRleHQ9Ci1PU19fWG1TdHJpbmdQYXJzZVRleHRfMD1jYXN0PShYdFBvaW50ZXIpCi1PU19fWG1TdHJpbmdQYXJzZVRleHRfMT1jYXN0PShYdFBvaW50ZXIgKikKLU9TX19YbVN0cmluZ1BhcnNlVGV4dF8yPWNhc3Q9KFhtU3RyaW5nVGFnKQotT1NfX1htU3RyaW5nUGFyc2VUZXh0XzM9Ci1PU19fWG1TdHJpbmdQYXJzZVRleHRfND1jYXN0PShYbVBhcnNlVGFibGUpCi1PU19fWG1TdHJpbmdQYXJzZVRleHRfNT0KLU9TX19YbVN0cmluZ1BhcnNlVGV4dF82PWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1htU3RyaW5nVW5wYXJzZT0KLU9TX19YbVN0cmluZ1VucGFyc2VfMD1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ1VucGFyc2VfMT1jYXN0PShYbVN0cmluZ1RhZykKLU9TX19YbVN0cmluZ1VucGFyc2VfMj0KLU9TX19YbVN0cmluZ1VucGFyc2VfMz0KLU9TX19YbVN0cmluZ1VucGFyc2VfND1jYXN0PShYbVBhcnNlVGFibGUpCi1PU19fWG1TdHJpbmdVbnBhcnNlXzU9Ci1PU19fWG1TdHJpbmdVbnBhcnNlXzY9Ci0KLU9TX19YbVN0cmluZ1dpZHRoPQotT1NfX1htU3RyaW5nV2lkdGhfMD1jYXN0PShYbUZvbnRMaXN0KQotT1NfX1htU3RyaW5nV2lkdGhfMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htVGFiQ3JlYXRlPQotT1NfX1htVGFiQ3JlYXRlXzA9Ci1PU19fWG1UYWJDcmVhdGVfMT0KLU9TX19YbVRhYkNyZWF0ZV8yPQotT1NfX1htVGFiQ3JlYXRlXzM9Ci1PU19fWG1UYWJDcmVhdGVfND1jYXN0PShjaGFyICopCi0KLU9TX19YbVRhYkZyZWU9Ci1PU19fWG1UYWJGcmVlXzA9Y2FzdD0oWG1UYWIpCi0KLU9TX19YbVRhYkxpc3RGcmVlPQotT1NfX1htVGFiTGlzdEZyZWVfMD1jYXN0PShYbVRhYkxpc3QpCi0KLU9TX19YbVRhYkxpc3RJbnNlcnRUYWJzPQotT1NfX1htVGFiTGlzdEluc2VydFRhYnNfMD1jYXN0PShYbVRhYkxpc3QpCi1PU19fWG1UYWJMaXN0SW5zZXJ0VGFic18xPWNhc3Q9KFhtVGFiICopCi1PU19fWG1UYWJMaXN0SW5zZXJ0VGFic18yPQotT1NfX1htVGFiTGlzdEluc2VydFRhYnNfMz0KLQotT1NfX1htVGV4dENsZWFyU2VsZWN0aW9uPQotT1NfX1htVGV4dENsZWFyU2VsZWN0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dENsZWFyU2VsZWN0aW9uXzE9Ci0KLU9TX19YbVRleHRDb3B5PQotT1NfX1htVGV4dENvcHlfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0Q29weV8xPQotCi1PU19fWG1UZXh0Q3V0PQotT1NfX1htVGV4dEN1dF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRDdXRfMT0KLQotT1NfX1htVGV4dERpc2FibGVSZWRpc3BsYXk9Ci1PU19fWG1UZXh0RGlzYWJsZVJlZGlzcGxheV8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEVuYWJsZVJlZGlzcGxheT0KLU9TX19YbVRleHRFbmFibGVSZWRpc3BsYXlfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRGaWVsZFBhc3RlPQotT1NfX1htVGV4dEZpZWxkUGFzdGVfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRHZXRJbnNlcnRpb25Qb3NpdGlvbj0KLU9TX19YbVRleHRHZXRJbnNlcnRpb25Qb3NpdGlvbl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEdldExhc3RQb3NpdGlvbj0KLU9TX19YbVRleHRHZXRMYXN0UG9zaXRpb25fMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRHZXRNYXhMZW5ndGg9Ci1PU19fWG1UZXh0R2V0TWF4TGVuZ3RoXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0R2V0U2VsZWN0aW9uPQotT1NfX1htVGV4dEdldFNlbGVjdGlvbl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEdldFNlbGVjdGlvblBvc2l0aW9uPQotT1NfX1htVGV4dEdldFNlbGVjdGlvblBvc2l0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dEdldFNlbGVjdGlvblBvc2l0aW9uXzE9Y2FzdD0oWG1UZXh0UG9zaXRpb24gKikKLU9TX19YbVRleHRHZXRTZWxlY3Rpb25Qb3NpdGlvbl8yPWNhc3Q9KFhtVGV4dFBvc2l0aW9uICopCi0KLU9TX19YbVRleHRHZXRTdHJpbmc9Ci1PU19fWG1UZXh0R2V0U3RyaW5nXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0R2V0U3Vic3RyaW5nPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMT0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMj0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMz0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfND1jYXN0PShjaGFyICopCi0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdXY3M9Ci1PU19fWG1UZXh0R2V0U3Vic3RyaW5nV2NzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18xPWNhc3Q9KFhtVGV4dFBvc2l0aW9uKQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18yPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18zPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc180PWNhc3Q9KHdjaGFyX3QgKikKLQotT1NfX1htVGV4dEluc2VydD0KLU9TX19YbVRleHRJbnNlcnRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0SW5zZXJ0XzE9Ci1PU19fWG1UZXh0SW5zZXJ0XzI9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1UZXh0UGFzdGU9Ci1PU19fWG1UZXh0UGFzdGVfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRQb3NUb1hZPQotT1NfX1htVGV4dFBvc1RvWFlfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0UG9zVG9YWV8xPWNhc3Q9KFhtVGV4dFBvc2l0aW9uKQotT1NfX1htVGV4dFBvc1RvWFlfMj1jYXN0PShQb3NpdGlvbiAqKQotT1NfX1htVGV4dFBvc1RvWFlfMz1jYXN0PShQb3NpdGlvbiAqKQotCi1PU19fWG1UZXh0UmVwbGFjZT0KLU9TX19YbVRleHRSZXBsYWNlXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFJlcGxhY2VfMT0KLU9TX19YbVRleHRSZXBsYWNlXzI9Ci1PU19fWG1UZXh0UmVwbGFjZV8zPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htVGV4dFNjcm9sbD0KLU9TX19YbVRleHRTY3JvbGxfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2Nyb2xsXzE9Ci0KLU9TX19YbVRleHRTZXRFZGl0YWJsZT0KLU9TX19YbVRleHRTZXRFZGl0YWJsZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRFZGl0YWJsZV8xPQotCi1PU19fWG1UZXh0U2V0SGlnaGxpZ2h0PQotT1NfX1htVGV4dFNldEhpZ2hsaWdodF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMT0KLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMj0KLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMz0KLQotT1NfX1htVGV4dFNldEluc2VydGlvblBvc2l0aW9uPQotT1NfX1htVGV4dFNldEluc2VydGlvblBvc2l0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFNldEluc2VydGlvblBvc2l0aW9uXzE9Ci0KLU9TX19YbVRleHRTZXRNYXhMZW5ndGg9Ci1PU19fWG1UZXh0U2V0TWF4TGVuZ3RoXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFNldE1heExlbmd0aF8xPQotCi1PU19fWG1UZXh0U2V0U2VsZWN0aW9uPQotT1NfX1htVGV4dFNldFNlbGVjdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMT0KLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMj0KLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMz0KLQotT1NfX1htVGV4dFNldFN0cmluZz0KLU9TX19YbVRleHRTZXRTdHJpbmdfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2V0U3RyaW5nXzE9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1UZXh0U2hvd1Bvc2l0aW9uPQotT1NfX1htVGV4dFNob3dQb3NpdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTaG93UG9zaXRpb25fMT0KLQotT1NfX1htVXBkYXRlRGlzcGxheT0KLU9TX19YbVVwZGF0ZURpc3BsYXlfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVdpZGdldEdldERpc3BsYXlSZWN0PQotT1NfX1htV2lkZ2V0R2V0RGlzcGxheVJlY3RfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1XaWRnZXRHZXREaXNwbGF5UmVjdF8xPWNhc3Q9KFhSZWN0YW5nbGUgKikKLQotT1NfX1htYlRleHRMaXN0VG9UZXh0UHJvcGVydHk9Ci1PU19fWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5XzE9Y2FzdD0oY2hhciAqKikKLU9TX19YbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5XzI9Ci1PU19fWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eV8zPWNhc3Q9KFhJQ0NFbmNvZGluZ1N0eWxlKQotT1NfX1htYlRleHRMaXN0VG9UZXh0UHJvcGVydHlfND0KLQotT1NfX1htYlRleHRQcm9wZXJ0eVRvVGV4dExpc3Q9Ci1PU19fWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0XzE9Ci1PU19fWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdF8yPWNhc3Q9KGNoYXIgKioqKQotT1NfX1htYlRleHRQcm9wZXJ0eVRvVGV4dExpc3RfMz1jYXN0PShpbnQgKikKLQotT1NfX1hwQ2FuY2VsSm9iPQotT1NfX1hwQ2FuY2VsSm9iXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwQ2FuY2VsSm9iXzE9Ci0KLU9TX19YcENyZWF0ZUNvbnRleHQ9Ci1PU19fWHBDcmVhdGVDb250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwQ3JlYXRlQ29udGV4dF8xPWNhc3Q9KGNoYXIgKikKLQotT1NfX1hwRGVzdHJveUNvbnRleHQ9Ci1PU19fWHBEZXN0cm95Q29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcERlc3Ryb3lDb250ZXh0XzE9Y2FzdD0oWFBDb250ZXh0KQotCi1PU19fWHBFbmRKb2I9Ci1PU19fWHBFbmRKb2JfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YcEVuZFBhZ2U9Ci1PU19fWHBFbmRQYWdlXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWHBGcmVlUHJpbnRlckxpc3Q9Ci1PU19fWHBGcmVlUHJpbnRlckxpc3RfMD1jYXN0PShYUFByaW50ZXJMaXN0KQotCi1PU19fWHBHZXRPbmVBdHRyaWJ1dGU9Ci1PU19fWHBHZXRPbmVBdHRyaWJ1dGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBHZXRPbmVBdHRyaWJ1dGVfMT1jYXN0PShYUENvbnRleHQpCi1PU19fWHBHZXRPbmVBdHRyaWJ1dGVfMj1jYXN0PShYUEF0dHJpYnV0ZXMpCi1PU19fWHBHZXRPbmVBdHRyaWJ1dGVfMz1jYXN0PShjaGFyICopCi0KLU9TX19YcEdldFBhZ2VEaW1lbnNpb25zPQotT1NfX1hwR2V0UGFnZURpbWVuc2lvbnNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBHZXRQYWdlRGltZW5zaW9uc18xPWNhc3Q9KFhQQ29udGV4dCkKLU9TX19YcEdldFBhZ2VEaW1lbnNpb25zXzI9Y2FzdD0odW5zaWduZWQgc2hvcnQgKikKLU9TX19YcEdldFBhZ2VEaW1lbnNpb25zXzM9Y2FzdD0odW5zaWduZWQgc2hvcnQgKikKLU9TX19YcEdldFBhZ2VEaW1lbnNpb25zXzQ9Y2FzdD0oWFJlY3RhbmdsZSAqKQotCi1PU19fWHBHZXRQcmludGVyTGlzdD0KLU9TX19YcEdldFByaW50ZXJMaXN0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwR2V0UHJpbnRlckxpc3RfMT1jYXN0PShjaGFyICopCi1PU19fWHBHZXRQcmludGVyTGlzdF8yPWNhc3Q9KGludCAqKQotCi1PU19fWHBHZXRTY3JlZW5PZkNvbnRleHQ9Ci1PU19fWHBHZXRTY3JlZW5PZkNvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBHZXRTY3JlZW5PZkNvbnRleHRfMT1jYXN0PShYUENvbnRleHQpCi0KLU9TX19YcFNldEF0dHJpYnV0ZXM9Ci1PU19fWHBTZXRBdHRyaWJ1dGVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwU2V0QXR0cmlidXRlc18xPWNhc3Q9KFhQQ29udGV4dCkKLU9TX19YcFNldEF0dHJpYnV0ZXNfMj1jYXN0PShYUEF0dHJpYnV0ZXMpCi1PU19fWHBTZXRBdHRyaWJ1dGVzXzM9Y2FzdD0oY2hhciAqKQotT1NfX1hwU2V0QXR0cmlidXRlc180PWNhc3Q9KFhQQXR0clJlcGxhY2VtZW50KQotCi1PU19fWHBTZXRDb250ZXh0PQotT1NfX1hwU2V0Q29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcFNldENvbnRleHRfMT1jYXN0PShYUENvbnRleHQpCi0KLU9TX19YcFN0YXJ0Sm9iPQotT1NfX1hwU3RhcnRKb2JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBTdGFydEpvYl8xPWNhc3Q9KFhQU2F2ZURhdGEpCi0KLU9TX19YcFN0YXJ0UGFnZT0KLU9TX19YcFN0YXJ0UGFnZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcFN0YXJ0UGFnZV8xPWNhc3Q9KFdpbmRvdykKLQotT1NfX1h0QWRkQ2FsbGJhY2s9Ci1PU19fWHRBZGRDYWxsYmFja18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdEFkZENhbGxiYWNrXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1h0QWRkQ2FsbGJhY2tfMj1jYXN0PShYdENhbGxiYWNrUHJvYykKLU9TX19YdEFkZENhbGxiYWNrXzM9Y2FzdD0oWHRQb2ludGVyKQotCi1PU19fWHRBZGRFdmVudEhhbmRsZXI9Ci1PU19fWHRBZGRFdmVudEhhbmRsZXJfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRBZGRFdmVudEhhbmRsZXJfMT0KLU9TX19YdEFkZEV2ZW50SGFuZGxlcl8yPQotT1NfX1h0QWRkRXZlbnRIYW5kbGVyXzM9Y2FzdD0oWHRFdmVudEhhbmRsZXIpCi1PU19fWHRBZGRFdmVudEhhbmRsZXJfND1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YdEFkZEV4cG9zdXJlVG9SZWdpb249Ci1PU19fWHRBZGRFeHBvc3VyZVRvUmVnaW9uXzA9Y2FzdD0oWEV2ZW50ICopCi1PU19fWHRBZGRFeHBvc3VyZVRvUmVnaW9uXzE9Y2FzdD0oUmVnaW9uKQotCi1PU19fWHRBcHBBZGRJbnB1dD0KLU9TX19YdEFwcEFkZElucHV0XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwQWRkSW5wdXRfMT0KLU9TX19YdEFwcEFkZElucHV0XzI9Y2FzdD0oWHRQb2ludGVyKQotT1NfX1h0QXBwQWRkSW5wdXRfMz1jYXN0PShYdElucHV0Q2FsbGJhY2tQcm9jKQotT1NfX1h0QXBwQWRkSW5wdXRfND1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YdEFwcEFkZFRpbWVPdXQ9Ci1PU19fWHRBcHBBZGRUaW1lT3V0XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwQWRkVGltZU91dF8xPQotT1NfX1h0QXBwQWRkVGltZU91dF8yPWNhc3Q9KFh0VGltZXJDYWxsYmFja1Byb2MpCi1PU19fWHRBcHBBZGRUaW1lT3V0XzM9Y2FzdD0oWHRQb2ludGVyKQotCi1PU19fWHRBcHBDcmVhdGVTaGVsbD0KLU9TX19YdEFwcENyZWF0ZVNoZWxsXzA9Y2FzdD0oU3RyaW5nKQotT1NfX1h0QXBwQ3JlYXRlU2hlbGxfMT1jYXN0PShTdHJpbmcpCi1PU19fWHRBcHBDcmVhdGVTaGVsbF8yPWNhc3Q9KFdpZGdldENsYXNzKQotT1NfX1h0QXBwQ3JlYXRlU2hlbGxfMz1jYXN0PShEaXNwbGF5ICopCi1PU19fWHRBcHBDcmVhdGVTaGVsbF80PWNhc3Q9KEFyZ0xpc3QpCi1PU19fWHRBcHBDcmVhdGVTaGVsbF81PQotCi1PU19fWHRBcHBHZXRTZWxlY3Rpb25UaW1lb3V0PQotT1NfX1h0QXBwR2V0U2VsZWN0aW9uVGltZW91dF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLQotT1NfX1h0QXBwTmV4dEV2ZW50PQotT1NfX1h0QXBwTmV4dEV2ZW50XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwTmV4dEV2ZW50XzE9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YdEFwcFBlZWtFdmVudD0KLU9TX19YdEFwcFBlZWtFdmVudF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcFBlZWtFdmVudF8xPWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWHRBcHBQZW5kaW5nPQotT1NfX1h0QXBwUGVuZGluZ18wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLQotT1NfX1h0QXBwUHJvY2Vzc0V2ZW50PQotT1NfX1h0QXBwUHJvY2Vzc0V2ZW50XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwUHJvY2Vzc0V2ZW50XzE9Ci0KLU9TX19YdEFwcFNldEVycm9ySGFuZGxlcj0KLU9TX19YdEFwcFNldEVycm9ySGFuZGxlcl8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcFNldEVycm9ySGFuZGxlcl8xPWNhc3Q9KFh0RXJyb3JIYW5kbGVyKQotCi1PU19fWHRBcHBTZXRGYWxsYmFja1Jlc291cmNlcz0KLU9TX19YdEFwcFNldEZhbGxiYWNrUmVzb3VyY2VzXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwU2V0RmFsbGJhY2tSZXNvdXJjZXNfMT1jYXN0PShTdHJpbmcgKikKLQotT1NfX1h0QXBwU2V0U2VsZWN0aW9uVGltZW91dD0KLU9TX19YdEFwcFNldFNlbGVjdGlvblRpbWVvdXRfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBTZXRTZWxlY3Rpb25UaW1lb3V0XzE9Ci0KLU9TX19YdEFwcFNldFdhcm5pbmdIYW5kbGVyPQotT1NfX1h0QXBwU2V0V2FybmluZ0hhbmRsZXJfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBTZXRXYXJuaW5nSGFuZGxlcl8xPWNhc3Q9KFh0RXJyb3JIYW5kbGVyKQotCi1PU19fWHRCdWlsZEV2ZW50TWFzaz0KLU9TX19YdEJ1aWxkRXZlbnRNYXNrXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRDYWxsQWN0aW9uUHJvYz0KLU9TX19YdENhbGxBY3Rpb25Qcm9jXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0Q2FsbEFjdGlvblByb2NfMT1jYXN0PShTdHJpbmcpCi1PU19fWHRDYWxsQWN0aW9uUHJvY18yPWNhc3Q9KFhFdmVudCAqKQotT1NfX1h0Q2FsbEFjdGlvblByb2NfMz1jYXN0PShTdHJpbmcgKikKLU9TX19YdENhbGxBY3Rpb25Qcm9jXzQ9Ci0KLU9TX19YdENsYXNzPQotT1NfX1h0Q2xhc3NfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdENvbmZpZ3VyZVdpZGdldD0KLU9TX19YdENvbmZpZ3VyZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdENvbmZpZ3VyZVdpZGdldF8xPQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0XzI9Ci1PU19fWHRDb25maWd1cmVXaWRnZXRfMz0KLU9TX19YdENvbmZpZ3VyZVdpZGdldF80PQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0XzU9Ci0KLU9TX19YdENyZWF0ZUFwcGxpY2F0aW9uQ29udGV4dD0KLQotT1NfX1h0Q3JlYXRlUG9wdXBTaGVsbD0KLU9TX19YdENyZWF0ZVBvcHVwU2hlbGxfMD1jYXN0PShTdHJpbmcpCi1PU19fWHRDcmVhdGVQb3B1cFNoZWxsXzE9Y2FzdD0oV2lkZ2V0Q2xhc3MpCi1PU19fWHRDcmVhdGVQb3B1cFNoZWxsXzI9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0Q3JlYXRlUG9wdXBTaGVsbF8zPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWHRDcmVhdGVQb3B1cFNoZWxsXzQ9Ci0KLU9TX19YdERlc3Ryb3lBcHBsaWNhdGlvbkNvbnRleHQ9Ci1PU19fWHREZXN0cm95QXBwbGljYXRpb25Db250ZXh0XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotCi1PU19fWHREZXN0cm95V2lkZ2V0PQotT1NfX1h0RGVzdHJveVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0RGlzb3duU2VsZWN0aW9uPQotT1NfX1h0RGlzb3duU2VsZWN0aW9uXzA9Y2FzdD1XaWRnZXQKLU9TX19YdERpc293blNlbGVjdGlvbl8xPWNhc3Q9QXRvbQotT1NfX1h0RGlzb3duU2VsZWN0aW9uXzI9Y2FzdD1UaW1lCi0KLU9TX19YdERpc3BhdGNoRXZlbnQ9Ci1PU19fWHREaXNwYXRjaEV2ZW50XzA9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YdERpc3BsYXk9Ci1PU19fWHREaXNwbGF5XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHREaXNwbGF5VG9BcHBsaWNhdGlvbkNvbnRleHQ9Ci1PU19fWHREaXNwbGF5VG9BcHBsaWNhdGlvbkNvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YdEZyZWU9Ci1PU19fWHRGcmVlXzA9Y2FzdD0oY2hhciAqKQotCi1PU19fWHRHZXRNdWx0aUNsaWNrVGltZT0KLU9TX19YdEdldE11bHRpQ2xpY2tUaW1lXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZT0KLU9TX19YdEdldFNlbGVjdGlvblZhbHVlXzA9Y2FzdD1XaWRnZXQKLU9TX19YdEdldFNlbGVjdGlvblZhbHVlXzE9Y2FzdD1BdG9tCi1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZV8yPWNhc3Q9QXRvbQotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWVfMz1jYXN0PVh0U2VsZWN0aW9uQ2FsbGJhY2tQcm9jCi1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZV80PWNhc3Q9WHRQb2ludGVyCi1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZV81PWNhc3Q9VGltZQotCi1PU19fWHRHZXRWYWx1ZXM9ZmxhZ3M9bm9fZ2VuCi1PU19fWHRHZXRWYWx1ZXNfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRHZXRWYWx1ZXNfMT1jYXN0PShBcmdMaXN0KQotT1NfX1h0R2V0VmFsdWVzXzI9Ci0KLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcj0KLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcl8xPWNhc3Q9KEV2ZW50TWFzaykKLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcl8yPWNhc3Q9KEJvb2xlYW4pCi1PU19fWHRJbnNlcnRFdmVudEhhbmRsZXJfMz1jYXN0PShYdEV2ZW50SGFuZGxlcikKLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcl80PWNhc3Q9KFh0UG9pbnRlcikKLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcl81PWNhc3Q9KFh0TGlzdFBvc2l0aW9uKQotCi1PU19fWHRJc01hbmFnZWQ9Ci1PU19fWHRJc01hbmFnZWRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdElzUmVhbGl6ZWQ9Ci1PU19fWHRJc1JlYWxpemVkXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRJc1N1YmNsYXNzPQotT1NfX1h0SXNTdWJjbGFzc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdElzU3ViY2xhc3NfMT1jYXN0PShXaWRnZXRDbGFzcykKLQotT1NfX1h0SXNUb3BMZXZlbFNoZWxsPQotT1NfX1h0SXNUb3BMZXZlbFNoZWxsXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRMYXN0VGltZXN0YW1wUHJvY2Vzc2VkPQotT1NfX1h0TGFzdFRpbWVzdGFtcFByb2Nlc3NlZF8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1h0TWFsbG9jPQotT1NfX1h0TWFsbG9jXzA9Ci0KLU9TX19YdE1hbmFnZUNoaWxkPQotT1NfX1h0TWFuYWdlQ2hpbGRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdE1hcFdpZGdldD0KLU9TX19YdE1hcFdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0TW92ZVdpZGdldD0KLU9TX19YdE1vdmVXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRNb3ZlV2lkZ2V0XzE9Ci1PU19fWHRNb3ZlV2lkZ2V0XzI9Ci0KLU9TX19YdE5hbWVUb1dpZGdldD0KLU9TX19YdE5hbWVUb1dpZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdE5hbWVUb1dpZGdldF8xPWNhc3Q9KFN0cmluZykKLQotT1NfX1h0T3BlbkRpc3BsYXk9Ci1PU19fWHRPcGVuRGlzcGxheV8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdE9wZW5EaXNwbGF5XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1h0T3BlbkRpc3BsYXlfMj1jYXN0PShTdHJpbmcpCi1PU19fWHRPcGVuRGlzcGxheV8zPWNhc3Q9KFN0cmluZykKLU9TX19YdE9wZW5EaXNwbGF5XzQ9Y2FzdD0oWHJtT3B0aW9uRGVzY1JlYyAqKQotT1NfX1h0T3BlbkRpc3BsYXlfNT0KLU9TX19YdE9wZW5EaXNwbGF5XzY9Y2FzdD0oaW50ICopCi1PU19fWHRPcGVuRGlzcGxheV83PWNhc3Q9KGNoYXIgKiopCi0KLU9TX19YdE92ZXJyaWRlVHJhbnNsYXRpb25zPQotT1NfX1h0T3ZlcnJpZGVUcmFuc2xhdGlvbnNfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRPdmVycmlkZVRyYW5zbGF0aW9uc18xPWNhc3Q9KFh0VHJhbnNsYXRpb25zKQotCi1PU19fWHRPd25TZWxlY3Rpb249Ci1PU19fWHRPd25TZWxlY3Rpb25fMD1jYXN0PShXaWRnZXQpCi1PU19fWHRPd25TZWxlY3Rpb25fMT1jYXN0PShBdG9tKQotT1NfX1h0T3duU2VsZWN0aW9uXzI9Y2FzdD1UaW1lCi1PU19fWHRPd25TZWxlY3Rpb25fMz1jYXN0PVh0Q29udmVydFNlbGVjdGlvblByb2MKLU9TX19YdE93blNlbGVjdGlvbl80PWNhc3Q9KFh0TG9zZVNlbGVjdGlvblByb2MpCi1PU19fWHRPd25TZWxlY3Rpb25fNT1jYXN0PShYdFNlbGVjdGlvbkRvbmVQcm9jKQotCi1PU19fWHRQYXJlbnQ9Ci1PU19fWHRQYXJlbnRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFBhcnNlVHJhbnNsYXRpb25UYWJsZT0KLU9TX19YdFBhcnNlVHJhbnNsYXRpb25UYWJsZV8wPWNhc3Q9KFN0cmluZykKLQotT1NfX1h0UG9wZG93bj0KLU9TX19YdFBvcGRvd25fMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFBvcHVwPQotT1NfX1h0UG9wdXBfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRQb3B1cF8xPQotCi1PU19fWHRRdWVyeUdlb21ldHJ5PQotT1NfX1h0UXVlcnlHZW9tZXRyeV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdFF1ZXJ5R2VvbWV0cnlfMT1jYXN0PShYdFdpZGdldEdlb21ldHJ5ICopCi1PU19fWHRRdWVyeUdlb21ldHJ5XzI9Y2FzdD0oWHRXaWRnZXRHZW9tZXRyeSAqKQotCi1PU19fWHRSZWFsaXplV2lkZ2V0PQotT1NfX1h0UmVhbGl6ZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0UmVnaXN0ZXJEcmF3YWJsZT0KLU9TX19YdFJlZ2lzdGVyRHJhd2FibGVfMD1jYXN0PURpc3BsYXkgKgotT1NfX1h0UmVnaXN0ZXJEcmF3YWJsZV8xPWNhc3Q9RHJhd2FibGUKLU9TX19YdFJlZ2lzdGVyRHJhd2FibGVfMj1jYXN0PVdpZGdldAotCi1PU19fWHRSZW1vdmVFdmVudEhhbmRsZXI9Ci1PU19fWHRSZW1vdmVFdmVudEhhbmRsZXJfMD1jYXN0PVdpZGdldAotT1NfX1h0UmVtb3ZlRXZlbnRIYW5kbGVyXzE9Ci1PU19fWHRSZW1vdmVFdmVudEhhbmRsZXJfMj0KLU9TX19YdFJlbW92ZUV2ZW50SGFuZGxlcl8zPWNhc3Q9WHRFdmVudEhhbmRsZXIKLU9TX19YdFJlbW92ZUV2ZW50SGFuZGxlcl80PWNhc3Q9WHRQb2ludGVyCi0KLU9TX19YdFJlbW92ZUlucHV0PQotT1NfX1h0UmVtb3ZlSW5wdXRfMD1jYXN0PShYdElucHV0SWQpCi0KLU9TX19YdFJlbW92ZVRpbWVPdXQ9Ci1PU19fWHRSZW1vdmVUaW1lT3V0XzA9Ci0KLU9TX19YdFJlc2l6ZVdpZGdldD0KLU9TX19YdFJlc2l6ZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdFJlc2l6ZVdpZGdldF8xPQotT1NfX1h0UmVzaXplV2lkZ2V0XzI9Ci1PU19fWHRSZXNpemVXaWRnZXRfMz0KLQotT1NfX1h0UmVzaXplV2luZG93PQotT1NfX1h0UmVzaXplV2luZG93XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRTZXRMYW5ndWFnZVByb2M9Ci1PU19fWHRTZXRMYW5ndWFnZVByb2NfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRTZXRMYW5ndWFnZVByb2NfMT1jYXN0PShYdExhbmd1YWdlUHJvYykKLU9TX19YdFNldExhbmd1YWdlUHJvY18yPWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1h0U2V0TWFwcGVkV2hlbk1hbmFnZWQ9Ci1PU19fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdFNldE1hcHBlZFdoZW5NYW5hZ2VkXzE9Ci0KLU9TX19YdFNldFZhbHVlcz0KLU9TX19YdFNldFZhbHVlc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdFNldFZhbHVlc18xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWHRTZXRWYWx1ZXNfMj0KLQotT1NfX1h0VG9vbGtpdEluaXRpYWxpemU9Ci0KLU9TX19YdFRvb2xraXRUaHJlYWRJbml0aWFsaXplPQotCi1PU19fWHRUcmFuc2xhdGVDb29yZHM9Ci1PU19fWHRUcmFuc2xhdGVDb29yZHNfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRUcmFuc2xhdGVDb29yZHNfMT0KLU9TX19YdFRyYW5zbGF0ZUNvb3Jkc18yPQotT1NfX1h0VHJhbnNsYXRlQ29vcmRzXzM9Ci1PU19fWHRUcmFuc2xhdGVDb29yZHNfND0KLQotT1NfX1h0VW5tYW5hZ2VDaGlsZD0KLU9TX19YdFVubWFuYWdlQ2hpbGRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFVubWFwV2lkZ2V0PQotT1NfX1h0VW5tYXBXaWRnZXRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFVucmVnaXN0ZXJEcmF3YWJsZT0KLU9TX19YdFVucmVnaXN0ZXJEcmF3YWJsZV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWHRVbnJlZ2lzdGVyRHJhd2FibGVfMT1jYXN0PURyYXdhYmxlCi0KLU9TX19YdFdpbmRvdz0KLU9TX19YdFdpbmRvd18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0V2luZG93VG9XaWRnZXQ9Ci1PU19fWHRXaW5kb3dUb1dpZGdldF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YdFdpbmRvd1RvV2lkZ2V0XzE9Y2FzdD0oV2luZG93KQotCi1PU19fX1htU2V0TWVudVRyYXZlcnNhbD0KLU9TX19fWG1TZXRNZW51VHJhdmVyc2FsXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX19YbVNldE1lbnVUcmF2ZXJzYWxfMT0KLQotT1NfX2FwcGxpY2F0aW9uU2hlbGxXaWRnZXRDbGFzcz1mbGFncz1jb25zdAotCi1PU19fb3ZlcnJpZGVTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX19zaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX190b3BMZXZlbFNoZWxsV2lkZ2V0Q2xhc3M9ZmxhZ3M9Y29uc3QKLQotT1NfX3RyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3M9ZmxhZ3M9Y29uc3QKLQotT1NfX3htTWVudVNoZWxsV2lkZ2V0Q2xhc3M9ZmxhZ3M9Y29uc3QKLQotT1NfY2xvc2U9Ci1PU19jbG9zZV8wPQotCi1PU19mZF9zZXRfc2l6ZW9mPQotCi1PU19nZXRlbnY9Ci1PU19nZXRlbnZfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX2ljb252PQotT1NfaWNvbnZfMD1jYXN0PShpY29udl90KQotT1NfaWNvbnZfMT1jYXN0PSh2b2lkICopCi1PU19pY29udl8yPWNhc3Q9KHNpemVfdCAqKQotT1NfaWNvbnZfMz1jYXN0PShjaGFyICoqKQotT1NfaWNvbnZfND1jYXN0PShzaXplX3QgKikKLQotT1NfaWNvbnZfY2xvc2U9Ci1PU19pY29udl9jbG9zZV8wPWNhc3Q9KGljb252X3QpCi0KLU9TX2ljb252X29wZW49Ci1PU19pY29udl9vcGVuXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfaWNvbnZfb3Blbl8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfbG9jYWxlY29udl9kZWNpbWFsX3BvaW50PQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQnV0dG9uRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQnV0dG9uRXZlbnRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQnV0dG9uRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ29uZmlndXJlRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXhwb3NlRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSW1hZ2VfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hLZXlFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hLZXlFdmVudF8ySV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklfMT1jYXN0PWNvbnN0IHZvaWQgKixmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hLZXlFdmVudF8ySV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lfM0JJPQotT1NfbWVtbW92ZV9fSV8zQklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNCSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JXzNCSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSV8zQ0k9Ci1PU19tZW1tb3ZlX19JXzNDSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lfM0NJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JXzNJST0KLU9TX21lbW1vdmVfX0lfM0lJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zSUlfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSV8zSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lfM1NJPQotT1NfbWVtbW92ZV9fSV8zU0lfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JXzNTSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JXzNTSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2hhclN0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDaGFyU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENoYXJTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2hhclN0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyb3NzaW5nRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3Jvc3NpbmdFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWERlc3Ryb3lXaW5kb3dFdmVudF8ySUlfMD1jYXN0PXZvaWQgKixmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hEZXN0cm95V2luZG93RXZlbnRfMklJXzI9Y2FzdD1zaXplX3QKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnRfMklJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV2ZW50XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFdmVudF8ySUlfMj1jYXN0PXNpemVfdAotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9jdXNDaGFuZ2VFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb2N1c0NoYW5nZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb250U3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvbnRTdHJ1Y3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9udFN0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb250U3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSWNvblNpemVfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSWNvblNpemVfMklJXzA9Y2FzdD12b2lkICosZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEljb25TaXplXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEljb25TaXplXzJJSV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUHJvcGVydHlFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50XzJJSV8wPWNhc3Q9dm9pZCAqLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50XzJJSV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFJlcGFyZW50RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVwYXJlbnRFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZXBhcmVudEV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFJlcGFyZW50RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1BbnlDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htQW55Q2FsbGJhY2tTdHJ1Y3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbUFueUNhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1BbnlDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fXzNCSUk9Ci1PU19tZW1tb3ZlX19fM0JJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX18zQklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNCSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zQ0lJPQotT1NfbWVtbW92ZV9fXzNDSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19fM0NJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zQ0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19fM0lJST0KLU9TX21lbW1vdmVfX18zSUlJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fXzNJSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19fM0lJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbmxfbGFuZ2luZm89Ci1PU19ubF9sYW5naW5mb18wPQotCi1PU19waXBlPQotT1NfcGlwZV8wPWNhc3Q9KGludCAqKQotCi1PU19yZWFkPQotT1NfcmVhZF8wPQotT1NfcmVhZF8xPWNhc3Q9KGNoYXIgKikKLU9TX3JlYWRfMj0KLQotT1Nfc2VsZWN0PQotT1Nfc2VsZWN0XzA9Ci1PU19zZWxlY3RfMT1jYXN0PShmZF9zZXQgKikKLU9TX3NlbGVjdF8yPWNhc3Q9KGZkX3NldCAqKQotT1Nfc2VsZWN0XzM9Y2FzdD0oZmRfc2V0ICopCi1PU19zZWxlY3RfND1jYXN0PShzdHJ1Y3QgdGltZXZhbCAqKQotCi1PU19zZXRSZXNvdXJjZU1lbT1mbGFncz1ub19nZW4KLU9TX3NldFJlc291cmNlTWVtXzA9Ci1PU19zZXRSZXNvdXJjZU1lbV8xPQotCi1PU19zZXRsb2NhbGU9Ci1PU19zZXRsb2NhbGVfMD0KLU9TX3NldGxvY2FsZV8xPWNhc3Q9KGNoYXIgKikKLQotT1Nfc3RybGVuPQotT1Nfc3RybGVuXzA9Y2FzdD0oY2hhciAqKQotCi1PU193cml0ZT0KLU9TX3dyaXRlXzA9Ci1PU193cml0ZV8xPWNhc3Q9KGNoYXIgKikKLU9TX3dyaXRlXzI9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1Zpc3VhbD0KLVZpc3VhbF9leHRfZGF0YT1jYXN0PShYRXh0RGF0YSAqKQotVmlzdWFsX3Zpc3VhbGlkPQotVmlzdWFsX2NfY2xhc3M9YWNjZXNzb3I9Y2xhc3MKLVZpc3VhbF9yZWRfbWFzaz0KLVZpc3VhbF9ncmVlbl9tYXNrPQotVmlzdWFsX2JsdWVfbWFzaz0KLVZpc3VhbF9iaXRzX3Blcl9yZ2I9Ci1WaXN1YWxfbWFwX2VudHJpZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQW55RXZlbnQ9Ci1YQW55RXZlbnRfc2VyaWFsPQotWEFueUV2ZW50X3NlbmRfZXZlbnQ9Ci1YQW55RXZlbnRfZGlzcGxheT1jYXN0PShEaXNwbGF5ICopCi1YQW55RXZlbnRfd2luZG93PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50PQotWEJ1dHRvbkV2ZW50X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfc3Vid2luZG93PQotWEJ1dHRvbkV2ZW50X3RpbWU9Ci1YQnV0dG9uRXZlbnRfeD0KLVhCdXR0b25FdmVudF95PQotWEJ1dHRvbkV2ZW50X3hfcm9vdD0KLVhCdXR0b25FdmVudF95X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfc3RhdGU9Ci1YQnV0dG9uRXZlbnRfYnV0dG9uPQotWEJ1dHRvbkV2ZW50X3NhbWVfc2NyZWVuPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENoYXJTdHJ1Y3Q9Ci1YQ2hhclN0cnVjdF9sYmVhcmluZz0KLVhDaGFyU3RydWN0X3JiZWFyaW5nPQotWENoYXJTdHJ1Y3Rfd2lkdGg9Ci1YQ2hhclN0cnVjdF9hc2NlbnQ9Ci1YQ2hhclN0cnVjdF9kZXNjZW50PQotWENoYXJTdHJ1Y3RfYXR0cmlidXRlcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnQ9Ci1YQ2xpZW50TWVzc2FnZUV2ZW50X21lc3NhZ2VfdHlwZT1jYXN0PUF0b20KLVhDbGllbnRNZXNzYWdlRXZlbnRfZm9ybWF0PQotWENsaWVudE1lc3NhZ2VFdmVudF9kYXRhPWFjY2Vzc29yPWRhdGEubCxjYXN0PWxvbmcgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbG9yPQotWENvbG9yX3BpeGVsPQotWENvbG9yX3JlZD0KLVhDb2xvcl9ncmVlbj0KLVhDb2xvcl9ibHVlPQotWENvbG9yX2ZsYWdzPQotWENvbG9yX3BhZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudD0KLVhDb25maWd1cmVFdmVudF9zZXJpYWw9Ci1YQ29uZmlndXJlRXZlbnRfc2VuZF9ldmVudD0KLVhDb25maWd1cmVFdmVudF9kaXNwbGF5PWNhc3Q9RGlzcGxheSAqCi1YQ29uZmlndXJlRXZlbnRfZXZlbnQ9Y2FzdD1XaW5kb3cKLVhDb25maWd1cmVFdmVudF93aW5kb3c9Y2FzdD1XaW5kb3cKLVhDb25maWd1cmVFdmVudF94PQotWENvbmZpZ3VyZUV2ZW50X3k9Ci1YQ29uZmlndXJlRXZlbnRfd2lkdGg9Ci1YQ29uZmlndXJlRXZlbnRfaGVpZ2h0PQotWENvbmZpZ3VyZUV2ZW50X2JvcmRlcl93aWR0aD0KLVhDb25maWd1cmVFdmVudF9hYm92ZT1jYXN0PVdpbmRvdwotWENvbmZpZ3VyZUV2ZW50X292ZXJyaWRlX3JlZGlyZWN0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyZWF0ZVdpbmRvd0V2ZW50PQotWENyZWF0ZVdpbmRvd0V2ZW50X3NlcmlhbD0KLVhDcmVhdGVXaW5kb3dFdmVudF9zZW5kX2V2ZW50PQotWENyZWF0ZVdpbmRvd0V2ZW50X2Rpc3BsYXk9Y2FzdD0oRGlzcGxheSAqKQotWENyZWF0ZVdpbmRvd0V2ZW50X3BhcmVudD1jYXN0PVdpbmRvdwotWENyZWF0ZVdpbmRvd0V2ZW50X3dpbmRvdz1jYXN0PVdpbmRvdwotWENyZWF0ZVdpbmRvd0V2ZW50X3g9Ci1YQ3JlYXRlV2luZG93RXZlbnRfeT0KLVhDcmVhdGVXaW5kb3dFdmVudF93aWR0aD0KLVhDcmVhdGVXaW5kb3dFdmVudF9oZWlnaHQ9Ci1YQ3JlYXRlV2luZG93RXZlbnRfYm9yZGVyX3dpZHRoPQotWENyZWF0ZVdpbmRvd0V2ZW50X292ZXJyaWRlX3JlZGlyZWN0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyb3NzaW5nRXZlbnQ9Ci1YQ3Jvc3NpbmdFdmVudF9yb290PQotWENyb3NzaW5nRXZlbnRfc3Vid2luZG93PQotWENyb3NzaW5nRXZlbnRfdGltZT0KLVhDcm9zc2luZ0V2ZW50X3g9Ci1YQ3Jvc3NpbmdFdmVudF95PQotWENyb3NzaW5nRXZlbnRfeF9yb290PQotWENyb3NzaW5nRXZlbnRfeV9yb290PQotWENyb3NzaW5nRXZlbnRfbW9kZT0KLVhDcm9zc2luZ0V2ZW50X2RldGFpbD0KLVhDcm9zc2luZ0V2ZW50X3NhbWVfc2NyZWVuPQotWENyb3NzaW5nRXZlbnRfZm9jdXM9Ci1YQ3Jvc3NpbmdFdmVudF9zdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hEZXN0cm95V2luZG93RXZlbnQ9Ci1YRGVzdHJveVdpbmRvd0V2ZW50X3NlcmlhbD0KLVhEZXN0cm95V2luZG93RXZlbnRfc2VuZF9ldmVudD0KLVhEZXN0cm95V2luZG93RXZlbnRfZGlzcGxheT1jYXN0PURpc3BsYXkgKgotWERlc3Ryb3lXaW5kb3dFdmVudF9ldmVudD1jYXN0PVdpbmRvdwotWERlc3Ryb3lXaW5kb3dFdmVudF93aW5kb3c9Y2FzdD1XaW5kb3cKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFdmVudD0KLVhFdmVudF90eXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV4cG9zZUV2ZW50PQotWEV4cG9zZUV2ZW50X3g9Ci1YRXhwb3NlRXZlbnRfeT0KLVhFeHBvc2VFdmVudF93aWR0aD0KLVhFeHBvc2VFdmVudF9oZWlnaHQ9Ci1YRXhwb3NlRXZlbnRfY291bnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9jdXNDaGFuZ2VFdmVudD0KLVhGb2N1c0NoYW5nZUV2ZW50X21vZGU9Ci1YRm9jdXNDaGFuZ2VFdmVudF9kZXRhaWw9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9udFN0cnVjdD0KLVhGb250U3RydWN0X2V4dF9kYXRhPWNhc3Q9KFhFeHREYXRhICopCi1YRm9udFN0cnVjdF9maWQ9Ci1YRm9udFN0cnVjdF9kaXJlY3Rpb249Ci1YRm9udFN0cnVjdF9taW5fY2hhcl9vcl9ieXRlMj0KLVhGb250U3RydWN0X21heF9jaGFyX29yX2J5dGUyPQotWEZvbnRTdHJ1Y3RfbWluX2J5dGUxPQotWEZvbnRTdHJ1Y3RfbWF4X2J5dGUxPQotWEZvbnRTdHJ1Y3RfYWxsX2NoYXJzX2V4aXN0PQotWEZvbnRTdHJ1Y3RfZGVmYXVsdF9jaGFyPQotWEZvbnRTdHJ1Y3Rfbl9wcm9wZXJ0aWVzPQotWEZvbnRTdHJ1Y3RfcHJvcGVydGllcz1jYXN0PShYRm9udFByb3AgKikKLVhGb250U3RydWN0X21pbl9ib3VuZHNfbGJlYXJpbmc9YWNjZXNzb3I9bWluX2JvdW5kcy5sYmVhcmluZwotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc19yYmVhcmluZz1hY2Nlc3Nvcj1taW5fYm91bmRzLnJiZWFyaW5nCi1YRm9udFN0cnVjdF9taW5fYm91bmRzX3dpZHRoPWFjY2Vzc29yPW1pbl9ib3VuZHMud2lkdGgKLVhGb250U3RydWN0X21pbl9ib3VuZHNfYXNjZW50PWFjY2Vzc29yPW1pbl9ib3VuZHMuYXNjZW50Ci1YRm9udFN0cnVjdF9taW5fYm91bmRzX2Rlc2NlbnQ9YWNjZXNzb3I9bWluX2JvdW5kcy5kZXNjZW50Ci1YRm9udFN0cnVjdF9taW5fYm91bmRzX2F0dHJpYnV0ZXM9YWNjZXNzb3I9bWluX2JvdW5kcy5hdHRyaWJ1dGVzCi1YRm9udFN0cnVjdF9tYXhfYm91bmRzX2xiZWFyaW5nPWFjY2Vzc29yPW1heF9ib3VuZHMubGJlYXJpbmcKLVhGb250U3RydWN0X21heF9ib3VuZHNfcmJlYXJpbmc9YWNjZXNzb3I9bWF4X2JvdW5kcy5yYmVhcmluZwotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc193aWR0aD1hY2Nlc3Nvcj1tYXhfYm91bmRzLndpZHRoCi1YRm9udFN0cnVjdF9tYXhfYm91bmRzX2FzY2VudD1hY2Nlc3Nvcj1tYXhfYm91bmRzLmFzY2VudAotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc19kZXNjZW50PWFjY2Vzc29yPW1heF9ib3VuZHMuZGVzY2VudAotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc19hdHRyaWJ1dGVzPWFjY2Vzc29yPW1heF9ib3VuZHMuYXR0cmlidXRlcwotWEZvbnRTdHJ1Y3RfcGVyX2NoYXI9Y2FzdD0oWENoYXJTdHJ1Y3QgKikKLVhGb250U3RydWN0X2FzY2VudD0KLVhGb250U3RydWN0X2Rlc2NlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YR0NWYWx1ZXM9Ci1YR0NWYWx1ZXNfZnVuY3Rpb249Ci1YR0NWYWx1ZXNfcGxhbmVfbWFzaz0KLVhHQ1ZhbHVlc19mb3JlZ3JvdW5kPQotWEdDVmFsdWVzX2JhY2tncm91bmQ9Ci1YR0NWYWx1ZXNfbGluZV93aWR0aD0KLVhHQ1ZhbHVlc19saW5lX3N0eWxlPQotWEdDVmFsdWVzX2NhcF9zdHlsZT0KLVhHQ1ZhbHVlc19qb2luX3N0eWxlPQotWEdDVmFsdWVzX2ZpbGxfc3R5bGU9Ci1YR0NWYWx1ZXNfZmlsbF9ydWxlPQotWEdDVmFsdWVzX2FyY19tb2RlPQotWEdDVmFsdWVzX3RpbGU9Ci1YR0NWYWx1ZXNfc3RpcHBsZT0KLVhHQ1ZhbHVlc190c194X29yaWdpbj0KLVhHQ1ZhbHVlc190c195X29yaWdpbj0KLVhHQ1ZhbHVlc19mb250PQotWEdDVmFsdWVzX3N1YndpbmRvd19tb2RlPQotWEdDVmFsdWVzX2dyYXBoaWNzX2V4cG9zdXJlcz0KLVhHQ1ZhbHVlc19jbGlwX3hfb3JpZ2luPQotWEdDVmFsdWVzX2NsaXBfeV9vcmlnaW49Ci1YR0NWYWx1ZXNfY2xpcF9tYXNrPQotWEdDVmFsdWVzX2Rhc2hfb2Zmc2V0PQotWEdDVmFsdWVzX2Rhc2hlcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJY29uU2l6ZT0KLVhJY29uU2l6ZV9taW5fd2lkdGg9Ci1YSWNvblNpemVfbWluX2hlaWdodD0KLVhJY29uU2l6ZV9tYXhfd2lkdGg9Ci1YSWNvblNpemVfbWF4X2hlaWdodD0KLVhJY29uU2l6ZV93aWR0aF9pbmM9Ci1YSWNvblNpemVfaGVpZ2h0X2luYz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZT0KLVhJbWFnZV93aWR0aD0KLVhJbWFnZV9oZWlnaHQ9Ci1YSW1hZ2VfeG9mZnNldD0KLVhJbWFnZV9mb3JtYXQ9Ci1YSW1hZ2VfZGF0YT1jYXN0PShjaGFyICopCi1YSW1hZ2VfYnl0ZV9vcmRlcj0KLVhJbWFnZV9iaXRtYXBfdW5pdD0KLVhJbWFnZV9iaXRtYXBfYml0X29yZGVyPQotWEltYWdlX2JpdG1hcF9wYWQ9Ci1YSW1hZ2VfZGVwdGg9Ci1YSW1hZ2VfYnl0ZXNfcGVyX2xpbmU9Ci1YSW1hZ2VfYml0c19wZXJfcGl4ZWw9Ci1YSW1hZ2VfcmVkX21hc2s9Ci1YSW1hZ2VfZ3JlZW5fbWFzaz0KLVhJbWFnZV9ibHVlX21hc2s9Ci1YSW1hZ2Vfb2JkYXRhPWNhc3Q9KFhQb2ludGVyKQotWEltYWdlX2NyZWF0ZV9pbWFnZT1hY2Nlc3Nvcj1mLmNyZWF0ZV9pbWFnZSxjYXN0PShYSW1hZ2UgKigqKSgpKQotWEltYWdlX2Rlc3Ryb3lfaW1hZ2U9YWNjZXNzb3I9Zi5kZXN0cm95X2ltYWdlLGNhc3Q9KGludCgqKSgpKQotWEltYWdlX2dldF9waXhlbD1hY2Nlc3Nvcj1mLmdldF9waXhlbCxjYXN0PSh1bnNpZ25lZCBsb25nKCopKCkpCi1YSW1hZ2VfcHV0X3BpeGVsPWFjY2Vzc29yPWYucHV0X3BpeGVsLGNhc3Q9KGludCgqKSgpKQotWEltYWdlX3N1Yl9pbWFnZT1hY2Nlc3Nvcj1mLnN1Yl9pbWFnZSxjYXN0PShYSW1hZ2UgKigqKSgpKQotWEltYWdlX2FkZF9waXhlbD1hY2Nlc3Nvcj1mLmFkZF9waXhlbCxjYXN0PShpbnQoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hLZXlFdmVudD0KLVhLZXlFdmVudF9yb290PQotWEtleUV2ZW50X3N1YndpbmRvdz0KLVhLZXlFdmVudF90aW1lPQotWEtleUV2ZW50X3g9Ci1YS2V5RXZlbnRfeT0KLVhLZXlFdmVudF94X3Jvb3Q9Ci1YS2V5RXZlbnRfeV9yb290PQotWEtleUV2ZW50X3N0YXRlPQotWEtleUV2ZW50X2tleWNvZGU9Ci1YS2V5RXZlbnRfc2FtZV9zY3JlZW49Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YTW9kaWZpZXJLZXltYXA9Ci1YTW9kaWZpZXJLZXltYXBfbWF4X2tleXBlcm1vZD0KLVhNb2RpZmllcktleW1hcF9tb2RpZmllcm1hcD1jYXN0PShLZXlDb2RlICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YTW90aW9uRXZlbnQ9Ci1YTW90aW9uRXZlbnRfcm9vdD0KLVhNb3Rpb25FdmVudF9zdWJ3aW5kb3c9Ci1YTW90aW9uRXZlbnRfdGltZT0KLVhNb3Rpb25FdmVudF94PQotWE1vdGlvbkV2ZW50X3k9Ci1YTW90aW9uRXZlbnRfeF9yb290PQotWE1vdGlvbkV2ZW50X3lfcm9vdD0KLVhNb3Rpb25FdmVudF9zdGF0ZT0KLVhNb3Rpb25FdmVudF9pc19oaW50PQotWE1vdGlvbkV2ZW50X3NhbWVfc2NyZWVuPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFByb3BlcnR5RXZlbnQ9Ci1YUHJvcGVydHlFdmVudF9hdG9tPQotWFByb3BlcnR5RXZlbnRfdGltZT0KLVhQcm9wZXJ0eUV2ZW50X3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFJlY3RhbmdsZT0KLVhSZWN0YW5nbGVfeD0KLVhSZWN0YW5nbGVfeT0KLVhSZWN0YW5nbGVfd2lkdGg9Ci1YUmVjdGFuZ2xlX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZW5kZXJQaWN0dXJlQXR0cmlidXRlcz0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19yZXBlYXQ9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfYWxwaGFfbWFwPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX3hfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX3lfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NsaXBfeF9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY2xpcF95X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jbGlwX21hc2s9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfZ3JhcGhpY3NfZXhwb3N1cmVzPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3N1YndpbmRvd19tb2RlPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3BvbHlfZWRnZT0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19wb2x5X21vZGU9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfZGl0aGVyPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NvbXBvbmVudF9hbHBoYT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZXBhcmVudEV2ZW50PQotWFJlcGFyZW50RXZlbnRfc2VyaWFsPQotWFJlcGFyZW50RXZlbnRfc2VuZF9ldmVudD0KLVhSZXBhcmVudEV2ZW50X2Rpc3BsYXk9Y2FzdD1EaXNwbGF5ICoKLVhSZXBhcmVudEV2ZW50X2V2ZW50PWNhc3Q9V2luZG93Ci1YUmVwYXJlbnRFdmVudF93aW5kb3c9Y2FzdD1XaW5kb3cKLVhSZXBhcmVudEV2ZW50X3BhcmVudD1jYXN0PVdpbmRvdwotWFJlcGFyZW50RXZlbnRfeD0KLVhSZXBhcmVudEV2ZW50X3k9Ci1YUmVwYXJlbnRFdmVudF9vdmVycmlkZV9yZWRpcmVjdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hTZXRXaW5kb3dBdHRyaWJ1dGVzPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2dyb3VuZF9waXhtYXA9Ci1YU2V0V2luZG93QXR0cmlidXRlc19iYWNrZ3JvdW5kX3BpeGVsPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYm9yZGVyX3BpeG1hcD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JvcmRlcl9waXhlbD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JpdF9ncmF2aXR5PQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfd2luX2dyYXZpdHk9Ci1YU2V0V2luZG93QXR0cmlidXRlc19iYWNraW5nX3N0b3JlPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19wbGFuZXM9Ci1YU2V0V2luZG93QXR0cmlidXRlc19iYWNraW5nX3BpeGVsPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfc2F2ZV91bmRlcj0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2V2ZW50X21hc2s9Ci1YU2V0V2luZG93QXR0cmlidXRlc19kb19ub3RfcHJvcGFnYXRlX21hc2s9Ci1YU2V0V2luZG93QXR0cmlidXRlc19vdmVycmlkZV9yZWRpcmVjdD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2NvbG9ybWFwPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfY3Vyc29yPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFNpemVIaW50cz0KLVhTaXplSGludHNfZmxhZ3M9Ci1YU2l6ZUhpbnRzX3g9Ci1YU2l6ZUhpbnRzX3k9Ci1YU2l6ZUhpbnRzX3dpZHRoPQotWFNpemVIaW50c19oZWlnaHQ9Ci1YU2l6ZUhpbnRzX21pbl93aWR0aD0KLVhTaXplSGludHNfbWluX2hlaWdodD0KLVhTaXplSGludHNfbWF4X3dpZHRoPQotWFNpemVIaW50c19tYXhfaGVpZ2h0PQotWFNpemVIaW50c193aWR0aF9pbmM9Ci1YU2l6ZUhpbnRzX2hlaWdodF9pbmM9Ci1YU2l6ZUhpbnRzX2FzcGVjdF94PWFjY2Vzc29yPW1pbl9hc3BlY3QueAotWFNpemVIaW50c19hc3BlY3RfeT1hY2Nlc3Nvcj1taW5fYXNwZWN0LnkKLVhTaXplSGludHNfYmFzZV93aWR0aD0KLVhTaXplSGludHNfYmFzZV9oZWlnaHQ9Ci1YU2l6ZUhpbnRzX3dpbl9ncmF2aXR5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFRleHRQcm9wZXJ0eT0KLVhUZXh0UHJvcGVydHlfdmFsdWU9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotWFRleHRQcm9wZXJ0eV9lbmNvZGluZz0KLVhUZXh0UHJvcGVydHlfZm9ybWF0PQotWFRleHRQcm9wZXJ0eV9uaXRlbXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YV2luZG93QXR0cmlidXRlcz0KLVhXaW5kb3dBdHRyaWJ1dGVzX3g9Ci1YV2luZG93QXR0cmlidXRlc195PQotWFdpbmRvd0F0dHJpYnV0ZXNfd2lkdGg9Ci1YV2luZG93QXR0cmlidXRlc19oZWlnaHQ9Ci1YV2luZG93QXR0cmlidXRlc19ib3JkZXJfd2lkdGg9Ci1YV2luZG93QXR0cmlidXRlc19kZXB0aD0KLVhXaW5kb3dBdHRyaWJ1dGVzX3Zpc3VhbD1jYXN0PShWaXN1YWwgKikKLVhXaW5kb3dBdHRyaWJ1dGVzX3Jvb3Q9Ci1YV2luZG93QXR0cmlidXRlc19jX2NsYXNzPWFjY2Vzc29yPWNsYXNzCi1YV2luZG93QXR0cmlidXRlc19iaXRfZ3Jhdml0eT0KLVhXaW5kb3dBdHRyaWJ1dGVzX3dpbl9ncmF2aXR5PQotWFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19zdG9yZT0KLVhXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfcGxhbmVzPQotWFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19waXhlbD0KLVhXaW5kb3dBdHRyaWJ1dGVzX3NhdmVfdW5kZXI9Ci1YV2luZG93QXR0cmlidXRlc19jb2xvcm1hcD0KLVhXaW5kb3dBdHRyaWJ1dGVzX21hcF9pbnN0YWxsZWQ9Ci1YV2luZG93QXR0cmlidXRlc19tYXBfc3RhdGU9Ci1YV2luZG93QXR0cmlidXRlc19hbGxfZXZlbnRfbWFza3M9Ci1YV2luZG93QXR0cmlidXRlc195b3VyX2V2ZW50X21hc2s9Ci1YV2luZG93QXR0cmlidXRlc19kb19ub3RfcHJvcGFnYXRlX21hc2s9Ci1YV2luZG93QXR0cmlidXRlc19vdmVycmlkZV9yZWRpcmVjdD0KLVhXaW5kb3dBdHRyaWJ1dGVzX3NjcmVlbj1jYXN0PShTY3JlZW4gKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hXaW5kb3dDaGFuZ2VzPQotWFdpbmRvd0NoYW5nZXNfeD0KLVhXaW5kb3dDaGFuZ2VzX3k9Ci1YV2luZG93Q2hhbmdlc193aWR0aD0KLVhXaW5kb3dDaGFuZ2VzX2hlaWdodD0KLVhXaW5kb3dDaGFuZ2VzX2JvcmRlcl93aWR0aD0KLVhXaW5kb3dDaGFuZ2VzX3NpYmxpbmc9Ci1YV2luZG93Q2hhbmdlc19zdGFja19tb2RlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWGluZXJhbWFTY3JlZW5JbmZvPQotWGluZXJhbWFTY3JlZW5JbmZvX3NjcmVlbl9udW1iZXI9Ci1YaW5lcmFtYVNjcmVlbkluZm9feF9vcmc9Ci1YaW5lcmFtYVNjcmVlbkluZm9feV9vcmc9Ci1YaW5lcmFtYVNjcmVlbkluZm9fd2lkdGg9Ci1YaW5lcmFtYVNjcmVlbkluZm9faGVpZ2h0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1BbnlDYWxsYmFja1N0cnVjdD0KLVhtQW55Q2FsbGJhY2tTdHJ1Y3RfcmVhc29uPQotWG1BbnlDYWxsYmFja1N0cnVjdF9ldmVudD1jYXN0PShYRXZlbnQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdD0KLVhtRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF90aW1lU3RhbXA9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJhZ0NvbnRleHQ9Y2FzdD0oV2lkZ2V0KQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X3g9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfeT0KLVhtRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF9kcm9wU2l0ZVN0YXR1cz0KLVhtRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF9vcGVyYXRpb249Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9ucz0KLVhtRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF9hbmltYXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3Q9Ci1YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF90aW1lU3RhbXA9Ci1YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF9vcGVyYXRpb249Ci1YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF9vcGVyYXRpb25zPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfZHJvcFNpdGVTdGF0dXM9Ci1YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF9kcm9wQWN0aW9uPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfY29tcGxldGlvblN0YXR1cz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcFByb2NDYWxsYmFja1N0cnVjdD0KLVhtRHJvcFByb2NDYWxsYmFja1N0cnVjdF90aW1lU3RhbXA9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJhZ0NvbnRleHQ9Y2FzdD0oV2lkZ2V0KQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X3g9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfeT0KLVhtRHJvcFByb2NDYWxsYmFja1N0cnVjdF9kcm9wU2l0ZVN0YXR1cz0KLVhtRHJvcFByb2NDYWxsYmFja1N0cnVjdF9vcGVyYXRpb249Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9ucz0KLVhtRHJvcFByb2NDYWxsYmFja1N0cnVjdF9kcm9wQWN0aW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3Q9Ci1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF93aWRnZXQ9Y2FzdD1XaWRnZXQKLVhtU3BpbkJveENhbGxiYWNrU3RydWN0X2RvaXQ9Y2FzdD1Cb29sZWFuCi1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF9wb3NpdGlvbj0KLVhtU3BpbkJveENhbGxiYWNrU3RydWN0X3ZhbHVlPWNhc3Q9WG1TdHJpbmcKLVhtU3BpbkJveENhbGxiYWNrU3RydWN0X2Nyb3NzZWRfYm91bmRhcnk9Y2FzdD1Cb29sZWFuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlYz0KLVhtVGV4dEJsb2NrUmVjX3B0cj1jYXN0PShjaGFyICopCi1YbVRleHRCbG9ja1JlY19sZW5ndGg9Ci1YbVRleHRCbG9ja1JlY19mb3JtYXQ9Y2FzdD0oWG1UZXh0Rm9ybWF0KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3Q9Ci1YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF9kb2l0PQotWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfY3Vyckluc2VydD0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X25ld0luc2VydD0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X3N0YXJ0UG9zPQotWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfZW5kUG9zPQotWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfdGV4dD1jYXN0PShYbVRleHRCbG9jaykKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1h0V2lkZ2V0R2VvbWV0cnk9Ci1YdFdpZGdldEdlb21ldHJ5X3JlcXVlc3RfbW9kZT0KLVh0V2lkZ2V0R2VvbWV0cnlfeD0KLVh0V2lkZ2V0R2VvbWV0cnlfeT0KLVh0V2lkZ2V0R2VvbWV0cnlfd2lkdGg9Ci1YdFdpZGdldEdlb21ldHJ5X2hlaWdodD0KLVh0V2lkZ2V0R2VvbWV0cnlfYm9yZGVyX3dpZHRoPQotWHRXaWRnZXRHZW9tZXRyeV9zaWJsaW5nPWNhc3Q9KFdpZGdldCkKLVh0V2lkZ2V0R2VvbWV0cnlfc3RhY2tfbW9kZT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEuWFBDT00ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwNTI4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEuWFBDT00ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9YUENPTT1mbGFncz1jcHAKLVhQQ09NX0NhbGw9Ci1YUENPTV9DYWxsXzA9Y2FzdD0obnNXcml0ZVNlZ21lbnRGdW4pCi1YUENPTV9DYWxsXzE9Y2FzdD0obnNJSW5wdXRTdHJlYW0gKikKLVhQQ09NX0NhbGxfMj1jYXN0PSh2b2lkICopCi1YUENPTV9DYWxsXzM9Y2FzdD0oY29uc3QgY2hhciAqKQotWFBDT01fQ2FsbF80PQotWFBDT01fQ2FsbF81PQotWFBDT01fQ2FsbF82PWNhc3Q9KFBSVWludDMyICopCi0KLVhQQ09NX05TX0dldENvbXBvbmVudE1hbmFnZXI9Ci1YUENPTV9OU19HZXRDb21wb25lbnRNYW5hZ2VyXzA9Y2FzdD0obnNJQ29tcG9uZW50TWFuYWdlcioqKQotCi1YUENPTV9OU19HZXRTZXJ2aWNlTWFuYWdlcj0KLVhQQ09NX05TX0dldFNlcnZpY2VNYW5hZ2VyXzA9Y2FzdD0obnNJU2VydmljZU1hbmFnZXIqKikKLQotWFBDT01fTlNfSW5pdEVtYmVkZGluZz0KLVhQQ09NX05TX0luaXRFbWJlZGRpbmdfMD1jYXN0PShuc0lMb2NhbEZpbGUgKikKLVhQQ09NX05TX0luaXRFbWJlZGRpbmdfMT1jYXN0PShuc0lEaXJlY3RvcnlTZXJ2aWNlUHJvdmlkZXIgKikKLQotWFBDT01fTlNfTmV3TG9jYWxGaWxlPQotWFBDT01fTlNfTmV3TG9jYWxGaWxlXzA9Y2FzdD0obnNBU3RyaW5nICopLGZsYWdzPXN0cnVjdAotWFBDT01fTlNfTmV3TG9jYWxGaWxlXzE9Ci1YUENPTV9OU19OZXdMb2NhbEZpbGVfMj1jYXN0PShuc0lMb2NhbEZpbGUqKikKLQotWFBDT01fTlNfVGVybUVtYmVkZGluZz0KLQotWFBDT01fUFJfRnJlZT0KLVhQQ09NX1BSX0ZyZWVfMD1jYXN0PSh2b2lkICopCi0KLVhQQ09NX1BSX01hbGxvYz0KLVhQQ09NX1BSX01hbGxvY18wPQotCi1YUENPTV9WdGJsQ2FsbF9fSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8xPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlGPQotWFBDT01fVnRibENhbGxfX0lJRl8wPQotWFBDT01fVnRibENhbGxfX0lJRl8xPQotWFBDT01fVnRibENhbGxfX0lJRl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJPQotWFBDT01fVnRibENhbGxfX0lJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV82PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl81PQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfNj0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV84PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMTA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMTE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMTI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMTM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ18wPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ18zPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaPQotWFBDT01fVnRibENhbGxfX0lJSUlKWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlKWl8xPQotWFBDT01fVnRibENhbGxfX0lJSUlKWl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlKWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlKWl80PQotWFBDT01fVnRibENhbGxfX0lJSUlKWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSVpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl8xPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSVpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ18xPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ180PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSl8xPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSko9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSkpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl8xPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSkpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8xPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaPQotWFBDT01fVnRibENhbGxfX0lJSVpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8yPQotWFBDT01fVnRibENhbGxfX0lJSVpfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSVpaPQotWFBDT01fVnRibENhbGxfX0lJSVpaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl8yPQotWFBDT01fVnRibENhbGxfX0lJSVpaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfND0KLQotWFBDT01fVnRibENhbGxfX0lJSVpaSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV8zPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV80PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV83PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfOT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8xNj0KLQotWFBDT01fVnRibENhbGxfX0lJSVpfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSVpfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSVpfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV84PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfOT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzEwPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMTE9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl84PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zQ18zWl8zWl83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl83PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zQ18zWl8zWl84PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl81PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl83PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl84PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zSV8zSV8zQ18zWl8zWl85PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWl80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ18zWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV81PQotWFBDT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaPQotWFBDT01fVnRibENhbGxfX0lJSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKPQotWFBDT01fVnRibENhbGxfX0lJSl8wPQotWFBDT01fVnRibENhbGxfX0lJSl8xPQotWFBDT01fVnRibENhbGxfX0lJSl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKST0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSV8xPQotWFBDT01fVnRibENhbGxfX0lJSklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKPQotWFBDT01fVnRibENhbGxfX0lJSkpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSl8yPQotWFBDT01fVnRibENhbGxfX0lJSkpfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSkpJPQotWFBDT01fVnRibENhbGxfX0lJSkpJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV8yPQotWFBDT01fVnRibENhbGxfX0lJSkpJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfND0KLQotWFBDT01fVnRibENhbGxfX0lJSkpKSko9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl8zPQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfNT0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl81PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSVpJPQotWFBDT01fVnRibENhbGxfX0lJWklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSVpJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaSV8yPQotWFBDT01fVnRibENhbGxfX0lJWklfMz0KLQotWFBDT01fVnRibENhbGxfX0lJWl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfNT0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCSj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkpfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWl80PQotWFBDT01fVnRibENhbGxfX0lJXzNCWl8zSV8zWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JaPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18wPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfM0NaPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl80PQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNGPQotWFBDT01fVnRibENhbGxfX0lJXzNGXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0ZfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zRl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNKXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zUz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zU18wPQotWFBDT01fVnRibENhbGxfX0lJXzNTXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1NfMj0KLQotWFBDT01fVnRibENhbGxfX0lJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zWl8yPQotCi1YUENPTV9tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkk9Ci1YUENPTV9tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMj1jYXN0PShzaXplX3QpCi0KLVhQQ09NX21lbW1vdmVfX0lfM0JJPQotWFBDT01fbWVtbW92ZV9fSV8zQklfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JXzNCSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lfM0JJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19JXzNDST0KLVhQQ09NX21lbW1vdmVfX0lfM0NJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSV8zQ0lfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JXzNDSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fSV8zSUk9Ci1YUENPTV9tZW1tb3ZlX19JXzNJSV8wPWNhc3Q9KHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lfM0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fSV8zSUlfMj1jYXN0PShzaXplX3QpCi0KLVhQQ09NX21lbW1vdmVfX0lfM0pJPQotWFBDT01fbWVtbW92ZV9fSV8zSklfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19JXzNKSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lfM0pJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUk9Ci1YUENPTV9tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUlfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLVhQQ09NX21lbW1vdmVfX18zQklJPQotWFBDT01fbWVtbW92ZV9fXzNCSUlfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0JJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX18zQklJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19fM0JfM0NJPQotWFBDT01fbWVtbW92ZV9fXzNCXzNDSV8wPWNhc3Q9KHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX18zQl8zQ0lfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0JfM0NJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9tZW1tb3ZlX19fM0NJST0KLVhQQ09NX21lbW1vdmVfX18zQ0lJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fXzNDSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0NJSV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fXzNJSUk9Ci1YUENPTV9tZW1tb3ZlX19fM0lJSV8wPWNhc3Q9KHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX18zSUlJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fXzNJSUlfMj1jYXN0PShzaXplX3QpCi0KLVhQQ09NX21lbW1vdmVfX18zSklJPQotWFBDT01fbWVtbW92ZV9fXzNKSUlfMD1jYXN0PSh2b2lkICopCi1YUENPTV9tZW1tb3ZlX19fM0pJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX18zSklJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19MZW5ndGg9ZmxhZ3M9Y3BwCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19MZW5ndGhfMD1jYXN0PShuc0VtYmVkQ1N0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19kZWxldGVfMD1jYXN0PShuc0VtYmVkQ1N0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19nZXQ9ZmxhZ3M9Y3BwCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19nZXRfMD1jYXN0PShuc0VtYmVkQ1N0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ18xbmV3X189ZmxhZ3M9bmV3Ci0KLVhQQ09NX25zRW1iZWRDU3RyaW5nXzFuZXdfX18zQkk9ZmxhZ3M9bmV3Ci1YUENPTV9uc0VtYmVkQ1N0cmluZ18xbmV3X19fM0JJXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotWFBDT01fbnNFbWJlZENTdHJpbmdfMW5ld19fXzNCSV8xPQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX0xlbmd0aD1mbGFncz1jcHAKLVhQQ09NX25zRW1iZWRTdHJpbmdfTGVuZ3RoXzA9Y2FzdD0obnNFbWJlZFN0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX2RlbGV0ZT1mbGFncz1kZWxldGUKLVhQQ09NX25zRW1iZWRTdHJpbmdfZGVsZXRlXzA9Y2FzdD0obnNFbWJlZFN0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX2dldD1mbGFncz1jcHAKLVhQQ09NX25zRW1iZWRTdHJpbmdfZ2V0XzA9Y2FzdD0obnNFbWJlZFN0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkU3RyaW5nXzFuZXdfXz1mbGFncz1uZXcKLQotWFBDT01fbnNFbWJlZFN0cmluZ18xbmV3X19fM0M9ZmxhZ3M9bmV3Ci1YUENPTV9uc0VtYmVkU3RyaW5nXzFuZXdfX18zQ18wPQotCi1YUENPTV9uc0lEX0VxdWFscz1mbGFncz1jcHAKLVhQQ09NX25zSURfRXF1YWxzXzA9Y2FzdD0obnNJRCAqKQotWFBDT01fbnNJRF9FcXVhbHNfMT1jYXN0PShuc0lEICopLGZsYWdzPXN0cnVjdAotCi1YUENPTV9uc0lEX1BhcnNlPWZsYWdzPWNwcAotWFBDT01fbnNJRF9QYXJzZV8wPWNhc3Q9KG5zSUQgKikKLVhQQ09NX25zSURfUGFyc2VfMT1jYXN0PShjb25zdCBjaGFyICopCi0KLVhQQ09NX25zSURfZGVsZXRlPWZsYWdzPWRlbGV0ZQotWFBDT01fbnNJRF9kZWxldGVfMD1jYXN0PShuc0lEICopCi0KLVhQQ09NX25zSURfbmV3PWZsYWdzPW5ldwotCi1YUENPTV9zdHJsZW49Ci1YUENPTV9zdHJsZW5fMD1jYXN0PShjaGFyICopCi0KLVhQQ09NX3N0cmxlbl9QUlVuaWNoYXI9ZmxhZ3M9bm9fZ2VuCi1YUENPTV9zdHJsZW5fUFJVbmljaGFyXzA9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfWFBDT01PYmplY3Q9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zRW1iZWRTdHJpbmc9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUFwcFNoZWxsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lCYXNlV2luZG93PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDYXRlZ29yeU1hbmFnZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvbXBvbmVudE1hbmFnZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvbXBvbmVudFJlZ2lzdHJhcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ29udGV4dE1lbnVMaXN0ZW5lcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ29va2llPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb29raWVNYW5hZ2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEPWZsYWdzPWNwcAotbnNJRF9tMD0KLW5zSURfbTE9Ci1uc0lEX20yPQotbnNJRF9tMz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NRXZlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURPTU1vdXNlRXZlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURPTVVJRXZlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURPTVdpbmRvdz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRG9jU2hlbGw9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURvd25sb2FkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lFbWJlZGRpbmdTaXRlV2luZG93PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lGYWN0b3J5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lGaWxlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lGaWxlUGlja2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lIZWxwZXJBcHBMYXVuY2hlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSGVscGVyQXBwTGF1bmNoZXJEaWFsb2c9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUlPU2VydmljZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSW5wdXRTdHJlYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUludGVyZmFjZVJlcXVlc3Rvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJTG9jYWxGaWxlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lNZW1vcnk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByb2ZpbGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByb2dyZXNzRGlhbG9nPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lQcm9tcHRTZXJ2aWNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lSZXF1ZXN0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lTZXJ2aWNlTWFuYWdlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJU2ltcGxlRW51bWVyYXRvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJU3VwcG9ydHM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVN1cHBvcnRzV2Vha1JlZmVyZW5jZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJVG9vbHRpcExpc3RlbmVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lVUkk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVVSSUNvbnRlbnRMaXN0ZW5lcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2Vha1JlZmVyZW5jZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3Nlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckNocm9tZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckNocm9tZUZvY3VzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJCcm93c2VyRm9jdXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYkJyb3dzZXJTdHJlYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYk5hdmlnYXRpb249Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYlByb2dyZXNzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJQcm9ncmVzc0xpc3RlbmVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXaW5kb3dDcmVhdG9yPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXaW5kb3dXYXRjaGVyPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJmMjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqXG5cCi0gKiBWZXJzaW9uOiBNUEwgMS4xXG5cCi0gKlxuXAotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uXG5cCi0gKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcblwKLSAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblwKLSAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML1xuXAotICpcblwKLSAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsXG5cCi0gKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2VcblwKLSAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlXG5cCi0gKiBMaWNlbnNlLlxuXAotICpcblwKLSAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLCByZWxlYXNlZCBNYXJjaCAzMSwgMTk5OC5cblwKLSAqXG5cCi0gKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXNcblwKLSAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLlxuXAotICogUG9ydGlvbnMgY3JlYXRlZCBieSBOZXRzY2FwZSBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTlcblwKLSAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLSAqXG5cCi0gKiBDb250cmlidXRvcihzKTpcblwKLSAqXG5cCi0gKiBJQk1cblwKLSAqIC0gIEJpbmRpbmcgdG8gcGVybWl0IGludGVyZmFjaW5nIGJldHdlZW4gTW96aWxsYSBhbmQgU1dUXG5cCi0gKiAtICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgSUJNIENvcnAuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotICpcblwKLSAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMGE4NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSUQ9Ci1DQVVVSURfY0VsZW1zPQotQ0FVVUlEX3BFbGVtcz1jYXN0PShHVUlEIEZBUiAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTT0KLUNPTV9DTFNJREZyb21Qcm9nSUQ9Ci1DT01fQ0xTSURGcm9tUHJvZ0lEXzA9Y2FzdD1MUENPTEVTVFIKLUNPTV9DTFNJREZyb21Qcm9nSURfMT0KLQotQ09NX0NMU0lERnJvbVN0cmluZz0KLUNPTV9DTFNJREZyb21TdHJpbmdfMD1jYXN0PUxQT0xFU1RSCi1DT01fQ0xTSURGcm9tU3RyaW5nXzE9Ci0KLUNPTV9Db0NyZWF0ZUluc3RhbmNlPQotQ09NX0NvQ3JlYXRlSW5zdGFuY2VfMD0KLUNPTV9Db0NyZWF0ZUluc3RhbmNlXzE9Y2FzdD1MUFVOS05PV04KLUNPTV9Db0NyZWF0ZUluc3RhbmNlXzI9Ci1DT01fQ29DcmVhdGVJbnN0YW5jZV8zPQotQ09NX0NvQ3JlYXRlSW5zdGFuY2VfND1jYXN0PUxQVk9JRCAqCi0KLUNPTV9Db0ZyZWVVbnVzZWRMaWJyYXJpZXM9Ci0KLUNPTV9Db0dldENsYXNzT2JqZWN0PQotQ09NX0NvR2V0Q2xhc3NPYmplY3RfMD0KLUNPTV9Db0dldENsYXNzT2JqZWN0XzE9Ci1DT01fQ29HZXRDbGFzc09iamVjdF8yPWNhc3Q9KENPU0VSVkVSSU5GTyAqCi1DT01fQ29HZXRDbGFzc09iamVjdF8zPQotQ09NX0NvR2V0Q2xhc3NPYmplY3RfND1jYXN0PUxQVk9JRCAqCi0KLUNPTV9Db0xvY2tPYmplY3RFeHRlcm5hbD0KLUNPTV9Db0xvY2tPYmplY3RFeHRlcm5hbF8wPWNhc3Q9KElVbmtub3duICopCi1DT01fQ29Mb2NrT2JqZWN0RXh0ZXJuYWxfMT1jYXN0PShCT09MKQotQ09NX0NvTG9ja09iamVjdEV4dGVybmFsXzI9Y2FzdD0oQk9PTCkKLQotQ09NX0NvVGFza01lbUFsbG9jPQotQ09NX0NvVGFza01lbUFsbG9jXzA9Y2FzdD0oVUxPTkcpCi0KLUNPTV9Db1Rhc2tNZW1GcmVlPQotQ09NX0NvVGFza01lbUZyZWVfMD1jYXN0PShMUFZPSUQpCi0KLUNPTV9DcmVhdGVTdGRBY2Nlc3NpYmxlT2JqZWN0PWZsYWdzPWR5bmFtaWMKLUNPTV9DcmVhdGVTdGRBY2Nlc3NpYmxlT2JqZWN0XzA9Y2FzdD0oSFdORCkKLUNPTV9DcmVhdGVTdGRBY2Nlc3NpYmxlT2JqZWN0XzE9Ci1DT01fQ3JlYXRlU3RkQWNjZXNzaWJsZU9iamVjdF8yPQotQ09NX0NyZWF0ZVN0ZEFjY2Vzc2libGVPYmplY3RfMz1jYXN0PShMUFZPSUQgKikKLQotQ09NX0RvRHJhZ0Ryb3A9Ci1DT01fRG9EcmFnRHJvcF8wPWNhc3Q9KElEYXRhT2JqZWN0ICopCi1DT01fRG9EcmFnRHJvcF8xPWNhc3Q9SURyb3BTb3VyY2UgKgotQ09NX0RvRHJhZ0Ryb3BfMj0KLUNPTV9Eb0RyYWdEcm9wXzM9Ci0KLUNPTV9HZXRDbGFzc0ZpbGU9Ci1DT01fR2V0Q2xhc3NGaWxlXzA9Y2FzdD1MUENXU1RSCi1DT01fR2V0Q2xhc3NGaWxlXzE9Ci0KLUNPTV9JSURGcm9tU3RyaW5nPQotQ09NX0lJREZyb21TdHJpbmdfMD1jYXN0PUxQT0xFU1RSCi1DT01fSUlERnJvbVN0cmluZ18xPQotCi1DT01fSXNFcXVhbEdVSUQ9Ci1DT01fSXNFcXVhbEdVSURfMD0KLUNPTV9Jc0VxdWFsR1VJRF8xPQotCi1DT01fTHJlc3VsdEZyb21PYmplY3Q9ZmxhZ3M9ZHluYW1pYwotQ09NX0xyZXN1bHRGcm9tT2JqZWN0XzA9Ci1DT01fTHJlc3VsdEZyb21PYmplY3RfMT0KLUNPTV9McmVzdWx0RnJvbU9iamVjdF8yPWNhc3Q9KExQVU5LTk9XTikKLQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkk9Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySV8wPWNhc3Q9KFBWT0lEKQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklfMj0KLQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzA9Y2FzdD0oUFZPSUQpCi1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GT18yST0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GT18ySV8wPWNhc3Q9KFBWT0lEKQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVJTlBMQUNFRlJBTUVJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GT18ySV8yPQotCi1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMkk9Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklfMj0KLQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMkk9Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySV8wPWNhc3Q9KFBWT0lEKQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySUk9Ci1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJSV8yPQotCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRlVOQ0RFU0NfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZVTkNERVNDXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZVTkNERVNDXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQ18ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySUk9Ci1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJSV8yPQotCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVFlQRUFUVFJfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1RZUEVBVFRSXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1RZUEVBVFRSXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUl8ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0NfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0NfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVkFSREVTQ18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVkFSREVTQ18ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySUk9Ci1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJSV8yPQotCi1DT01fT2xlQ3JlYXRlPQotQ09NX09sZUNyZWF0ZV8wPQotQ09NX09sZUNyZWF0ZV8xPQotQ09NX09sZUNyZWF0ZV8yPQotQ09NX09sZUNyZWF0ZV8zPQotQ09NX09sZUNyZWF0ZV80PWNhc3Q9SU9sZUNsaWVudFNpdGUgKgotQ09NX09sZUNyZWF0ZV81PWNhc3Q9SVN0b3JhZ2UgKgotQ09NX09sZUNyZWF0ZV82PWNhc3Q9dm9pZCAqKgotCi1DT01fT2xlQ3JlYXRlRnJvbUZpbGU9Ci1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfMD0KLUNPTV9PbGVDcmVhdGVGcm9tRmlsZV8xPWNhc3Q9TFBDT0xFU1RSCi1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfMj0KLUNPTV9PbGVDcmVhdGVGcm9tRmlsZV8zPQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzQ9Ci1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfNT1jYXN0PShMUE9MRUNMSUVOVFNJVEUpCi1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfNj1jYXN0PShMUFNUT1JBR0UpCi1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfNz1jYXN0PUxQVk9JRCAqCi0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lPQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfMD1jYXN0PShIV05EKQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfMT0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzI9Ci1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV8zPWNhc3Q9TFBDT0xFU1RSCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV80PQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfNT1jYXN0PShMUFVOS05PV04gRkFSKikKLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzY9Ci1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV83PWNhc3Q9KExQQ0xTSUQpCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV84PWNhc3Q9KExDSUQpCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV85PQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfMTA9Y2FzdD0oTFBWT0lEKQotCi1DT01fT2xlRHJhdz0KLUNPTV9PbGVEcmF3XzA9Y2FzdD0oTFBVTktOT1dOKQotQ09NX09sZURyYXdfMT1jYXN0PShEV09SRCkKLUNPTV9PbGVEcmF3XzI9Y2FzdD0oSERDKQotQ09NX09sZURyYXdfMz1jYXN0PShMUFJFQ1QpCi0KLUNPTV9PbGVGbHVzaENsaXBib2FyZD0KLQotQ09NX09sZUdldENsaXBib2FyZD0KLUNPTV9PbGVHZXRDbGlwYm9hcmRfMD1jYXN0PShJRGF0YU9iamVjdCAqKikKLQotQ09NX09sZUlzQ3VycmVudENsaXBib2FyZD0KLUNPTV9PbGVJc0N1cnJlbnRDbGlwYm9hcmRfMD1jYXN0PShJRGF0YU9iamVjdCAqKQotCi1DT01fT2xlSXNSdW5uaW5nPQotQ09NX09sZUlzUnVubmluZ18wPWNhc3Q9KExQT0xFT0JKRUNUKQotCi1DT01fT2xlTG9hZD0KLUNPTV9PbGVMb2FkXzA9Y2FzdD0oSVN0b3JhZ2UgKikKLUNPTV9PbGVMb2FkXzE9Ci1DT01fT2xlTG9hZF8yPWNhc3Q9KElPbGVDbGllbnRTaXRlICopCi1DT01fT2xlTG9hZF8zPWNhc3Q9TFBWT0lEICoKLQotQ09NX09sZVJ1bj0KLUNPTV9PbGVSdW5fMD1jYXN0PShMUFVOS05PV04pCi0KLUNPTV9PbGVTYXZlPQotQ09NX09sZVNhdmVfMD1jYXN0PShJUGVyc2lzdFN0b3JhZ2UgKikKLUNPTV9PbGVTYXZlXzE9Y2FzdD0oSVN0b3JhZ2UgKikKLUNPTV9PbGVTYXZlXzI9Ci0KLUNPTV9PbGVTZXRDbGlwYm9hcmQ9Ci1DT01fT2xlU2V0Q2xpcGJvYXJkXzA9Y2FzdD0oSURhdGFPYmplY3QgKikKLQotQ09NX09sZVNldENvbnRhaW5lZE9iamVjdD0KLUNPTV9PbGVTZXRDb250YWluZWRPYmplY3RfMD1jYXN0PShMUFVOS05PV04pCi1DT01fT2xlU2V0Q29udGFpbmVkT2JqZWN0XzE9Ci0KLUNPTV9PbGVTZXRNZW51RGVzY3JpcHRvcj0KLUNPTV9PbGVTZXRNZW51RGVzY3JpcHRvcl8wPWNhc3Q9KEhPTEVNRU5VKQotQ09NX09sZVNldE1lbnVEZXNjcmlwdG9yXzE9Y2FzdD0oSFdORCkKLUNPTV9PbGVTZXRNZW51RGVzY3JpcHRvcl8yPWNhc3Q9KEhXTkQpCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfMz1jYXN0PShMUE9MRUlOUExBQ0VGUkFNRSkKLUNPTV9PbGVTZXRNZW51RGVzY3JpcHRvcl80PWNhc3Q9KExQT0xFSU5QTEFDRUFDVElWRU9CSkVDVCkKLQotQ09NX09sZVRyYW5zbGF0ZUNvbG9yPQotQ09NX09sZVRyYW5zbGF0ZUNvbG9yXzA9Y2FzdD0oT0xFX0NPTE9SKQotQ09NX09sZVRyYW5zbGF0ZUNvbG9yXzE9Y2FzdD0oSFBBTEVUVEUpCi1DT01fT2xlVHJhbnNsYXRlQ29sb3JfMj1jYXN0PShDT0xPUlJFRiAqKQotCi1DT01fUHJvZ0lERnJvbUNMU0lEPQotQ09NX1Byb2dJREZyb21DTFNJRF8wPQotQ09NX1Byb2dJREZyb21DTFNJRF8xPWNhc3Q9TFBPTEVTVFIgKgotCi1DT01fUmVnaXN0ZXJEcmFnRHJvcD0KLUNPTV9SZWdpc3RlckRyYWdEcm9wXzA9Y2FzdD0oSFdORCkKLUNPTV9SZWdpc3RlckRyYWdEcm9wXzE9Y2FzdD0oSURyb3BUYXJnZXQgKikKLQotQ09NX1JlbGVhc2VTdGdNZWRpdW09Ci1DT01fUmVsZWFzZVN0Z01lZGl1bV8wPWNhc3Q9KFNUR01FRElVTSAqKQotCi1DT01fUmV2b2tlRHJhZ0Ryb3A9Ci1DT01fUmV2b2tlRHJhZ0Ryb3BfMD1jYXN0PShIV05EKQotCi1DT01fU3RnQ3JlYXRlRG9jZmlsZT0KLUNPTV9TdGdDcmVhdGVEb2NmaWxlXzA9Ci1DT01fU3RnQ3JlYXRlRG9jZmlsZV8xPQotQ09NX1N0Z0NyZWF0ZURvY2ZpbGVfMj0KLUNPTV9TdGdDcmVhdGVEb2NmaWxlXzM9Y2FzdD1JU3RvcmFnZSAqKgotCi1DT01fU3RnSXNTdG9yYWdlRmlsZT0KLUNPTV9TdGdJc1N0b3JhZ2VGaWxlXzA9Y2FzdD0oY29uc3QgV0NIQVIgKikKLQotQ09NX1N0Z09wZW5TdG9yYWdlPQotQ09NX1N0Z09wZW5TdG9yYWdlXzA9Y2FzdD1jb25zdCBXQ0hBUiAqCi1DT01fU3RnT3BlblN0b3JhZ2VfMT1jYXN0PShJU3RvcmFnZSAqKQotQ09NX1N0Z09wZW5TdG9yYWdlXzI9Ci1DT01fU3RnT3BlblN0b3JhZ2VfMz1jYXN0PShTTkIpCi1DT01fU3RnT3BlblN0b3JhZ2VfND0KLUNPTV9TdGdPcGVuU3RvcmFnZV81PWNhc3Q9SVN0b3JhZ2UgKioKLQotQ09NX1N0cmluZ0Zyb21DTFNJRD0KLUNPTV9TdHJpbmdGcm9tQ0xTSURfMD0KLUNPTV9TdHJpbmdGcm9tQ0xTSURfMT1jYXN0PUxQT0xFU1RSICoKLQotQ09NX1N5c0FsbG9jU3RyaW5nPQotQ09NX1N5c0FsbG9jU3RyaW5nXzA9Y2FzdD0oT0xFQ0hBUiAqKQotCi1DT01fU3lzRnJlZVN0cmluZz0KLUNPTV9TeXNGcmVlU3RyaW5nXzA9Y2FzdD0oQlNUUikKLQotQ09NX1N5c1N0cmluZ0J5dGVMZW49Ci1DT01fU3lzU3RyaW5nQnl0ZUxlbl8wPWNhc3Q9KEJTVFIpCi0KLUNPTV9WYXJpYW50Q2hhbmdlVHlwZT0KLUNPTV9WYXJpYW50Q2hhbmdlVHlwZV8wPWNhc3Q9KFZBUklBTlRBUkcgRkFSKiApCi1DT01fVmFyaWFudENoYW5nZVR5cGVfMT1jYXN0PShWQVJJQU5UQVJHIEZBUiogKQotQ09NX1ZhcmlhbnRDaGFuZ2VUeXBlXzI9Ci1DT01fVmFyaWFudENoYW5nZVR5cGVfMz1jYXN0PShWQVJUWVBFKQotCi1DT01fVmFyaWFudENsZWFyPQotQ09NX1ZhcmlhbnRDbGVhcl8wPWNhc3Q9KFZBUklBTlRBUkcgRkFSKiApCi0KLUNPTV9WYXJpYW50SW5pdD0KLUNPTV9WYXJpYW50SW5pdF8wPWNhc3Q9KFZBUklBTlRBUkcgRkFSKiApCi0KLUNPTV9WdGJsQ2FsbF9fSUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zPQotCi1DT01fVnRibENhbGxfX0lJSUlJPQotQ09NX1Z0YmxDYWxsX19JSUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJSV80PQotCi1DT01fVnRibENhbGxfX0lJSUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlJSV80PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlfNT0KLQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfND0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV81PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUk9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzU9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzY9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJXzc9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV82PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzc9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfOD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV85PQotCi1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzI9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzI9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl80PQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzU9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0k9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzNJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfM0k9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzNJXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzE9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMz0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJST0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfND0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlfNT0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfNj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfNz0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfOD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPXzJfM0lfOT0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJfM0k9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMl8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18yXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMl8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJfM0lfND0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfND0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzU9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl82PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfNz0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMz0KLQotQ09NX1Z0YmxDYWxsX19JSUlaPQotQ09NX1Z0YmxDYWxsX19JSUlaXzA9Ci1DT01fVnRibENhbGxfX0lJSVpfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJWl8yPQotQ09NX1Z0YmxDYWxsX19JSUlaXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfMz0KLQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSV8zSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSV8zSUlfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zSV81PQotCi1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV80PQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSURfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSURfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NBVVVJRF8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ0FVVUlEXzJfMj0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ09OVFJPTElORk9fMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT05UUk9MSU5GT18yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfMj0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMl8zPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlo9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlpfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yWl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJaXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlpfMz0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yWl80PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV80PQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUlfNT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzQ9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURURVhUXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzQ9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzU9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfM0k9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9MSUNJTkZPXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySVpfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJWl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySVpfMz0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfMj0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0k9Ci1DT01fVnRibENhbGxfX0lJXzNDSV8wPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJXzI9Ci1DT01fVnRibENhbGxfX0lJXzNDSV8zPQotCi1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV80PQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfNT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzY9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV83PQotCi1DT01fVnRibENhbGxfX0lJXzNDSUlJXzNJPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV80PQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV81PQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSV82PQotCi1DT01fVnRibENhbGxfX0lJXzNDXzNDPQotQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18wPQotQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18xPQotQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18yPQotQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zPQotCi1DT01fVnRibENhbGxfX0lJXzNJPQotQ09NX1Z0YmxDYWxsX19JSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSV8zSV8yPQotCi1DT01fV3JpdGVDbGFzc1N0Zz0KLUNPTV9Xcml0ZUNsYXNzU3RnXzA9Y2FzdD0oSVN0b3JhZ2UgKikKLUNPTV9Xcml0ZUNsYXNzU3RnXzE9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT01PYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ09OVFJPTElORk89Ci1DT05UUk9MSU5GT19jYj0KLUNPTlRST0xJTkZPX2hBY2NlbD1jYXN0PShIQUNDRUwpCi1DT05UUk9MSU5GT19jQWNjZWw9Ci1DT05UUk9MSU5GT19kd0ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPU0VSVkVSSU5GTz0KLUNPU0VSVkVSSU5GT19kd1Jlc2VydmVkMT0KLUNPU0VSVkVSSU5GT19wd3N6TmFtZT1jYXN0PShMUFdTVFIpCi1DT1NFUlZFUklORk9fcEF1dGhJbmZvPWNhc3Q9KENPQVVUSElORk8gKikKLUNPU0VSVkVSSU5GT19kd1Jlc2VydmVkMj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TPQotRElTUFBBUkFNU19yZ3Zhcmc9Y2FzdD0oVkFSSUFOVEFSRyBGQVIgKikKLURJU1BQQVJBTVNfcmdkaXNwaWROYW1lZEFyZ3M9Y2FzdD0oRElTUElEIEZBUiAqKQotRElTUFBBUkFNU19jQXJncz0KLURJU1BQQVJBTVNfY05hbWVkQXJncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRT0KLURWVEFSR0VUREVWSUNFX3RkU2l6ZT0KLURWVEFSR0VUREVWSUNFX3RkRHJpdmVyTmFtZU9mZnNldD0KLURWVEFSR0VUREVWSUNFX3RkRGV2aWNlTmFtZU9mZnNldD0KLURWVEFSR0VUREVWSUNFX3RkUG9ydE5hbWVPZmZzZXQ9Ci1EVlRBUkdFVERFVklDRV90ZEV4dERldm1vZGVPZmZzZXQ9Ci1EVlRBUkdFVERFVklDRV90ZERhdGE9YWNjZXNzb3I9dGREYXRhWzBdCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRVhDRVBJTkZPPQotRVhDRVBJTkZPX3dDb2RlPQotRVhDRVBJTkZPX3dSZXNlcnZlZD0KLUVYQ0VQSU5GT19ic3RyU291cmNlPWNhc3Q9KEJTVFIpCi1FWENFUElORk9fYnN0ckRlc2NyaXB0aW9uPWNhc3Q9KEJTVFIpCi1FWENFUElORk9fYnN0ckhlbHBGaWxlPWNhc3Q9KEJTVFIpCi1FWENFUElORk9fZHdIZWxwQ29udGV4dD0KLUVYQ0VQSU5GT19wdlJlc2VydmVkPWNhc3Q9KHZvaWQgRkFSICopCi1FWENFUElORk9fcGZuRGVmZXJyZWRGaWxsSW49Y2FzdD0oSFJFU1VMVCAoU1REQVBJQ0FMTFRZUEUgRkFSKiApKHN0cnVjdCB0YWdFWENFUElORk8gRkFSKikpCi1FWENFUElORk9fc2NvZGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDPQotRk9STUFURVRDX2NmRm9ybWF0PWNhc3Q9KENMSVBGT1JNQVQpCi1GT1JNQVRFVENfcHRkPWNhc3Q9KERWVEFSR0VUREVWSUNFICopCi1GT1JNQVRFVENfZHdBc3BlY3Q9Ci1GT1JNQVRFVENfbGluZGV4PQotRk9STUFURVRDX3R5bWVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZVTkNERVNDPQotRlVOQ0RFU0NfbWVtaWQ9Y2FzdD1NRU1CRVJJRAotRlVOQ0RFU0NfbHByZ3Njb2RlPWNhc3Q9U0NPREUgRkFSICoKLUZVTkNERVNDX2xwcmdlbGVtZGVzY1BhcmFtPWNhc3Q9RUxFTURFU0MgRkFSICoKLUZVTkNERVNDX2Z1bmNraW5kPWNhc3Q9RlVOQ0tJTkQKLUZVTkNERVNDX2ludmtpbmQ9Y2FzdD1JTlZPS0VLSU5ECi1GVU5DREVTQ19jYWxsY29udj1jYXN0PUNBTExDT05WCi1GVU5DREVTQ19jUGFyYW1zPQotRlVOQ0RFU0NfY1BhcmFtc09wdD0KLUZVTkNERVNDX29WZnQ9Ci1GVU5DREVTQ19jU2NvZGVzPQotRlVOQ0RFU0NfZWxlbWRlc2NGdW5jX3RkZXNjX3VuaW9uPWFjY2Vzc29yPWVsZW1kZXNjRnVuYy50ZGVzYy5scHRkZXNjLGNhc3Q9KHN0cnVjdCBGQVJTVFJVQ1QgdGFnVFlQRURFU0MgRkFSKiApCi1GVU5DREVTQ19lbGVtZGVzY0Z1bmNfdGRlc2NfdnQ9YWNjZXNzb3I9ZWxlbWRlc2NGdW5jLnRkZXNjLnZ0Ci1GVU5DREVTQ19lbGVtZGVzY0Z1bmNfcGFyYW1kZXNjX3BwYXJhbWRlc2NleD1hY2Nlc3Nvcj1lbGVtZGVzY0Z1bmMucGFyYW1kZXNjLnBwYXJhbWRlc2NleCxjYXN0PShMUFBBUkFNREVTQ0VYKQotRlVOQ0RFU0NfZWxlbWRlc2NGdW5jX3BhcmFtZGVzY193UGFyYW1GbGFncz1hY2Nlc3Nvcj1lbGVtZGVzY0Z1bmMucGFyYW1kZXNjLndQYXJhbUZsYWdzCi1GVU5DREVTQ193RnVuY0ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSUQ9Ci1HVUlEX0RhdGExPQotR1VJRF9EYXRhMj0KLUdVSURfRGF0YTM9Ci1HVUlEX0RhdGE0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lBY2Nlc3NpYmxlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lDbGFzc0ZhY3RvcnkyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lDb25uZWN0aW9uUG9pbnQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSUNvbm5lY3Rpb25Qb2ludENvbnRhaW5lcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGF0YU9iamVjdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2g9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSUVudW09ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSUVudW1GT1JNQVRFVEM9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSUVudW1TVEFUU1RHPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtVkFSSUFOVD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRm9udD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JTW9uaWtlcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlQ29tbWFuZFRhcmdldD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlQ29udHJvbD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlRG9jdW1lbnQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZURvY3VtZW50Vmlldz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlSW5QbGFjZUFjdGl2ZU9iamVjdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlSW5QbGFjZU9iamVjdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlTGluaz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlT2JqZWN0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lPbGVXaW5kb3c9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVBlcnNpc3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVBlcnNpc3RTdG9yYWdlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lQZXJzaXN0U3RyZWFtSW5pdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JUHJvdmlkZUNsYXNzSW5mbz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JUHJvdmlkZUNsYXNzSW5mbzI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVNwZWNpZnlQcm9wZXJ0eVBhZ2VzPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lTdG9yYWdlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lTdHJlYW09ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVR5cGVJbmZvPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lWaWV3T2JqZWN0Mj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9MSUNJTkZPPQotTElDSU5GT19jYkxpY0luZm89Ci1MSUNJTkZPX2ZSdW50aW1lS2V5QXZhaWw9Ci1MSUNJTkZPX2ZMaWNWZXJpZmllZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTUQ9Ci1PTEVDTURfY21kSUQ9Ci1PTEVDTURfY21kZj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURURVhUPQotT0xFQ01EVEVYVF9jbWR0ZXh0Zj0KLU9MRUNNRFRFWFRfY3dBY3R1YWw9Ci1PTEVDTURURVhUX2N3QnVmPQotT0xFQ01EVEVYVF9yZ3d6PWFjY2Vzc29yPXJnd3pbMF0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVJTlBMQUNFRlJBTUVJTkZPPQotT0xFSU5QTEFDRUZSQU1FSU5GT19jYj0KLU9MRUlOUExBQ0VGUkFNRUlORk9fZk1ESUFwcD0KLU9MRUlOUExBQ0VGUkFNRUlORk9faHduZEZyYW1lPWNhc3Q9KEhXTkQpCi1PTEVJTlBMQUNFRlJBTUVJTkZPX2hhY2NlbD1jYXN0PShIQUNDRUwpCi1PTEVJTlBMQUNFRlJBTUVJTkZPX2NBY2NlbEVudHJpZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNURz0KLVNUQVRTVEdfcHdjc05hbWU9Y2FzdD0oTFBXU1RSKQotU1RBVFNUR190eXBlPQotU1RBVFNUR19jYlNpemU9YWNjZXNzb3I9Y2JTaXplLlF1YWRQYXJ0Ci1TVEFUU1RHX210aW1lX2R3TG93RGF0ZVRpbWU9YWNjZXNzb3I9bXRpbWUuZHdMb3dEYXRlVGltZQotU1RBVFNUR19tdGltZV9kd0hpZ2hEYXRlVGltZT1hY2Nlc3Nvcj1tdGltZS5kd0hpZ2hEYXRlVGltZQotU1RBVFNUR19jdGltZV9kd0xvd0RhdGVUaW1lPWFjY2Vzc29yPWN0aW1lLmR3TG93RGF0ZVRpbWUKLVNUQVRTVEdfY3RpbWVfZHdIaWdoRGF0ZVRpbWU9YWNjZXNzb3I9Y3RpbWUuZHdIaWdoRGF0ZVRpbWUKLVNUQVRTVEdfYXRpbWVfZHdMb3dEYXRlVGltZT1hY2Nlc3Nvcj1hdGltZS5kd0xvd0RhdGVUaW1lCi1TVEFUU1RHX2F0aW1lX2R3SGlnaERhdGVUaW1lPWFjY2Vzc29yPWF0aW1lLmR3SGlnaERhdGVUaW1lCi1TVEFUU1RHX2dyZk1vZGU9Ci1TVEFUU1RHX2dyZkxvY2tzU3VwcG9ydGVkPQotU1RBVFNUR19jbHNpZF9EYXRhMT1hY2Nlc3Nvcj1jbHNpZC5EYXRhMQotU1RBVFNUR19jbHNpZF9EYXRhMj1hY2Nlc3Nvcj1jbHNpZC5EYXRhMgotU1RBVFNUR19jbHNpZF9EYXRhMz1hY2Nlc3Nvcj1jbHNpZC5EYXRhMwotU1RBVFNUR19jbHNpZF9EYXRhND1hY2Nlc3Nvcj1jbHNpZC5EYXRhNAotU1RBVFNUR19ncmZTdGF0ZUJpdHM9Ci1TVEFUU1RHX3Jlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTT0KLVNUR01FRElVTV90eW1lZD0KLVNUR01FRElVTV91bmlvbkZpZWxkPWFjY2Vzc29yPWhHbG9iYWwsY2FzdD0oSEdMT0JBTCkKLVNUR01FRElVTV9wVW5rRm9yUmVsZWFzZT1jYXN0PShJVW5rbm93biAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1RZUEVBVFRSPQotVFlQRUFUVFJfZ3VpZF9EYXRhMT1hY2Nlc3Nvcj1ndWlkLkRhdGExCi1UWVBFQVRUUl9ndWlkX0RhdGEyPWFjY2Vzc29yPWd1aWQuRGF0YTIKLVRZUEVBVFRSX2d1aWRfRGF0YTM9YWNjZXNzb3I9Z3VpZC5EYXRhMwotVFlQRUFUVFJfZ3VpZF9EYXRhND1hY2Nlc3Nvcj1ndWlkLkRhdGE0Ci1UWVBFQVRUUl9sY2lkPQotVFlQRUFUVFJfZHdSZXNlcnZlZD0KLVRZUEVBVFRSX21lbWlkQ29uc3RydWN0b3I9Ci1UWVBFQVRUUl9tZW1pZERlc3RydWN0b3I9Ci1UWVBFQVRUUl9scHN0clNjaGVtYT1jYXN0PShPTEVDSEFSIEZBUiAqKQotVFlQRUFUVFJfY2JTaXplSW5zdGFuY2U9Ci1UWVBFQVRUUl90eXBla2luZD0KLVRZUEVBVFRSX2NGdW5jcz0KLVRZUEVBVFRSX2NWYXJzPQotVFlQRUFUVFJfY0ltcGxUeXBlcz0KLVRZUEVBVFRSX2NiU2l6ZVZmdD0KLVRZUEVBVFRSX2NiQWxpZ25tZW50PQotVFlQRUFUVFJfd1R5cGVGbGFncz0KLVRZUEVBVFRSX3dNYWpvclZlck51bT0KLVRZUEVBVFRSX3dNaW5vclZlck51bT0KLVRZUEVBVFRSX3RkZXNjQWxpYXNfdW5pb25GaWVsZD1hY2Nlc3Nvcj10ZGVzY0FsaWFzLmxwdGRlc2MsY2FzdD0oc3RydWN0IEZBUlNUUlVDVCB0YWdUWVBFREVTQyBGQVIgKikKLVRZUEVBVFRSX3RkZXNjQWxpYXNfdnQ9YWNjZXNzb3I9dGRlc2NBbGlhcy52dAotVFlQRUFUVFJfaWRsZGVzY1R5cGVfZHdSZXNlcnZlZD1hY2Nlc3Nvcj1pZGxkZXNjVHlwZS5kd1Jlc2VydmVkCi1UWVBFQVRUUl9pZGxkZXNjVHlwZV93SURMRmxhZ3M9YWNjZXNzb3I9aWRsZGVzY1R5cGUud0lETEZsYWdzCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVkFSREVTQz0KLVZBUkRFU0NfbWVtaWQ9Ci1WQVJERVNDX2xwc3RyU2NoZW1hPWNhc3Q9KE9MRUNIQVIgRkFSICopCi1WQVJERVNDX29JbnN0PQotVkFSREVTQ19lbGVtZGVzY1Zhcl90ZGVzY191bmlvbj1hY2Nlc3Nvcj1lbGVtZGVzY1Zhci50ZGVzYy5scHRkZXNjLGNhc3Q9KHN0cnVjdCBGQVJTVFJVQ1QgdGFnVFlQRURFU0MgRkFSICopCi1WQVJERVNDX2VsZW1kZXNjVmFyX3RkZXNjX3Z0PWFjY2Vzc29yPWVsZW1kZXNjVmFyLnRkZXNjLnZ0Ci1WQVJERVNDX2VsZW1kZXNjVmFyX3BhcmFtZGVzY19wcGFyYW1kZXNjZXg9YWNjZXNzb3I9ZWxlbWRlc2NWYXIucGFyYW1kZXNjLnBwYXJhbWRlc2NleCxjYXN0PShMUFBBUkFNREVTQ0VYKQotVkFSREVTQ19lbGVtZGVzY1Zhcl9wYXJhbWRlc2Nfd1BhcmFtRmxhZ3M9YWNjZXNzb3I9ZWxlbWRlc2NWYXIucGFyYW1kZXNjLndQYXJhbUZsYWdzCi1WQVJERVNDX3dWYXJGbGFncz0KLVZBUkRFU0NfdmFya2luZD0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ2x4LkdMWC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ2x4LkdMWC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMyZDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmdseC5HTFgucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX2dseF9HTFg9Ci1HTFhfZ2xHZXRJbnRlZ2Vydj0KLUdMWF9nbEdldEludGVnZXJ2XzA9Y2FzdD0oR0xlbnVtKQotR0xYX2dsR2V0SW50ZWdlcnZfMT1jYXN0PShHTGludCAqKSxmbGFncz1ub19pbgotCi1HTFhfZ2xWaWV3cG9ydD0KLUdMWF9nbFZpZXdwb3J0XzA9Y2FzdD0oR0xpbnQpCi1HTFhfZ2xWaWV3cG9ydF8xPWNhc3Q9KEdMaW50KQotR0xYX2dsVmlld3BvcnRfMj1jYXN0PShHTHNpemVpKQotR0xYX2dsVmlld3BvcnRfMz1jYXN0PShHTHNpemVpKQotCi1HTFhfZ2xYQ2hvb3NlVmlzdWFsPQotR0xYX2dsWENob29zZVZpc3VhbF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDaG9vc2VWaXN1YWxfMT0KLUdMWF9nbFhDaG9vc2VWaXN1YWxfMj0KLQotR0xYX2dsWENvcHlDb250ZXh0PQotR0xYX2dsWENvcHlDb250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWENvcHlDb250ZXh0XzE9Y2FzdD0oR0xYQ29udGV4dCkKLUdMWF9nbFhDb3B5Q29udGV4dF8yPWNhc3Q9KEdMWENvbnRleHQpCi1HTFhfZ2xYQ29weUNvbnRleHRfMz0KLQotR0xYX2dsWENyZWF0ZUNvbnRleHQ9Ci1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDcmVhdGVDb250ZXh0XzE9Ci1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8yPWNhc3Q9KEdMWENvbnRleHQpCi1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8zPQotCi1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwPQotR0xYX2dsWENyZWF0ZUdMWFBpeG1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMT0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMj1jYXN0PShQaXhtYXApCi0KLUdMWF9nbFhEZXN0cm95Q29udGV4dD0KLUdMWF9nbFhEZXN0cm95Q29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhEZXN0cm95Q29udGV4dF8xPWNhc3Q9KEdMWENvbnRleHQpCi0KLUdMWF9nbFhEZXN0cm95R0xYUGl4bWFwPQotR0xYX2dsWERlc3Ryb3lHTFhQaXhtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYRGVzdHJveUdMWFBpeG1hcF8xPWNhc3Q9KEdMWFBpeG1hcCkKLQotR0xYX2dsWEdldENsaWVudFN0cmluZz0KLUdMWF9nbFhHZXRDbGllbnRTdHJpbmdfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYR2V0Q2xpZW50U3RyaW5nXzE9Ci0KLUdMWF9nbFhHZXRDb25maWc9Ci1HTFhfZ2xYR2V0Q29uZmlnXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWEdldENvbmZpZ18xPQotR0xYX2dsWEdldENvbmZpZ18yPQotR0xYX2dsWEdldENvbmZpZ18zPQotCi1HTFhfZ2xYR2V0Q3VycmVudENvbnRleHQ9Ci0KLUdMWF9nbFhHZXRDdXJyZW50RHJhd2FibGU9Ci0KLUdMWF9nbFhJc0RpcmVjdD0KLUdMWF9nbFhJc0RpcmVjdF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhJc0RpcmVjdF8xPWNhc3Q9KEdMWENvbnRleHQpCi0KLUdMWF9nbFhNYWtlQ3VycmVudD0KLUdMWF9nbFhNYWtlQ3VycmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhNYWtlQ3VycmVudF8xPWNhc3Q9KEdMWERyYXdhYmxlKQotR0xYX2dsWE1ha2VDdXJyZW50XzI9Y2FzdD0oR0xYQ29udGV4dCkKLQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uPQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzE9Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25fMj0KLQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZz0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nXzE9Ci0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZz0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18xPQotR0xYX2dsWFF1ZXJ5U2VydmVyU3RyaW5nXzI9Ci0KLUdMWF9nbFhRdWVyeVZlcnNpb249Ci1HTFhfZ2xYUXVlcnlWZXJzaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8xPWZsYWdzPW5vX2luCi1HTFhfZ2xYUXVlcnlWZXJzaW9uXzI9ZmxhZ3M9bm9faW4KLQotR0xYX2dsWFN3YXBCdWZmZXJzPQotR0xYX2dsWFN3YXBCdWZmZXJzXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFN3YXBCdWZmZXJzXzE9Y2FzdD0oR0xYRHJhd2FibGUpCi0KLUdMWF9nbFhXYWl0R0w9Ci0KLUdMWF9nbFhXYWl0WD0KLQotR0xYX21lbW1vdmU9Ci1HTFhfbWVtbW92ZV8wPQotR0xYX21lbW1vdmVfMT1jYXN0PShjb25zdCB2b2lkICopCi1HTFhfbWVtbW92ZV8yPWNhc3Q9KHNpemVfdCkKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX2dseF9YVmlzdWFsSW5mbz0KLVhWaXN1YWxJbmZvX3Zpc3VhbD1jYXN0PShWaXN1YWwgKikKLVhWaXN1YWxJbmZvX3Zpc3VhbGlkPQotWFZpc3VhbEluZm9fc2NyZWVuPQotWFZpc3VhbEluZm9fZGVwdGg9Ci1YVmlzdWFsSW5mb19jY2xhc3M9YWNjZXNzb3I9Y2xhc3MKLVhWaXN1YWxJbmZvX3JlZF9tYXNrPQotWFZpc3VhbEluZm9fZ3JlZW5fbWFzaz0KLVhWaXN1YWxJbmZvX2JsdWVfbWFzaz0KLVhWaXN1YWxJbmZvX2NvbG9ybWFwX3NpemU9Ci1YVmlzdWFsSW5mb19iaXRzX3Blcl9yZ2I9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmd0ay5HTFgucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmd0ay5HTFgucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5YjcxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGsuR0xYLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9ndGtfR0xYPQotR0xYX2dsWENob29zZVZpc3VhbD0KLUdMWF9nbFhDaG9vc2VWaXN1YWxfMD0KLUdMWF9nbFhDaG9vc2VWaXN1YWxfMT0KLUdMWF9nbFhDaG9vc2VWaXN1YWxfMj0KLQotR0xYX2dsWENvcHlDb250ZXh0PQotR0xYX2dsWENvcHlDb250ZXh0XzA9Ci1HTFhfZ2xYQ29weUNvbnRleHRfMT0KLUdMWF9nbFhDb3B5Q29udGV4dF8yPQotR0xYX2dsWENvcHlDb250ZXh0XzM9Ci0KLUdMWF9nbFhDcmVhdGVDb250ZXh0PQotR0xYX2dsWENyZWF0ZUNvbnRleHRfMD0KLUdMWF9nbFhDcmVhdGVDb250ZXh0XzE9Ci1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8yPQotR0xYX2dsWENyZWF0ZUNvbnRleHRfMz0KLQotR0xYX2dsWENyZWF0ZUdMWFBpeG1hcD0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMD0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMT0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMj0KLQotR0xYX2dsWERlc3Ryb3lDb250ZXh0PQotR0xYX2dsWERlc3Ryb3lDb250ZXh0XzA9Ci1HTFhfZ2xYRGVzdHJveUNvbnRleHRfMT0KLQotR0xYX2dsWERlc3Ryb3lHTFhQaXhtYXA9Ci1HTFhfZ2xYRGVzdHJveUdMWFBpeG1hcF8wPQotR0xYX2dsWERlc3Ryb3lHTFhQaXhtYXBfMT0KLQotR0xYX2dsWEdldENsaWVudFN0cmluZz0KLUdMWF9nbFhHZXRDbGllbnRTdHJpbmdfMD0KLUdMWF9nbFhHZXRDbGllbnRTdHJpbmdfMT0KLQotR0xYX2dsWEdldENvbmZpZz0KLUdMWF9nbFhHZXRDb25maWdfMD0KLUdMWF9nbFhHZXRDb25maWdfMT0KLUdMWF9nbFhHZXRDb25maWdfMj0KLUdMWF9nbFhHZXRDb25maWdfMz0KLQotR0xYX2dsWEdldEN1cnJlbnRDb250ZXh0PQotCi1HTFhfZ2xYR2V0Q3VycmVudERyYXdhYmxlPQotCi1HTFhfZ2xYSXNEaXJlY3Q9Ci1HTFhfZ2xYSXNEaXJlY3RfMD0KLUdMWF9nbFhJc0RpcmVjdF8xPQotCi1HTFhfZ2xYTWFrZUN1cnJlbnQ9Ci1HTFhfZ2xYTWFrZUN1cnJlbnRfMD0KLUdMWF9nbFhNYWtlQ3VycmVudF8xPQotR0xYX2dsWE1ha2VDdXJyZW50XzI9Ci0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbj0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbl8wPQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzE9Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25fMj0KLQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZz0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfMD0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfMT0KLQotR0xYX2dsWFF1ZXJ5U2VydmVyU3RyaW5nPQotR0xYX2dsWFF1ZXJ5U2VydmVyU3RyaW5nXzA9Ci1HTFhfZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfMT0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18yPQotCi1HTFhfZ2xYUXVlcnlWZXJzaW9uPQotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8wPQotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8xPQotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8yPQotCi1HTFhfZ2xYU3dhcEJ1ZmZlcnM9Ci1HTFhfZ2xYU3dhcEJ1ZmZlcnNfMD0KLUdMWF9nbFhTd2FwQnVmZmVyc18xPQotCi1HTFhfZ2xYVXNlWEZvbnQ9Ci1HTFhfZ2xYVXNlWEZvbnRfMD0KLUdMWF9nbFhVc2VYRm9udF8xPQotR0xYX2dsWFVzZVhGb250XzI9Ci1HTFhfZ2xYVXNlWEZvbnRfMz0KLQotR0xYX2dsWFdhaXRHTD0KLQotR0xYX2dsWFdhaXRYPQotCi1HTFhfbWVtbW92ZT0KLUdMWF9tZW1tb3ZlXzA9Ci1HTFhfbWVtbW92ZV8xPQotR0xYX21lbW1vdmVfMj0KLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX2d0a19YVmlzdWFsSW5mbz0KLVhWaXN1YWxJbmZvX3Zpc3VhbD0KLVhWaXN1YWxJbmZvX3Zpc3VhbGlkPQotWFZpc3VhbEluZm9fc2NyZWVuPQotWFZpc3VhbEluZm9fZGVwdGg9Ci1YVmlzdWFsSW5mb19jY2xhc3M9Ci1YVmlzdWFsSW5mb19yZWRfbWFzaz0KLVhWaXN1YWxJbmZvX2dyZWVuX21hc2s9Ci1YVmlzdWFsSW5mb19ibHVlX21hc2s9Ci1YVmlzdWFsSW5mb19jb2xvcm1hcF9zaXplPQotWFZpc3VhbEluZm9fYml0c19wZXJfcmdiPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC53aW4zMi5XR0wucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLndpbjMyLldHTC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE5NzcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLndpbjMyLldHTC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfd2luMzJfTEFZRVJQTEFORURFU0NSSVBUT1I9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9uU2l6ZT0KLUxBWUVSUExBTkVERVNDUklQVE9SX25WZXJzaW9uPQotTEFZRVJQTEFORURFU0NSSVBUT1JfZHdGbGFncz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2lQaXhlbFR5cGU9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQ29sb3JCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY1JlZEJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jUmVkU2hpZnQ9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jR3JlZW5CaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0dyZWVuU2hpZnQ9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQmx1ZUJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQmx1ZVNoaWZ0PQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FscGhhQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBbHBoYVNoaWZ0PQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FjY3VtQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBY2N1bVJlZEJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWNjdW1HcmVlbkJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWNjdW1CbHVlQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBY2N1bUFscGhhQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NEZXB0aEJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jU3RlbmNpbEJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQXV4QnVmZmVycz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2lMYXllclBsYW5lPQotTEFZRVJQTEFORURFU0NSSVBUT1JfYlJlc2VydmVkPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY3JUcmFuc3BhcmVudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF93aW4zMl9QSVhFTEZPUk1BVERFU0NSSVBUT1I9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfblNpemU9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfblZlcnNpb249Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfZHdGbGFncz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9pUGl4ZWxUeXBlPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NDb2xvckJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY1JlZEJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY1JlZFNoaWZ0PQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NHcmVlbkJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0dyZWVuU2hpZnQ9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0JsdWVCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NCbHVlU2hpZnQ9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FscGhhQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWxwaGFTaGlmdD0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWNjdW1CaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBY2N1bVJlZEJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FjY3VtR3JlZW5CaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBY2N1bUJsdWVCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBY2N1bUFscGhhQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jRGVwdGhCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NTdGVuY2lsQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQXV4QnVmZmVycz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9pTGF5ZXJUeXBlPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2JSZXNlcnZlZD0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9kd0xheWVyTWFzaz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9kd1Zpc2libGVNYXNrPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2R3RGFtYWdlTWFzaz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF93aW4zMl9XR0w9Ci1XR0xfQ2hvb3NlUGl4ZWxGb3JtYXQ9Ci1XR0xfQ2hvb3NlUGl4ZWxGb3JtYXRfMD1jYXN0PShIREMpCi1XR0xfQ2hvb3NlUGl4ZWxGb3JtYXRfMT0KLQotV0dMX0Rlc2NyaWJlUGl4ZWxGb3JtYXQ9Ci1XR0xfRGVzY3JpYmVQaXhlbEZvcm1hdF8wPWNhc3Q9KEhEQykKLVdHTF9EZXNjcmliZVBpeGVsRm9ybWF0XzE9Ci1XR0xfRGVzY3JpYmVQaXhlbEZvcm1hdF8yPQotV0dMX0Rlc2NyaWJlUGl4ZWxGb3JtYXRfMz0KLQotV0dMX0dldFBpeGVsRm9ybWF0PQotV0dMX0dldFBpeGVsRm9ybWF0XzA9Y2FzdD0oSERDKQotCi1XR0xfU2V0UGl4ZWxGb3JtYXQ9Ci1XR0xfU2V0UGl4ZWxGb3JtYXRfMD1jYXN0PShIREMpCi1XR0xfU2V0UGl4ZWxGb3JtYXRfMT0KLVdHTF9TZXRQaXhlbEZvcm1hdF8yPQotCi1XR0xfU3dhcEJ1ZmZlcnM9Ci1XR0xfU3dhcEJ1ZmZlcnNfMD1jYXN0PShIREMpCi0KLVdHTF93Z2xDb3B5Q29udGV4dD0KLVdHTF93Z2xDb3B5Q29udGV4dF8wPWNhc3Q9KEhHTFJDKQotV0dMX3dnbENvcHlDb250ZXh0XzE9Y2FzdD0oSEdMUkMpCi1XR0xfd2dsQ29weUNvbnRleHRfMj0KLQotV0dMX3dnbENyZWF0ZUNvbnRleHQ9Ci1XR0xfd2dsQ3JlYXRlQ29udGV4dF8wPWNhc3Q9KEhEQykKLQotV0dMX3dnbENyZWF0ZUxheWVyQ29udGV4dD0KLVdHTF93Z2xDcmVhdGVMYXllckNvbnRleHRfMD1jYXN0PShIREMpCi1XR0xfd2dsQ3JlYXRlTGF5ZXJDb250ZXh0XzE9Ci0KLVdHTF93Z2xEZWxldGVDb250ZXh0PQotV0dMX3dnbERlbGV0ZUNvbnRleHRfMD1jYXN0PShIR0xSQykKLQotV0dMX3dnbERlc2NyaWJlTGF5ZXJQbGFuZT0KLVdHTF93Z2xEZXNjcmliZUxheWVyUGxhbmVfMD1jYXN0PShIREMpCi1XR0xfd2dsRGVzY3JpYmVMYXllclBsYW5lXzE9Ci1XR0xfd2dsRGVzY3JpYmVMYXllclBsYW5lXzI9Ci1XR0xfd2dsRGVzY3JpYmVMYXllclBsYW5lXzM9Ci1XR0xfd2dsRGVzY3JpYmVMYXllclBsYW5lXzQ9Ci0KLVdHTF93Z2xHZXRDdXJyZW50Q29udGV4dD0KLQotV0dMX3dnbEdldEN1cnJlbnREQz0KLQotV0dMX3dnbEdldExheWVyUGFsZXR0ZUVudHJpZXM9Ci1XR0xfd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllc18wPWNhc3Q9KEhEQykKLVdHTF93Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXzE9Ci1XR0xfd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllc18yPQotV0dMX3dnbEdldExheWVyUGFsZXR0ZUVudHJpZXNfMz0KLVdHTF93Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXzQ9Ci0KLVdHTF93Z2xHZXRQcm9jQWRkcmVzcz0KLVdHTF93Z2xHZXRQcm9jQWRkcmVzc18wPQotCi1XR0xfd2dsTWFrZUN1cnJlbnQ9Ci1XR0xfd2dsTWFrZUN1cnJlbnRfMD1jYXN0PShIREMpCi1XR0xfd2dsTWFrZUN1cnJlbnRfMT1jYXN0PShIR0xSQykKLQotV0dMX3dnbFJlYWxpemVMYXllclBhbGV0dGU9Ci1XR0xfd2dsUmVhbGl6ZUxheWVyUGFsZXR0ZV8wPWNhc3Q9KEhEQykKLVdHTF93Z2xSZWFsaXplTGF5ZXJQYWxldHRlXzE9Ci1XR0xfd2dsUmVhbGl6ZUxheWVyUGFsZXR0ZV8yPQotCi1XR0xfd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcz0KLVdHTF93Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzXzA9Y2FzdD0oSERDKQotV0dMX3dnbFNldExheWVyUGFsZXR0ZUVudHJpZXNfMT0KLVdHTF93Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzXzI9Ci1XR0xfd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllc18zPQotV0dMX3dnbFNldExheWVyUGFsZXR0ZUVudHJpZXNfND0KLQotV0dMX3dnbFNoYXJlTGlzdHM9Ci1XR0xfd2dsU2hhcmVMaXN0c18wPWNhc3Q9KEhHTFJDKQotV0dMX3dnbFNoYXJlTGlzdHNfMT1jYXN0PShIR0xSQykKLQotV0dMX3dnbFN3YXBMYXllckJ1ZmZlcnM9Ci1XR0xfd2dsU3dhcExheWVyQnVmZmVyc18wPWNhc3Q9KEhEQykKLVdHTF93Z2xTd2FwTGF5ZXJCdWZmZXJzXzE9Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5waG90b24uT1MucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucGhvdG9uLk9TLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzAyZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5waG90b24uT1MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9Gb250RGV0YWlscz0KLUZvbnREZXRhaWxzX2Rlc2M9Y2FzdD0oRm9udERlc2NyaXB0aW9uKQotRm9udERldGFpbHNfc3RlbT1jYXN0PShGb250TmFtZSkKLUZvbnREZXRhaWxzX2xvc2l6ZT0KLUZvbnREZXRhaWxzX2hpc2l6ZT0KLUZvbnREZXRhaWxzX2ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnRRdWVyeUluZm89Ci1Gb250UXVlcnlJbmZvX2ZvbnQ9Y2FzdD0oRm9udE5hbWUpCi1Gb250UXVlcnlJbmZvX2Rlc2M9Y2FzdD0oRm9udERlc2NyaXB0aW9uKQotRm9udFF1ZXJ5SW5mb19zaXplPQotRm9udFF1ZXJ5SW5mb19zdHlsZT0KLUZvbnRRdWVyeUluZm9fYXNjZW5kZXI9Ci1Gb250UXVlcnlJbmZvX2Rlc2NlbmRlcj0KLUZvbnRRdWVyeUluZm9fd2lkdGg9Ci1Gb250UXVlcnlJbmZvX2xvY2hhcj0KLUZvbnRRdWVyeUluZm9faGljaGFyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX09TPQotT1NfUGZEZWNvbXBvc2VTdGVtVG9JRD0KLU9TX1BmRGVjb21wb3NlU3RlbVRvSURfMD0KLQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklJST0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJSUlfMD0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJSUlfMT0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJSUlfMj1jYXN0PShjb25zdCBjaGFyICopCi1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySUlJXzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklJSV80PQotCi1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yXzNCXzNCST0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJfM0JfM0JJXzA9Ci1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yXzNCXzNCSV8xPQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMl8zQl8zQklfMj1jYXN0PShjb25zdCBjaGFyICopCi1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yXzNCXzNCSV8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJfM0JfM0JJXzQ9Ci0KLU9TX1BmRXh0ZW50V2lkZVRleHQ9Ci1PU19QZkV4dGVudFdpZGVUZXh0XzA9Ci1PU19QZkV4dGVudFdpZGVUZXh0XzE9Ci1PU19QZkV4dGVudFdpZGVUZXh0XzI9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUGZFeHRlbnRXaWRlVGV4dF8zPWNhc3Q9KGNvbnN0IHVpbnQxNl90ICopCi1PU19QZkV4dGVudFdpZGVUZXh0XzQ9Ci0KLU9TX1BmRm9udERlc2NyaXB0aW9uPQotT1NfUGZGb250RGVzY3JpcHRpb25fMD1jYXN0PShGb250SUQgKikKLQotT1NfUGZGb250RmxhZ3M9Ci1PU19QZkZvbnRGbGFnc18wPWNhc3Q9KEZvbnRJRCAqKQotCi1PU19QZkZvbnRTaXplPQotT1NfUGZGb250U2l6ZV8wPWNhc3Q9KEZvbnRJRCAqKQotCi1PU19QZkZyZWVGb250PQotT1NfUGZGcmVlRm9udF8wPWNhc3Q9KEZvbnRJRCAqKQotCi1PU19QZkdlbmVyYXRlRm9udE5hbWU9Ci1PU19QZkdlbmVyYXRlRm9udE5hbWVfMD1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QZkdlbmVyYXRlRm9udE5hbWVfMT0KLU9TX1BmR2VuZXJhdGVGb250TmFtZV8yPQotT1NfUGZHZW5lcmF0ZUZvbnROYW1lXzM9Y2FzdD0oY2hhciAqKQotCi1PU19QZkxvYWRNZXRyaWNzPQotT1NfUGZMb2FkTWV0cmljc18wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfUGZRdWVyeUZvbnRJbmZvPQotT1NfUGZRdWVyeUZvbnRJbmZvXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUGZRdWVyeUZvbnRJbmZvXzE9Y2FzdD0oRm9udFF1ZXJ5SW5mbyAqKQotCi1PU19QZlF1ZXJ5Rm9udHM9Ci1PU19QZlF1ZXJ5Rm9udHNfMD0KLU9TX1BmUXVlcnlGb250c18xPQotT1NfUGZRdWVyeUZvbnRzXzI9Y2FzdD0oRm9udERldGFpbHMgKikKLU9TX1BmUXVlcnlGb250c18zPQotCi1PU19QZ0FscGhhT2ZmPQotCi1PU19QZ0FscGhhT249Ci0KLU9TX1BnQ3JlYXRlR0M9Ci1PU19QZ0NyZWF0ZUdDXzA9Ci0KLU9TX1BnRGVzdHJveUdDPQotT1NfUGdEZXN0cm95R0NfMD1jYXN0PShQaEdDX3QgKikKLQotT1NfUGdEcmF3QXJjPQotT1NfUGdEcmF3QXJjXzA9Ci1PU19QZ0RyYXdBcmNfMT0KLU9TX1BnRHJhd0FyY18yPQotT1NfUGdEcmF3QXJjXzM9Ci1PU19QZ0RyYXdBcmNfND0KLQotT1NfUGdEcmF3QXJyb3c9Ci1PU19QZ0RyYXdBcnJvd18wPQotT1NfUGdEcmF3QXJyb3dfMT0KLU9TX1BnRHJhd0Fycm93XzI9Y2FzdD0oUGdDb2xvcl90KQotT1NfUGdEcmF3QXJyb3dfMz0KLQotT1NfUGdEcmF3Qml0bWFwPQotT1NfUGdEcmF3Qml0bWFwXzA9Y2FzdD0odm9pZCBjb25zdCAqKQotT1NfUGdEcmF3Qml0bWFwXzE9Y2FzdD0oaW50KQotT1NfUGdEcmF3Qml0bWFwXzI9Y2FzdD0oUGhQb2ludF90ICopCi1PU19QZ0RyYXdCaXRtYXBfMz1jYXN0PShQaFBvaW50X3QgKikKLU9TX1BnRHJhd0JpdG1hcF80PWNhc3Q9KGludCkKLU9TX1BnRHJhd0JpdG1hcF81PWNhc3Q9KGxvbmcpCi0KLU9TX1BnRHJhd0VsbGlwc2U9Ci1PU19QZ0RyYXdFbGxpcHNlXzA9Ci1PU19QZ0RyYXdFbGxpcHNlXzE9Ci1PU19QZ0RyYXdFbGxpcHNlXzI9Ci0KLU9TX1BnRHJhd0dyYWRpZW50PQotT1NfUGdEcmF3R3JhZGllbnRfMD0KLU9TX1BnRHJhd0dyYWRpZW50XzE9Ci1PU19QZ0RyYXdHcmFkaWVudF8yPQotT1NfUGdEcmF3R3JhZGllbnRfMz0KLU9TX1BnRHJhd0dyYWRpZW50XzQ9Ci1PU19QZ0RyYXdHcmFkaWVudF81PWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1BnRHJhd0dyYWRpZW50XzY9Y2FzdD0oUGdDb2xvcl90KQotT1NfUGdEcmF3R3JhZGllbnRfNz1jYXN0PShQZ0NvbG9yX3QpCi1PU19QZ0RyYXdHcmFkaWVudF84PWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1BnRHJhd0dyYWRpZW50Xzk9Ci1PU19QZ0RyYXdHcmFkaWVudF8xMD1jYXN0PSh1bnNpZ25lZCBjaGFyICopCi0KLU9TX1BnRHJhd0lMaW5lPQotT1NfUGdEcmF3SUxpbmVfMD0KLU9TX1BnRHJhd0lMaW5lXzE9Ci1PU19QZ0RyYXdJTGluZV8yPQotT1NfUGdEcmF3SUxpbmVfMz0KLQotT1NfUGdEcmF3SVBpeGVsPQotT1NfUGdEcmF3SVBpeGVsXzA9Ci1PU19QZ0RyYXdJUGl4ZWxfMT0KLQotT1NfUGdEcmF3SVJlY3Q9Ci1PU19QZ0RyYXdJUmVjdF8wPQotT1NfUGdEcmF3SVJlY3RfMT0KLU9TX1BnRHJhd0lSZWN0XzI9Ci1PU19QZ0RyYXdJUmVjdF8zPQotT1NfUGdEcmF3SVJlY3RfND0KLQotT1NfUGdEcmF3SW1hZ2U9Ci1PU19QZ0RyYXdJbWFnZV8wPWNhc3Q9KHZvaWQgY29uc3QgKikKLU9TX1BnRHJhd0ltYWdlXzE9Ci1PU19QZ0RyYXdJbWFnZV8yPQotT1NfUGdEcmF3SW1hZ2VfMz0KLU9TX1BnRHJhd0ltYWdlXzQ9Ci1PU19QZ0RyYXdJbWFnZV81PQotCi1PU19QZ0RyYXdNdWx0aVRleHRBcmVhPQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYV8wPWNhc3Q9KGNoYXIgKikKLU9TX1BnRHJhd011bHRpVGV4dEFyZWFfMT0KLU9TX1BnRHJhd011bHRpVGV4dEFyZWFfMj0KLU9TX1BnRHJhd011bHRpVGV4dEFyZWFfMz0KLU9TX1BnRHJhd011bHRpVGV4dEFyZWFfND0KLU9TX1BnRHJhd011bHRpVGV4dEFyZWFfNT0KLQotT1NfUGdEcmF3UGhJbWFnZVJlY3RteD0KLU9TX1BnRHJhd1BoSW1hZ2VSZWN0bXhfMD0KLU9TX1BnRHJhd1BoSW1hZ2VSZWN0bXhfMT1jYXN0PShQaEltYWdlX3QgY29uc3QgKikKLU9TX1BnRHJhd1BoSW1hZ2VSZWN0bXhfMj0KLU9TX1BnRHJhd1BoSW1hZ2VSZWN0bXhfMz0KLQotT1NfUGdEcmF3UG9seWdvbj0KLU9TX1BnRHJhd1BvbHlnb25fMD1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1BnRHJhd1BvbHlnb25fMT0KLU9TX1BnRHJhd1BvbHlnb25fMj1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1BnRHJhd1BvbHlnb25fMz0KLQotT1NfUGdEcmF3Um91bmRSZWN0PQotT1NfUGdEcmF3Um91bmRSZWN0XzA9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLU9TX1BnRHJhd1JvdW5kUmVjdF8xPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUGdEcmF3Um91bmRSZWN0XzI9Ci0KLU9TX1BnRHJhd1RJbWFnZT0KLU9TX1BnRHJhd1RJbWFnZV8wPWNhc3Q9KHZvaWQgY29uc3QgKikKLU9TX1BnRHJhd1RJbWFnZV8xPQotT1NfUGdEcmF3VEltYWdlXzI9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QZ0RyYXdUSW1hZ2VfMz1jYXN0PShQaERpbV90IGNvbnN0ICopCi1PU19QZ0RyYXdUSW1hZ2VfND0KLU9TX1BnRHJhd1RJbWFnZV81PQotT1NfUGdEcmF3VEltYWdlXzY9Y2FzdD0odm9pZCBjb25zdCAqKQotT1NfUGdEcmF3VEltYWdlXzc9Ci0KLU9TX1BnRHJhd1RleHQ9Ci1PU19QZ0RyYXdUZXh0XzA9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUGdEcmF3VGV4dF8xPQotT1NfUGdEcmF3VGV4dF8yPWNhc3Q9KFBoUG9pbnRfdCAqKQotT1NfUGdEcmF3VGV4dF8zPQotCi1PU19QZ0V4dGVudE11bHRpVGV4dD0KLU9TX1BnRXh0ZW50TXVsdGlUZXh0XzA9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BnRXh0ZW50TXVsdGlUZXh0XzE9Y2FzdD0oUGhQb2ludF90ICopCi1PU19QZ0V4dGVudE11bHRpVGV4dF8yPWNhc3Q9KGNoYXIgKikKLU9TX1BnRXh0ZW50TXVsdGlUZXh0XzM9Y2FzdD0oY2hhciAqKQotT1NfUGdFeHRlbnRNdWx0aVRleHRfND0KLU9TX1BnRXh0ZW50TXVsdGlUZXh0XzU9Ci0KLU9TX1BnRmx1c2g9Ci0KLU9TX1BnR2V0VmlkZW9Nb2RlPQotT1NfUGdHZXRWaWRlb01vZGVfMD1jYXN0PShQZ0Rpc3BsYXlTZXR0aW5nc190ICopLGZsYWdzPWluaXQKLQotT1NfUGdHZXRWaWRlb01vZGVJbmZvPQotT1NfUGdHZXRWaWRlb01vZGVJbmZvXzA9Ci1PU19QZ0dldFZpZGVvTW9kZUluZm9fMT1jYXN0PShQZ1ZpZGVvTW9kZUluZm9fdCAqKQotCi1PU19QZ1JlYWRTY3JlZW49Ci1PU19QZ1JlYWRTY3JlZW5fMD1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGdSZWFkU2NyZWVuXzE9Y2FzdD0odm9pZCAqKQotCi1PU19QZ1JlYWRTY3JlZW5TaXplPQotT1NfUGdSZWFkU2NyZWVuU2l6ZV8wPWNhc3Q9KFBoUmVjdF90ICopCi0KLU9TX1BnU2V0QWxwaGE9Ci1PU19QZ1NldEFscGhhXzA9Ci1PU19QZ1NldEFscGhhXzE9Y2FzdD0oUGdNYXBfdCBjb25zdCAqKQotT1NfUGdTZXRBbHBoYV8yPWNhc3Q9KFBnR3JhZGllbnRfdCBjb25zdCAqKQotT1NfUGdTZXRBbHBoYV8zPQotT1NfUGdTZXRBbHBoYV80PQotCi1PU19QZ1NldENsaXBwaW5nPQotT1NfUGdTZXRDbGlwcGluZ18wPQotT1NfUGdTZXRDbGlwcGluZ18xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1BnU2V0RHJhd0J1ZmZlclNpemU9Ci1PU19QZ1NldERyYXdCdWZmZXJTaXplXzA9Ci0KLU9TX1BnU2V0RHJhd01vZGU9Ci1PU19QZ1NldERyYXdNb2RlXzA9Ci0KLU9TX1BnU2V0RmlsbENvbG9yPQotT1NfUGdTZXRGaWxsQ29sb3JfMD1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1BnU2V0RmlsbFRyYW5zUGF0PQotT1NfUGdTZXRGaWxsVHJhbnNQYXRfMD1jYXN0PShQZ1BhdHRlcm5fdCkKLQotT1NfUGdTZXRGb250PQotT1NfUGdTZXRGb250XzA9Y2FzdD0oY2hhciBjb25zdCAqKQotCi1PU19QZ1NldEdDPQotT1NfUGdTZXRHQ18wPWNhc3Q9KFBoR0NfdCAqKQotCi1PU19QZ1NldE11bHRpQ2xpcD0KLU9TX1BnU2V0TXVsdGlDbGlwXzA9Ci1PU19QZ1NldE11bHRpQ2xpcF8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1BnU2V0UGFsZXR0ZT0KLU9TX1BnU2V0UGFsZXR0ZV8wPWNhc3Q9KFBnQ29sb3JfdCBjb25zdCAqKQotT1NfUGdTZXRQYWxldHRlXzE9Ci1PU19QZ1NldFBhbGV0dGVfMj0KLU9TX1BnU2V0UGFsZXR0ZV8zPQotT1NfUGdTZXRQYWxldHRlXzQ9Ci1PU19QZ1NldFBhbGV0dGVfNT0KLQotT1NfUGdTZXRSZWdpb249Ci1PU19QZ1NldFJlZ2lvbl8wPWNhc3Q9KFBoUmlkX3QpCi0KLU9TX1BnU2V0U3Ryb2tlQ2FwPQotT1NfUGdTZXRTdHJva2VDYXBfMD0KLQotT1NfUGdTZXRTdHJva2VDb2xvcj0KLU9TX1BnU2V0U3Ryb2tlQ29sb3JfMD1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1BnU2V0U3Ryb2tlRGFzaD0KLU9TX1BnU2V0U3Ryb2tlRGFzaF8wPWNhc3Q9KHVuc2lnbmVkIGNoYXIgY29uc3QgKikKLU9TX1BnU2V0U3Ryb2tlRGFzaF8xPQotT1NfUGdTZXRTdHJva2VEYXNoXzI9Ci0KLU9TX1BnU2V0U3Ryb2tlSm9pbj0KLU9TX1BnU2V0U3Ryb2tlSm9pbl8wPQotCi1PU19QZ1NldFN0cm9rZVdpZHRoPQotT1NfUGdTZXRTdHJva2VXaWR0aF8wPQotCi1PU19QZ1NldFRleHRDb2xvcj0KLU9TX1BnU2V0VGV4dENvbG9yXzA9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QZ1NldFRleHRYT1JDb2xvcj0KLU9TX1BnU2V0VGV4dFhPUkNvbG9yXzA9Y2FzdD0oUGdDb2xvcl90KQotT1NfUGdTZXRUZXh0WE9SQ29sb3JfMT1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1BnU2V0VXNlckNsaXA9Ci1PU19QZ1NldFVzZXJDbGlwXzA9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUGdTaG1lbUNyZWF0ZT0KLU9TX1BnU2htZW1DcmVhdGVfMD0KLU9TX1BnU2htZW1DcmVhdGVfMT1jYXN0PShjaGFyIGNvbnN0ICopCi0KLU9TX1BnU2htZW1EZXN0cm95PQotT1NfUGdTaG1lbURlc3Ryb3lfMD1jYXN0PSh2b2lkICopCi0KLU9TX1BoQWRkTWVyZ2VUaWxlcz0KLU9TX1BoQWRkTWVyZ2VUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaEFkZE1lcmdlVGlsZXNfMT1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhBZGRNZXJnZVRpbGVzXzI9Y2FzdD0oaW50ICopCi0KLU9TX1BoQXJlYVRvUmVjdD0KLU9TX1BoQXJlYVRvUmVjdF8wPWNhc3Q9KFBoQXJlYV90IGNvbnN0ICopCi1PU19QaEFyZWFUb1JlY3RfMT1jYXN0PShQaFJlY3RfdCAqKQotCi1PU19QaEJsaXQ9Ci1PU19QaEJsaXRfMD1jYXN0PShQaFJpZF90KQotT1NfUGhCbGl0XzE9Y2FzdD0oY29uc3QgUGhSZWN0X3QgKikKLU9TX1BoQmxpdF8yPWNhc3Q9KGNvbnN0IFBoUG9pbnRfdCAqKQotCi1PU19QaENsaXBUaWxpbmdzPQotT1NfUGhDbGlwVGlsaW5nc18wPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaENsaXBUaWxpbmdzXzE9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoQ2xpcFRpbGluZ3NfMj1jYXN0PShQaFRpbGVfdCAqKikKLQotT1NfUGhDbGlwYm9hcmRDb3B5PQotT1NfUGhDbGlwYm9hcmRDb3B5XzA9Ci1PU19QaENsaXBib2FyZENvcHlfMT0KLU9TX1BoQ2xpcGJvYXJkQ29weV8yPWNhc3Q9KFBoQ2xpcEhlYWRlciBjb25zdCAqKQotCi1PU19QaENsaXBib2FyZENvcHlTdHJpbmc9Ci1PU19QaENsaXBib2FyZENvcHlTdHJpbmdfMD0KLU9TX1BoQ2xpcGJvYXJkQ29weVN0cmluZ18xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfUGhDbGlwYm9hcmRQYXN0ZUZpbmlzaD0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVGaW5pc2hfMD1jYXN0PSh2b2lkICopCi0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVTdGFydD0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVTdGFydF8wPQotCi1PU19QaENsaXBib2FyZFBhc3RlU3RyaW5nPQotT1NfUGhDbGlwYm9hcmRQYXN0ZVN0cmluZ18wPQotCi1PU19QaENsaXBib2FyZFBhc3RlVHlwZT0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVUeXBlXzA9Y2FzdD0odm9pZCAqKQotT1NfUGhDbGlwYm9hcmRQYXN0ZVR5cGVfMT0KLQotT1NfUGhDbGlwYm9hcmRQYXN0ZVR5cGVOPQotT1NfUGhDbGlwYm9hcmRQYXN0ZVR5cGVOXzA9Y2FzdD0odm9pZCAqKQotT1NfUGhDbGlwYm9hcmRQYXN0ZVR5cGVOXzE9Ci0KLU9TX1BoQ29hbGVzY2VUaWxlcz0KLU9TX1BoQ29hbGVzY2VUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi0KLU9TX1BoQ29weVRpbGVzPQotT1NfUGhDb3B5VGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotCi1PU19QaENyZWF0ZUltYWdlPQotT1NfUGhDcmVhdGVJbWFnZV8wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotT1NfUGhDcmVhdGVJbWFnZV8xPQotT1NfUGhDcmVhdGVJbWFnZV8yPQotT1NfUGhDcmVhdGVJbWFnZV8zPQotT1NfUGhDcmVhdGVJbWFnZV80PWNhc3Q9KFBnQ29sb3JfdCBjb25zdCAqKQotT1NfUGhDcmVhdGVJbWFnZV81PQotT1NfUGhDcmVhdGVJbWFnZV82PQotCi1PU19QaERDU2V0Q3VycmVudD0KLU9TX1BoRENTZXRDdXJyZW50XzA9Y2FzdD0odm9pZCAqKQotCi1PU19QaERlVHJhbnNsYXRlVGlsZXM9Ci1PU19QaERlVHJhbnNsYXRlVGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhEZVRyYW5zbGF0ZVRpbGVzXzE9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi0KLU9TX1BoRXZlbnROZXh0PQotT1NfUGhFdmVudE5leHRfMD1jYXN0PSh2b2lkICopCi1PU19QaEV2ZW50TmV4dF8xPQotCi1PU19QaEV2ZW50UGVlaz0KLU9TX1BoRXZlbnRQZWVrXzA9Y2FzdD0odm9pZCAqKQotT1NfUGhFdmVudFBlZWtfMT0KLQotT1NfUGhGcmVlVGlsZXM9Ci1PU19QaEZyZWVUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi0KLU9TX1BoR2V0RGF0YT0KLU9TX1BoR2V0RGF0YV8wPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QaEdldE1zZ1NpemU9Ci1PU19QaEdldE1zZ1NpemVfMD1jYXN0PShQaEV2ZW50X3QgY29uc3QgKikKLQotT1NfUGhHZXRSZWN0cz0KLU9TX1BoR2V0UmVjdHNfMD1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUGhHZXRUaWxlPWZsYWdzPW5vX2dlbgotCi1PU19QaEluaXREcmFnPQotT1NfUGhJbml0RHJhZ18wPWNhc3Q9KFBoUmlkX3QpCi1PU19QaEluaXREcmFnXzE9Ci1PU19QaEluaXREcmFnXzI9Y2FzdD0oY29uc3QgUGhSZWN0X3QgKikKLU9TX1BoSW5pdERyYWdfMz1jYXN0PShjb25zdCBQaFJlY3RfdCAqKQotT1NfUGhJbml0RHJhZ180PQotT1NfUGhJbml0RHJhZ181PWNhc3Q9KFBoRGltX3QgKikKLU9TX1BoSW5pdERyYWdfNj1jYXN0PShQaERpbV90ICopCi1PU19QaEluaXREcmFnXzc9Y2FzdD0oUGhEaW1fdCAqKQotT1NfUGhJbml0RHJhZ184PWNhc3Q9KFBoUG9pbnRfdCAqKQotT1NfUGhJbml0RHJhZ185PWNhc3Q9KFBoQ3Vyc29yRGVzY3JpcHRpb25fdCAqKQotCi1PU19QaElucHV0R3JvdXA9Ci1PU19QaElucHV0R3JvdXBfMD1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUGhJbnRlcnNlY3RUaWxpbmdzPQotT1NfUGhJbnRlcnNlY3RUaWxpbmdzXzA9Y2FzdD0oUGhUaWxlX3QgY29uc3QgKikKLU9TX1BoSW50ZXJzZWN0VGlsaW5nc18xPWNhc3Q9KFBoVGlsZV90IGNvbnN0ICopCi1PU19QaEludGVyc2VjdFRpbGluZ3NfMj0KLQotT1NfUGhLZXlUb01iPQotT1NfUGhLZXlUb01iXzA9Y2FzdD1jaGFyICoKLU9TX1BoS2V5VG9NYl8xPQotCi1PU19QaE1ha2VHaG9zdEJpdG1hcD0KLU9TX1BoTWFrZUdob3N0Qml0bWFwXzA9Y2FzdD0oUGhJbWFnZV90ICopCi0KLU9TX1BoTWFrZVRyYW5zQml0bWFwPQotT1NfUGhNYWtlVHJhbnNCaXRtYXBfMD1jYXN0PShQaEltYWdlX3QgKikKLU9TX1BoTWFrZVRyYW5zQml0bWFwXzE9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QaE1lcmdlVGlsZXM9Ci1PU19QaE1lcmdlVGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotCi1PU19QaE1vdmVDdXJzb3JBYnM9Ci1PU19QaE1vdmVDdXJzb3JBYnNfMD0KLU9TX1BoTW92ZUN1cnNvckFic18xPQotT1NfUGhNb3ZlQ3Vyc29yQWJzXzI9Ci0KLU9TX1BoUXVlcnlDdXJzb3I9Ci1PU19QaFF1ZXJ5Q3Vyc29yXzA9Ci1PU19QaFF1ZXJ5Q3Vyc29yXzE9Y2FzdD0oUGhDdXJzb3JJbmZvX3QgKikKLQotT1NfUGhRdWVyeVJpZHM9Ci1PU19QaFF1ZXJ5Umlkc18wPQotT1NfUGhRdWVyeVJpZHNfMT1jYXN0PShQaFJpZF90KQotT1NfUGhRdWVyeVJpZHNfMj0KLU9TX1BoUXVlcnlSaWRzXzM9Ci1PU19QaFF1ZXJ5Umlkc180PQotT1NfUGhRdWVyeVJpZHNfNT1jYXN0PShQaFJpZF90KQotT1NfUGhRdWVyeVJpZHNfNj1jYXN0PShjb25zdCBQaFJlY3RfdCAqKQotT1NfUGhRdWVyeVJpZHNfNz1jYXN0PShQaFJpZF90ICopCi1PU19QaFF1ZXJ5Umlkc184PQotCi1PU19QaFJlY3RJbnRlcnNlY3Q9Ci1PU19QaFJlY3RJbnRlcnNlY3RfMD1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGhSZWN0SW50ZXJzZWN0XzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUGhSZWN0VW5pb25fX0lJPQotT1NfUGhSZWN0VW5pb25fX0lJXzA9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BoUmVjdFVuaW9uX19JSV8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1BoUmVjdFVuaW9uX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yPQotT1NfUGhSZWN0VW5pb25fX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJfMD1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGhSZWN0VW5pb25fX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QaFJlY3RzVG9UaWxlcz0KLU9TX1BoUmVjdHNUb1RpbGVzXzA9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BoUmVjdHNUb1RpbGVzXzE9Ci0KLU9TX1BoUmVnaW9uUXVlcnk9Ci1PU19QaFJlZ2lvblF1ZXJ5XzA9Y2FzdD0oUGhSaWRfdCkKLU9TX1BoUmVnaW9uUXVlcnlfMT1jYXN0PShQaFJlZ2lvbl90ICopCi1PU19QaFJlZ2lvblF1ZXJ5XzI9Y2FzdD0oUGhSZWN0X3QgKikKLU9TX1BoUmVnaW9uUXVlcnlfMz1jYXN0PSh2b2lkICopCi1PU19QaFJlZ2lvblF1ZXJ5XzQ9Ci0KLU9TX1BoUmVsZWFzZUltYWdlPQotT1NfUGhSZWxlYXNlSW1hZ2VfMD1jYXN0PShQaEltYWdlX3QgKikKLQotT1NfUGhTb3J0VGlsZXM9Ci1PU19QaFNvcnRUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi0KLU9TX1BoVGlsZXNUb1JlY3RzPQotT1NfUGhUaWxlc1RvUmVjdHNfMD1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhUaWxlc1RvUmVjdHNfMT1jYXN0PShpbnQgKikKLQotT1NfUGhUcmFuc2xhdGVUaWxlcz0KLU9TX1BoVHJhbnNsYXRlVGlsZXNfMD1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhUcmFuc2xhdGVUaWxlc18xPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotCi1PU19QaFdpbmRvd1F1ZXJ5VmlzaWJsZT0KLU9TX1BoV2luZG93UXVlcnlWaXNpYmxlXzA9Ci1PU19QaFdpbmRvd1F1ZXJ5VmlzaWJsZV8xPWNhc3Q9KFBoUmlkX3QpCi1PU19QaFdpbmRvd1F1ZXJ5VmlzaWJsZV8yPQotT1NfUGhXaW5kb3dRdWVyeVZpc2libGVfMz1jYXN0PShQaFJlY3RfdCAqKQotCi1PU19QaUNyb3BJbWFnZT0KLU9TX1BpQ3JvcEltYWdlXzA9Y2FzdD0oUGhJbWFnZV90ICopCi1PU19QaUNyb3BJbWFnZV8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi1PU19QaUNyb3BJbWFnZV8yPQotCi1PU19QaUR1cGxpY2F0ZUltYWdlPQotT1NfUGlEdXBsaWNhdGVJbWFnZV8wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotT1NfUGlEdXBsaWNhdGVJbWFnZV8xPQotCi1PU19QbU1lbUNyZWF0ZU1DPQotT1NfUG1NZW1DcmVhdGVNQ18wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotT1NfUG1NZW1DcmVhdGVNQ18xPWNhc3Q9KFBoRGltX3QgKikKLU9TX1BtTWVtQ3JlYXRlTUNfMj1jYXN0PShQaFBvaW50X3QgKikKLQotT1NfUG1NZW1GbHVzaD0KLU9TX1BtTWVtRmx1c2hfMD1jYXN0PShQbU1lbW9yeUNvbnRleHRfdCAqKQotT1NfUG1NZW1GbHVzaF8xPWNhc3Q9KFBoSW1hZ2VfdCAqKQotCi1PU19QbU1lbVJlbGVhc2VNQz0KLU9TX1BtTWVtUmVsZWFzZU1DXzA9Y2FzdD0oUG1NZW1vcnlDb250ZXh0X3QgKikKLQotT1NfUG1NZW1TdGFydD0KLU9TX1BtTWVtU3RhcnRfMD1jYXN0PShQbU1lbW9yeUNvbnRleHRfdCAqKQotCi1PU19QbU1lbVN0b3A9Ci1PU19QbU1lbVN0b3BfMD1jYXN0PShQbU1lbW9yeUNvbnRleHRfdCAqKQotCi1PU19QdEFkZENhbGxiYWNrPQotT1NfUHRBZGRDYWxsYmFja18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QWRkQ2FsbGJhY2tfMT0KLU9TX1B0QWRkQ2FsbGJhY2tfMj1jYXN0PShQdENhbGxiYWNrRl90ICopCi1PU19QdEFkZENhbGxiYWNrXzM9Y2FzdD0odm9pZCAqKQotCi1PU19QdEFkZEV2ZW50SGFuZGxlcj0KLU9TX1B0QWRkRXZlbnRIYW5kbGVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRBZGRFdmVudEhhbmRsZXJfMT0KLU9TX1B0QWRkRXZlbnRIYW5kbGVyXzI9Y2FzdD0oUHRDYWxsYmFja0ZfdCAqKQotT1NfUHRBZGRFdmVudEhhbmRsZXJfMz1jYXN0PSh2b2lkICopCi0KLU9TX1B0QWRkRmlsdGVyQ2FsbGJhY2s9Ci1PU19QdEFkZEZpbHRlckNhbGxiYWNrXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRBZGRGaWx0ZXJDYWxsYmFja18xPQotT1NfUHRBZGRGaWx0ZXJDYWxsYmFja18yPWNhc3Q9KFB0Q2FsbGJhY2tGX3QgKikKLU9TX1B0QWRkRmlsdGVyQ2FsbGJhY2tfMz1jYXN0PSh2b2lkICopCi0KLU9TX1B0QWRkSG90a2V5SGFuZGxlcj0KLU9TX1B0QWRkSG90a2V5SGFuZGxlcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QWRkSG90a2V5SGFuZGxlcl8xPQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyXzI9Ci1PU19QdEFkZEhvdGtleUhhbmRsZXJfMz0KLU9TX1B0QWRkSG90a2V5SGFuZGxlcl80PWNhc3Q9KHZvaWQgKikKLU9TX1B0QWRkSG90a2V5SGFuZGxlcl81PWNhc3Q9KFB0Q2FsbGJhY2tGX3QgKikKLQotT1NfUHRBbGVydD0KLU9TX1B0QWxlcnRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEFsZXJ0XzE9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QdEFsZXJ0XzI9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRBbGVydF8zPWNhc3Q9KFBoSW1hZ2VfdCBjb25zdCAqKQotT1NfUHRBbGVydF80PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0QWxlcnRfNT1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEFsZXJ0XzY9Ci1PU19QdEFsZXJ0Xzc9Y2FzdD0oY2hhciBjb25zdCAqKikKLU9TX1B0QWxlcnRfOD1jYXN0PShjaGFyIGNvbnN0ICoqKQotT1NfUHRBbGVydF85PQotT1NfUHRBbGVydF8xMD0KLU9TX1B0QWxlcnRfMTE9Ci0KLU9TX1B0QXBwQWRkSW5wdXQ9Ci1PU19QdEFwcEFkZElucHV0XzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcEFkZElucHV0XzE9Y2FzdD0ocGlkX3QpCi1PU19QdEFwcEFkZElucHV0XzI9Y2FzdD0oUHRJbnB1dENhbGxiYWNrUHJvY190KQotT1NfUHRBcHBBZGRJbnB1dF8zPWNhc3Q9KHZvaWQgKikKLQotT1NfUHRBcHBBZGRXb3JrUHJvYz0KLU9TX1B0QXBwQWRkV29ya1Byb2NfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwQWRkV29ya1Byb2NfMT1jYXN0PShQdFdvcmtQcm9jX3QpCi1PU19QdEFwcEFkZFdvcmtQcm9jXzI9Y2FzdD0odm9pZCAqKQotCi1PU19QdEFwcENyZWF0ZVB1bHNlPQotT1NfUHRBcHBDcmVhdGVQdWxzZV8wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBDcmVhdGVQdWxzZV8xPQotCi1PU19QdEFwcERlbGV0ZVB1bHNlPQotT1NfUHRBcHBEZWxldGVQdWxzZV8wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBEZWxldGVQdWxzZV8xPWNhc3Q9KHBpZF90KQotCi1PU19QdEFwcFByb2Nlc3NFdmVudD0KLU9TX1B0QXBwUHJvY2Vzc0V2ZW50XzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi0KLU9TX1B0QXBwUHVsc2VUcmlnZ2VyPQotT1NfUHRBcHBQdWxzZVRyaWdnZXJfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwUHVsc2VUcmlnZ2VyXzE9Y2FzdD0ocGlkX3QpCi0KLU9TX1B0QXBwUmVtb3ZlSW5wdXQ9Ci1PU19QdEFwcFJlbW92ZUlucHV0XzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcFJlbW92ZUlucHV0XzE9Y2FzdD0oUHRJbnB1dElkX3QgKikKLQotT1NfUHRBcHBSZW1vdmVXb3JrUHJvYz0KLU9TX1B0QXBwUmVtb3ZlV29ya1Byb2NfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwUmVtb3ZlV29ya1Byb2NfMT1jYXN0PShQdFdvcmtQcm9jSWRfdCAqKQotCi1PU19QdEJlZXA9Ci0KLU9TX1B0QmxpdD0KLU9TX1B0QmxpdF8wPWNhc3Q9KFB0V2lkZ2V0X3QgY29uc3QgKikKLU9TX1B0QmxpdF8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi1PU19QdEJsaXRfMj1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLQotT1NfUHRCbG9ja0FsbFdpbmRvd3M9Ci1PU19QdEJsb2NrQWxsV2luZG93c18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QmxvY2tBbGxXaW5kb3dzXzE9Ci1PU19QdEJsb2NrQWxsV2luZG93c18yPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUHRCbG9ja1dpbmRvdz0KLU9TX1B0QmxvY2tXaW5kb3dfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEJsb2NrV2luZG93XzE9Ci1PU19QdEJsb2NrV2luZG93XzI9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QdEJ1dHRvbj1mbGFncz1jb25zdAotCi1PU19QdENhbGNCb3JkZXI9Ci1PU19QdENhbGNCb3JkZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENhbGNCb3JkZXJfMT0KLQotT1NfUHRDYWxjQ2FudmFzPQotT1NfUHRDYWxjQ2FudmFzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDYWxjQ2FudmFzXzE9Y2FzdD0oUGhSZWN0X3QgKikKLQotT1NfUHRDbGlwcGVkQmxpdD0KLU9TX1B0Q2xpcHBlZEJsaXRfMD1jYXN0PShQdFdpZGdldF90IGNvbnN0ICopCi1PU19QdENsaXBwZWRCbGl0XzE9Y2FzdD0oUGhUaWxlX3QgY29uc3QgKikKLU9TX1B0Q2xpcHBlZEJsaXRfMj1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1B0Q2xpcHBlZEJsaXRfMz1jYXN0PShQaFRpbGVfdCBjb25zdCAqKQotCi1PU19QdENvbG9yU2VsZWN0PQotT1NfUHRDb2xvclNlbGVjdF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q29sb3JTZWxlY3RfMT1jYXN0PShjaGFyICopCi1PU19QdENvbG9yU2VsZWN0XzI9Ci0KLU9TX1B0Q29tYm9Cb3g9ZmxhZ3M9Y29uc3QKLQotT1NfUHRDb250YWluZXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRDb250YWluZXJGaW5kRm9jdXM9Ci1PU19QdENvbnRhaW5lckZpbmRGb2N1c18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRDb250YWluZXJGb2N1c05leHQ9Ci1PU19QdENvbnRhaW5lckZvY3VzTmV4dF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q29udGFpbmVyRm9jdXNOZXh0XzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0Q29udGFpbmVyRm9jdXNQcmV2PQotT1NfUHRDb250YWluZXJGb2N1c1ByZXZfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENvbnRhaW5lckZvY3VzUHJldl8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdENvbnRhaW5lckdpdmVGb2N1cz0KLU9TX1B0Q29udGFpbmVyR2l2ZUZvY3VzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDb250YWluZXJHaXZlRm9jdXNfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRDb250YWluZXJIb2xkPQotT1NfUHRDb250YWluZXJIb2xkXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdENvbnRhaW5lclJlbGVhc2U9Ci1PU19QdENvbnRhaW5lclJlbGVhc2VfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0Q3JlYXRlQXBwQ29udGV4dD0KLQotT1NfUHRDcmVhdGVXaWRnZXQ9Ci1PU19QdENyZWF0ZVdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0Q2xhc3NSZWZfdCAqKQotT1NfUHRDcmVhdGVXaWRnZXRfMT1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENyZWF0ZVdpZGdldF8yPQotT1NfUHRDcmVhdGVXaWRnZXRfMz1jYXN0PShQdEFyZ190IGNvbnN0ICopCi0KLU9TX1B0Q3JlYXRlV2lkZ2V0Q2xhc3M9Ci1PU19QdENyZWF0ZVdpZGdldENsYXNzXzA9Y2FzdD0oUHRXaWRnZXRDbGFzc1JlZl90ICopCi1PU19QdENyZWF0ZVdpZGdldENsYXNzXzE9Ci1PU19QdENyZWF0ZVdpZGdldENsYXNzXzI9Ci1PU19QdENyZWF0ZVdpZGdldENsYXNzXzM9Y2FzdD0oUHRBcmdfdCBjb25zdCAqKQotCi1PU19QdERhbWFnZUV4dGVudD0KLU9TX1B0RGFtYWdlRXh0ZW50XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHREYW1hZ2VFeHRlbnRfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QdERhbWFnZVdpZGdldD0KLU9TX1B0RGFtYWdlV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdERlc3Ryb3lXaWRnZXQ9Ci1PU19QdERlc3Ryb3lXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0RGlzam9pbnQ9ZmxhZ3M9Y29uc3QKLQotT1NfUHRFbnRlcj0KLU9TX1B0RW50ZXJfMD0KLQotT1NfUHRFdmVudEhhbmRsZXI9Ci1PU19QdEV2ZW50SGFuZGxlcl8wPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdEV4dGVudFdpZGdldD0KLU9TX1B0RXh0ZW50V2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdEV4dGVudFdpZGdldEZhbWlseT0KLU9TX1B0RXh0ZW50V2lkZ2V0RmFtaWx5XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdEZpbGVTZWxlY3Rpb249Ci1PU19QdEZpbGVTZWxlY3Rpb25fMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEZpbGVTZWxlY3Rpb25fMT1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl8yPWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl8zPWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl80PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl81PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl82PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl83PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl84PWNhc3Q9KFB0RmlsZVNlbGVjdGlvbkluZm9fdCAqKSxmbGFncz1pbml0Ci1PU19QdEZpbGVTZWxlY3Rpb25fOT0KLQotT1NfUHRGaW5kRGlzam9pbnQ9Ci1PU19QdEZpbmREaXNqb2ludF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRGbHVzaD0KLQotT1NfUHRGb250U2VsZWN0aW9uPQotT1NfUHRGb250U2VsZWN0aW9uXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRGb250U2VsZWN0aW9uXzE9Y2FzdD0oY29uc3QgUGhQb2ludF90ICopCi1PU19QdEZvbnRTZWxlY3Rpb25fMj1jYXN0PShjb25zdCBjaGFyICopCi1PU19QdEZvbnRTZWxlY3Rpb25fMz1jYXN0PShjb25zdCBjaGFyICopCi1PU19QdEZvbnRTZWxlY3Rpb25fND0KLU9TX1B0Rm9udFNlbGVjdGlvbl81PQotT1NfUHRGb250U2VsZWN0aW9uXzY9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19QdEZvcndhcmRXaW5kb3dFdmVudD0KLU9TX1B0Rm9yd2FyZFdpbmRvd0V2ZW50XzA9Y2FzdD0oUGhXaW5kb3dFdmVudF90IGNvbnN0ICopCi0KLU9TX1B0RnJhbWVTaXplPQotT1NfUHRGcmFtZVNpemVfMD0KLU9TX1B0RnJhbWVTaXplXzE9Ci1PU19QdEZyYW1lU2l6ZV8yPQotT1NfUHRGcmFtZVNpemVfMz0KLU9TX1B0RnJhbWVTaXplXzQ9Ci1PU19QdEZyYW1lU2l6ZV81PQotCi1PU19QdEdldEFic1Bvc2l0aW9uPQotT1NfUHRHZXRBYnNQb3NpdGlvbl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0R2V0QWJzUG9zaXRpb25fMT0KLU9TX1B0R2V0QWJzUG9zaXRpb25fMj0KLQotT1NfUHRHZXRSZXNvdXJjZXM9Ci1PU19QdEdldFJlc291cmNlc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0R2V0UmVzb3VyY2VzXzE9Ci1PU19QdEdldFJlc291cmNlc18yPWNhc3Q9KFB0QXJnX3QgKikKLQotT1NfUHRHbG9iYWxGb2N1c05leHQ9Ci1PU19QdEdsb2JhbEZvY3VzTmV4dF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0R2xvYmFsRm9jdXNOZXh0XzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0R2xvYmFsRm9jdXNOZXh0Q29udGFpbmVyPQotT1NfUHRHbG9iYWxGb2N1c05leHRDb250YWluZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEdsb2JhbEZvY3VzTmV4dENvbnRhaW5lcl8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdEdsb2JhbEZvY3VzUHJldj0KLU9TX1B0R2xvYmFsRm9jdXNQcmV2XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRHbG9iYWxGb2N1c1ByZXZfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRHbG9iYWxGb2N1c1ByZXZDb250YWluZXI9Ci1PU19QdEdsb2JhbEZvY3VzUHJldkNvbnRhaW5lcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0R2xvYmFsRm9jdXNQcmV2Q29udGFpbmVyXzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0R3JvdXA9ZmxhZ3M9Y29uc3QKLQotT1NfUHRIaXQ9Ci1PU19QdEhpdF8wPWNhc3Q9KCBQdFdpZGdldF90ICopCi1PU19QdEhpdF8xPQotT1NfUHRIaXRfMj1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QdEhvbGQ9Ci0KLU9TX1B0SW5mbGF0ZUJhbGxvb249Ci1PU19QdEluZmxhdGVCYWxsb29uXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRJbmZsYXRlQmFsbG9vbl8xPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0SW5mbGF0ZUJhbGxvb25fMj0KLU9TX1B0SW5mbGF0ZUJhbGxvb25fMz1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEluZmxhdGVCYWxsb29uXzQ9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRJbmZsYXRlQmFsbG9vbl81PWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1B0SW5mbGF0ZUJhbGxvb25fNj1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1B0SW5pdD0KLU9TX1B0SW5pdF8wPWNhc3Q9KGNoYXIgY29uc3QgKikKLQotT1NfUHRJc0ZvY3VzZWQ9Ci1PU19QdElzRm9jdXNlZF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRMYWJlbD1mbGFncz1jb25zdAotCi1PU19QdExlYXZlPQotT1NfUHRMZWF2ZV8wPQotCi1PU19QdExpc3Q9ZmxhZ3M9Y29uc3QKLQotT1NfUHRMaXN0QWRkSXRlbXM9Ci1PU19QdExpc3RBZGRJdGVtc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdEFkZEl0ZW1zXzE9Y2FzdD0oY29uc3QgY2hhciAqKikKLU9TX1B0TGlzdEFkZEl0ZW1zXzI9Ci1PU19QdExpc3RBZGRJdGVtc18zPQotCi1PU19QdExpc3REZWxldGVBbGxJdGVtcz0KLU9TX1B0TGlzdERlbGV0ZUFsbEl0ZW1zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdExpc3REZWxldGVJdGVtUG9zPQotT1NfUHRMaXN0RGVsZXRlSXRlbVBvc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdERlbGV0ZUl0ZW1Qb3NfMT0KLU9TX1B0TGlzdERlbGV0ZUl0ZW1Qb3NfMj0KLQotT1NfUHRMaXN0R290b1Bvcz0KLU9TX1B0TGlzdEdvdG9Qb3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3RHb3RvUG9zXzE9Ci0KLU9TX1B0TGlzdEl0ZW1Qb3M9Ci1PU19QdExpc3RJdGVtUG9zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0SXRlbVBvc18xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfUHRMaXN0UmVwbGFjZUl0ZW1Qb3M9Ci1PU19QdExpc3RSZXBsYWNlSXRlbVBvc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdFJlcGxhY2VJdGVtUG9zXzE9Y2FzdD0oY29uc3QgY2hhciAqKikKLU9TX1B0TGlzdFJlcGxhY2VJdGVtUG9zXzI9Ci1PU19QdExpc3RSZXBsYWNlSXRlbVBvc18zPQotCi1PU19QdExpc3RTZWxlY3RQb3M9Ci1PU19QdExpc3RTZWxlY3RQb3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3RTZWxlY3RQb3NfMT0KLQotT1NfUHRMaXN0VW5zZWxlY3RQb3M9Ci1PU19QdExpc3RVbnNlbGVjdFBvc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdFVuc2VsZWN0UG9zXzE9Ci0KLU9TX1B0TWFpbkxvb3A9Ci0KLU9TX1B0TWVudT1mbGFncz1jb25zdAotCi1PU19QdE1lbnVCYXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRNZW51QnV0dG9uPWZsYWdzPWNvbnN0Ci0KLU9TX1B0TXVsdGlUZXh0PWZsYWdzPWNvbnN0Ci0KLU9TX1B0TmV4dFRvcExldmVsV2lkZ2V0PQotT1NfUHROZXh0VG9wTGV2ZWxXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0TnVtZXJpY0ludGVnZXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRQYW5lPWZsYWdzPWNvbnN0Ci0KLU9TX1B0UGFuZWxHcm91cD1mbGFncz1jb25zdAotCi1PU19QdFBvc2l0aW9uTWVudT0KLU9TX1B0UG9zaXRpb25NZW51XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRQb3NpdGlvbk1lbnVfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRQcm9ncmVzcz1mbGFncz1jb25zdAotCi1PU19QdFJlUGFyZW50V2lkZ2V0PQotT1NfUHRSZVBhcmVudFdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0UmVQYXJlbnRXaWRnZXRfMT1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0UmVhbGl6ZVdpZGdldD0KLU9TX1B0UmVhbGl6ZVdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRSZWdpb249ZmxhZ3M9Y29uc3QKLQotT1NfUHRSZWxlYXNlPQotCi1PU19QdFJlbW92ZUNhbGxiYWNrPQotT1NfUHRSZW1vdmVDYWxsYmFja18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0UmVtb3ZlQ2FsbGJhY2tfMT0KLU9TX1B0UmVtb3ZlQ2FsbGJhY2tfMj1jYXN0PShQdENhbGxiYWNrRl90ICopCi1PU19QdFJlbW92ZUNhbGxiYWNrXzM9Y2FzdD0odm9pZCAqKQotCi1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXI9Ci1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXJfMT0KLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcl8yPQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyXzM9Ci1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXJfND1jYXN0PSh2b2lkICopCi1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXJfNT1jYXN0PShQdENhbGxiYWNrRl90ICopCi0KLU9TX1B0U2Nyb2xsQXJlYT1mbGFncz1jb25zdAotCi1PU19QdFNjcm9sbENvbnRhaW5lcj1mbGFncz1jb25zdAotCi1PU19QdFNjcm9sbGJhcj1mbGFncz1jb25zdAotCi1PU19QdFNlbmRFdmVudFRvV2lkZ2V0PQotT1NfUHRTZW5kRXZlbnRUb1dpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0U2VuZEV2ZW50VG9XaWRnZXRfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRTZXBhcmF0b3I9ZmxhZ3M9Y29uc3QKLQotT1NfUHRTZXRBcmVhRnJvbVdpZGdldENhbnZhcz0KLU9TX1B0U2V0QXJlYUZyb21XaWRnZXRDYW52YXNfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFNldEFyZWFGcm9tV2lkZ2V0Q2FudmFzXzE9Ci1PU19QdFNldEFyZWFGcm9tV2lkZ2V0Q2FudmFzXzI9Ci0KLU9TX1B0U2V0UGFyZW50V2lkZ2V0PQotT1NfUHRTZXRQYXJlbnRXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0U2V0UmVzb3VyY2U9Ci1PU19QdFNldFJlc291cmNlXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRTZXRSZXNvdXJjZV8xPQotT1NfUHRTZXRSZXNvdXJjZV8yPQotT1NfUHRTZXRSZXNvdXJjZV8zPQotCi1PU19QdFNldFJlc291cmNlcz0KLU9TX1B0U2V0UmVzb3VyY2VzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRTZXRSZXNvdXJjZXNfMT0KLU9TX1B0U2V0UmVzb3VyY2VzXzI9Y2FzdD0oUHRBcmdfdCAqKQotCi1PU19QdFNsaWRlcj1mbGFncz1jb25zdAotCi1PU19QdFN1cGVyQ2xhc3NEcmF3PQotT1NfUHRTdXBlckNsYXNzRHJhd18wPWNhc3Q9KFB0V2lkZ2V0Q2xhc3NSZWZfdCAqKQotT1NfUHRTdXBlckNsYXNzRHJhd18xPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0U3VwZXJDbGFzc0RyYXdfMj1jYXN0PShQaFRpbGVfdCBjb25zdCAqKQotCi1PU19QdFN5bmNXaWRnZXQ9Ci1PU19QdFN5bmNXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0VGV4dD1mbGFncz1jb25zdAotCi1PU19QdFRleHRHZXRTZWxlY3Rpb249Ci1PU19QdFRleHRHZXRTZWxlY3Rpb25fMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFRleHRHZXRTZWxlY3Rpb25fMT0KLU9TX1B0VGV4dEdldFNlbGVjdGlvbl8yPQotCi1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUk9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUlfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUlfMT0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJSV8yPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJXzM9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUlfND1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUlfNT0KLQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQkk9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCSV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJXzE9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCSV8yPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQklfMz0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJXzQ9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQklfNT0KLQotT1NfUHRUZXh0U2V0U2VsZWN0aW9uPQotT1NfUHRUZXh0U2V0U2VsZWN0aW9uXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRUZXh0U2V0U2VsZWN0aW9uXzE9Ci1PU19QdFRleHRTZXRTZWxlY3Rpb25fMj0KLQotT1NfUHRUaW1lcj1mbGFncz1jb25zdAotCi1PU19QdFRvZ2dsZUJ1dHRvbj1mbGFncz1jb25zdAotCi1PU19QdFRvb2xiYXI9ZmxhZ3M9Y29uc3QKLQotT1NfUHRVbmJsb2NrV2luZG93cz0KLU9TX1B0VW5ibG9ja1dpbmRvd3NfMD1jYXN0PShQdEJsb2NrZWRMaXN0X3QgKikKLQotT1NfUHRVbnJlYWxpemVXaWRnZXQ9Ci1PU19QdFVucmVhbGl6ZVdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRWYWxpZFBhcmVudD0KLU9TX1B0VmFsaWRQYXJlbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFZhbGlkUGFyZW50XzE9Y2FzdD0oUHRXaWRnZXRDbGFzc1JlZl90ICopCi0KLU9TX1B0V2ViQ2xpZW50PWZsYWdzPWNvbnN0Ci0KLU9TX1B0V2lkZ2V0QXJlYT0KLU9TX1B0V2lkZ2V0QXJlYV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0QXJlYV8xPWNhc3Q9KFBoQXJlYV90ICopCi0KLU9TX1B0V2lkZ2V0QnJvdGhlckJlaGluZD0KLU9TX1B0V2lkZ2V0QnJvdGhlckJlaGluZF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRCcm90aGVySW5Gcm9udD0KLU9TX1B0V2lkZ2V0QnJvdGhlckluRnJvbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0Q2FudmFzX19JST0KLU9TX1B0V2lkZ2V0Q2FudmFzX19JSV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0Q2FudmFzX19JSV8xPWNhc3Q9KFBoUmVjdF90ICopCi0KLU9TX1B0V2lkZ2V0Q2FudmFzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzI9Ci1PU19QdFdpZGdldENhbnZhc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRDYW52YXNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMl8xPQotCi1PU19QdFdpZGdldENoaWxkQmFjaz0KLU9TX1B0V2lkZ2V0Q2hpbGRCYWNrXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldENoaWxkRnJvbnQ9Ci1PU19QdFdpZGdldENoaWxkRnJvbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0Q2xhc3M9Ci1PU19QdFdpZGdldENsYXNzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldEV4dGVudF9fSUk9Ci1PU19QdFdpZGdldEV4dGVudF9fSUlfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldEV4dGVudF9fSUlfMT0KLQotT1NfUHRXaWRnZXRFeHRlbnRfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMj0KLU9TX1B0V2lkZ2V0RXh0ZW50X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldEV4dGVudF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yXzE9Ci0KLU9TX1B0V2lkZ2V0RmxhZ3M9Ci1PU19QdFdpZGdldEZsYWdzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldEluc2VydD0KLU9TX1B0V2lkZ2V0SW5zZXJ0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRJbnNlcnRfMT1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldEluc2VydF8yPQotCi1PU19QdFdpZGdldElzQ2xhc3NNZW1iZXI9Ci1PU19QdFdpZGdldElzQ2xhc3NNZW1iZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldElzQ2xhc3NNZW1iZXJfMT1jYXN0PShQdFdpZGdldENsYXNzUmVmX3QgKikKLQotT1NfUHRXaWRnZXRJc1JlYWxpemVkPQotT1NfUHRXaWRnZXRJc1JlYWxpemVkXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldE9mZnNldD0KLU9TX1B0V2lkZ2V0T2Zmc2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRPZmZzZXRfMT1jYXN0PShQaFBvaW50X3QgKikKLQotT1NfUHRXaWRnZXRQYXJlbnQ9Ci1PU19QdFdpZGdldFBhcmVudF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRQcmVmZXJyZWRTaXplPQotT1NfUHRXaWRnZXRQcmVmZXJyZWRTaXplXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRQcmVmZXJyZWRTaXplXzE9Y2FzdD0oUGhEaW1fdCAqKQotCi1PU19QdFdpZGdldFJpZD0KLU9TX1B0V2lkZ2V0UmlkXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldFRvQmFjaz0KLU9TX1B0V2lkZ2V0VG9CYWNrXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldFRvRnJvbnQ9Ci1PU19QdFdpZGdldFRvRnJvbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2luZG93PWZsYWdzPWNvbnN0Ci0KLU9TX1B0V2luZG93Rm9jdXM9Ci1PU19QdFdpbmRvd0ZvY3VzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpbmRvd0dldFN0YXRlPQotT1NfUHRXaW5kb3dHZXRTdGF0ZV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaW5kb3dUb0JhY2s9Ci1PU19QdFdpbmRvd1RvQmFja18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaW5kb3dUb0Zyb250PQotT1NfUHRXaW5kb3dUb0Zyb250XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19mcmVlPQotT1NfZnJlZV8wPWNhc3Q9KHZvaWQgKikKLQotT1NfZ2V0ZW52PQotT1NfZ2V0ZW52XzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19tYWxsb2M9Ci1PU19tYWxsb2NfMD1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lJST0KLU9TX21lbW1vdmVfX0lJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0lJSV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBpbml0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhBcmVhXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQXJlYV8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEFyZWFfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQXJlYV8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JEZWZfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JEZWZfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JEZWZfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ3Vyc29yRGVmXzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludGVyRXZlbnRfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFRleHRDYWxsYmFja18xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJDbGllbnREYXRhXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViQ2xpZW50RGF0YV8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkNsaWVudERhdGFfMXRfMklfMT1jYXN0PWNvbnN0IHZvaWQgKixmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkNsaWVudERhdGFfMXRfMklfMj1jYXN0PXNpemVfdAotCi1PU19tZW1tb3ZlX19JXzNCST0KLU9TX21lbW1vdmVfX0lfM0JJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSV8zQklfMj0KLQotT1NfbWVtbW92ZV9fSV8zSUk9Ci1PU19tZW1tb3ZlX19JXzNJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lfM0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lfM0lJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBpbml0Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhLZXlFdmVudF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEtleUV2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhXaW5kb3dFdmVudF8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFdpbmRvd0V2ZW50XzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoV2luZG93RXZlbnRfMXRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhXaW5kb3dFdmVudF8xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRTY3JvbGxiYXJDYWxsYmFja18xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFNjcm9sbGJhckNhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkRhdGFSZXFDYWxsYmFja18xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkRhdGFSZXFDYWxsYmFja18xdF8ySUlfMD1jYXN0PXZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJEYXRhUmVxQ2FsbGJhY2tfMXRfMklJXzE9Y2FzdD1jb25zdCB2b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViRGF0YVJlcUNhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJNZXRhRGF0YUNhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfMXRfMklJXzE9Y2FzdD1jb25zdCB2b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViTWV0YURhdGFDYWxsYmFja18xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJTdGF0dXNDYWxsYmFja18xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYldpbmRvd0NhbGxiYWNrXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXRfMklJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXRfMklJXzE9Y2FzdD1jb25zdCB2b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX18zQklJPQotT1NfbWVtbW92ZV9fXzNCSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19fM0JJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zQklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMkk9Ci1PU19tZW1tb3ZlX19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklfMj0KLQotT1NfbWVtbW92ZV9fXzNJSUk9Ci1PU19tZW1tb3ZlX19fM0lJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX18zSUlJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNJSUlfMj0KLQotT1NfbWVtbW92ZV9fXzNTSUk9Ci1PU19tZW1tb3ZlX19fM1NJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX18zU0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fXzNTSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbXNldD0KLU9TX21lbXNldF8wPWNhc3Q9dm9pZCAqCi1PU19tZW1zZXRfMT0KLU9TX21lbXNldF8yPWNhc3Q9c2l6ZV90Ci0KLU9TX3N0cmR1cD0KLU9TX3N0cmR1cF8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1Nfc3RybGVuPQotT1Nfc3RybGVuXzA9Y2FzdD0oY29uc3QgY2hhciopCi0KLU9TX3VuYW1lPQotT1NfdW5hbWVfMD1jYXN0PSh1dHNuYW1lICopCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0PQotUGdBbHBoYV90X2FscGhhX29wPQotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfZGltX3c9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5kaW0udwotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfZGltX2g9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5kaW0uaAotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfYnBsPWFjY2Vzc29yPXNyY19hbHBoYV9tYXAuYnBsCi1QZ0FscGhhX3Rfc3JjX2FscGhhX21hcF9icHA9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5icHAKLVBnQWxwaGFfdF9zcmNfYWxwaGFfbWFwX21hcD1hY2Nlc3Nvcj1zcmNfYWxwaGFfbWFwLm1hcCxjYXN0PShjaGFyICopCi1QZ0FscGhhX3Rfc3JjX2dsb2JhbF9hbHBoYT0KLVBnQWxwaGFfdF9kZXN0X2dsb2JhbF9hbHBoYT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0Rpc3BsYXlTZXR0aW5nc18xdD0KLVBnRGlzcGxheVNldHRpbmdzX3RfbW9kZT0KLVBnRGlzcGxheVNldHRpbmdzX3RfeHJlcz0KLVBnRGlzcGxheVNldHRpbmdzX3RfeXJlcz0KLVBnRGlzcGxheVNldHRpbmdzX3RfcmVmcmVzaD0KLVBnRGlzcGxheVNldHRpbmdzX3RfZmxhZ3M9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X3Jlc2VydmVkPWNhc3Q9KGxvbmcgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ01hcF8xdD0KLVBnTWFwX3RfZGltX3c9YWNjZXNzb3I9ZGltLncKLVBnTWFwX3RfZGltX2g9YWNjZXNzb3I9ZGltLmgKLVBnTWFwX3RfYnBsPQotUGdNYXBfdF9icHA9Ci1QZ01hcF90X21hcD1jYXN0PShjaGFyICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdWaWRlb01vZGVJbmZvXzF0PQotUGdWaWRlb01vZGVJbmZvX3Rfd2lkdGg9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9oZWlnaHQ9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9iaXRzX3Blcl9waXhlbD0KLVBnVmlkZW9Nb2RlSW5mb190X2J5dGVzX3Blcl9zY2FubGluZT0KLVBnVmlkZW9Nb2RlSW5mb190X3R5cGU9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczE9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczI9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczM9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczQ9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczU9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczY9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9yZWZyZXNoX3JhdGVzPWNhc3Q9KGNoYXIgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEFyZWFfMXQ9Ci1QaEFyZWFfdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhBcmVhX3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVBoQXJlYV90X3NpemVfdz1hY2Nlc3Nvcj1zaXplLncKLVBoQXJlYV90X3NpemVfaD1hY2Nlc3Nvcj1zaXplLmgKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXI9Ci1QaENsaXBIZWFkZXJfdHlwZT1jYXN0PShQaENsaXBIZWFkZXIpCi1QaENsaXBIZWFkZXJfbGVuZ3RoPQotUGhDbGlwSGVhZGVyX3plcm89Ci1QaENsaXBIZWFkZXJfZGF0YT1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JEZWZfMXQ9Ci1QaEN1cnNvckRlZl90X2hkcl9sZW49YWNjZXNzb3I9aGRyLmxlbgotUGhDdXJzb3JEZWZfdF9oZHJfdHlwZT1hY2Nlc3Nvcj1oZHIudHlwZQotUGhDdXJzb3JEZWZfdF9zaXplMV94PWFjY2Vzc29yPXNpemUxLngKLVBoQ3Vyc29yRGVmX3Rfc2l6ZTFfeT1hY2Nlc3Nvcj1zaXplMS55Ci1QaEN1cnNvckRlZl90X29mZnNldDFfeD1hY2Nlc3Nvcj1vZmZzZXQxLngKLVBoQ3Vyc29yRGVmX3Rfb2Zmc2V0MV95PWFjY2Vzc29yPW9mZnNldDEueQotUGhDdXJzb3JEZWZfdF9jb2xvcjE9Ci1QaEN1cnNvckRlZl90X2J5dGVzcGVybGluZTE9Ci1QaEN1cnNvckRlZl90X3NpemUyX3g9YWNjZXNzb3I9c2l6ZTIueAotUGhDdXJzb3JEZWZfdF9zaXplMl95PWFjY2Vzc29yPXNpemUyLnkKLVBoQ3Vyc29yRGVmX3Rfb2Zmc2V0Ml94PWFjY2Vzc29yPW9mZnNldDIueAotUGhDdXJzb3JEZWZfdF9vZmZzZXQyX3k9YWNjZXNzb3I9b2Zmc2V0Mi55Ci1QaEN1cnNvckRlZl90X2NvbG9yMj0KLVBoQ3Vyc29yRGVmX3RfYnl0ZXNwZXJsaW5lMj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEN1cnNvckluZm9fMXQ9Ci1QaEN1cnNvckluZm9fdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhDdXJzb3JJbmZvX3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVBoQ3Vyc29ySW5mb190X3JlZ2lvbj0KLVBoQ3Vyc29ySW5mb190X2lnX3JlZ2lvbj0KLVBoQ3Vyc29ySW5mb190X2NvbG9yPQotUGhDdXJzb3JJbmZvX3RfbGFzdF9wcmVzc194PWFjY2Vzc29yPWxhc3RfcHJlc3MueAotUGhDdXJzb3JJbmZvX3RfbGFzdF9wcmVzc195PWFjY2Vzc29yPWxhc3RfcHJlc3MueQotUGhDdXJzb3JJbmZvX3RfbXNlYz0KLVBoQ3Vyc29ySW5mb190X3N0ZWFkeV94PWFjY2Vzc29yPXN0ZWFkeS54Ci1QaEN1cnNvckluZm9fdF9zdGVhZHlfeT1hY2Nlc3Nvcj1zdGVhZHkueQotUGhDdXJzb3JJbmZvX3RfZHJhZ2dlcj0KLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfdWxfeD1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LnVsLngKLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfdWxfeT1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LnVsLnkKLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfbHJfeD1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LmxyLngKLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfbHJfeT1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LmxyLnkKLVBoQ3Vyc29ySW5mb190X3BoYW50b21fcmlkPQotUGhDdXJzb3JJbmZvX3RfdHlwZT0KLVBoQ3Vyc29ySW5mb190X2lnPQotUGhDdXJzb3JJbmZvX3RfYnV0dG9uX3N0YXRlPQotUGhDdXJzb3JJbmZvX3RfY2xpY2tfY291bnQ9Ci1QaEN1cnNvckluZm9fdF96ZXJvMT0KLVBoQ3Vyc29ySW5mb190X2tleV9tb2RzPQotUGhDdXJzb3JJbmZvX3RfemVybzI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhEaW1fMXQ9Ci1QaERpbV90X3c9Ci1QaERpbV90X2g9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdD0KLVBoRXZlbnRfdF90eXBlPQotUGhFdmVudF90X3N1YnR5cGU9Ci1QaEV2ZW50X3RfcHJvY2Vzc2luZ19mbGFncz0KLVBoRXZlbnRfdF9lbWl0dGVyX3JpZD1hY2Nlc3Nvcj1lbWl0dGVyLnJpZAotUGhFdmVudF90X2VtaXR0ZXJfaGFuZGxlPWFjY2Vzc29yPWVtaXR0ZXIuaGFuZGxlCi1QaEV2ZW50X3RfY29sbGVjdG9yX3JpZD1hY2Nlc3Nvcj1jb2xsZWN0b3IucmlkCi1QaEV2ZW50X3RfY29sbGVjdG9yX2hhbmRsZT1hY2Nlc3Nvcj1jb2xsZWN0b3IuaGFuZGxlCi1QaEV2ZW50X3RfaW5wdXRfZ3JvdXA9Ci1QaEV2ZW50X3RfZmxhZ3M9Ci1QaEV2ZW50X3RfdGltZXN0YW1wPQotUGhFdmVudF90X3RyYW5zbGF0aW9uX3g9YWNjZXNzb3I9dHJhbnNsYXRpb24ueAotUGhFdmVudF90X3RyYW5zbGF0aW9uX3k9YWNjZXNzb3I9dHJhbnNsYXRpb24ueQotUGhFdmVudF90X251bV9yZWN0cz0KLVBoRXZlbnRfdF9kYXRhX2xlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0PQotUGhJbWFnZV90X3R5cGU9Ci1QaEltYWdlX3RfaW1hZ2VfdGFnPQotUGhJbWFnZV90X2JwbD0KLVBoSW1hZ2VfdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QaEltYWdlX3Rfc2l6ZV9oPWFjY2Vzc29yPXNpemUuaAotUGhJbWFnZV90X3BhbGV0dGVfdGFnPQotUGhJbWFnZV90X2NvbG9ycz0KLVBoSW1hZ2VfdF9hbHBoYT1jYXN0PShQZ0FscGhhX3QgKikKLVBoSW1hZ2VfdF90cmFuc3BhcmVudD0KLVBoSW1hZ2VfdF9mb3JtYXQ9Ci1QaEltYWdlX3RfZmxhZ3M9Ci1QaEltYWdlX3RfZ2hvc3RfYnBsPQotUGhJbWFnZV90X3NwYXJlMT0KLVBoSW1hZ2VfdF9naG9zdF9iaXRtYXA9Y2FzdD0oY2hhciAqKQotUGhJbWFnZV90X21hc2tfYnBsPQotUGhJbWFnZV90X21hc2tfYm09Y2FzdD0oY2hhciAqKQotUGhJbWFnZV90X3BhbGV0dGU9Y2FzdD0oUGdDb2xvcl90ICopCi1QaEltYWdlX3RfaW1hZ2U9Y2FzdD0oY2hhciAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXQ9Ci1QaEtleUV2ZW50X3Rfa2V5X21vZHM9Ci1QaEtleUV2ZW50X3Rfa2V5X2ZsYWdzPQotUGhLZXlFdmVudF90X2tleV9jYXA9Ci1QaEtleUV2ZW50X3Rfa2V5X3N5bT0KLVBoS2V5RXZlbnRfdF9rZXlfc2Nhbj0KLVBoS2V5RXZlbnRfdF9rZXlfemVybz0KLVBoS2V5RXZlbnRfdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhLZXlFdmVudF90X3Bvc195PWFjY2Vzc29yPXBvcy55Ci1QaEtleUV2ZW50X3RfYnV0dG9uX3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXQ9Ci1QaFBvaW50X3RfeD0KLVBoUG9pbnRfdF95PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0PQotUGhQb2ludGVyRXZlbnRfdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhQb2ludGVyRXZlbnRfdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUGhQb2ludGVyRXZlbnRfdF9idXR0b25zPQotUGhQb2ludGVyRXZlbnRfdF9idXR0b25fc3RhdGU9Ci1QaFBvaW50ZXJFdmVudF90X2NsaWNrX2NvdW50PQotUGhQb2ludGVyRXZlbnRfdF9mbGFncz0KLVBoUG9pbnRlckV2ZW50X3Rfej0KLVBoUG9pbnRlckV2ZW50X3Rfa2V5X21vZHM9Ci1QaFBvaW50ZXJFdmVudF90X3plcm89Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0PQotUGhSZWN0X3RfdWxfeD1hY2Nlc3Nvcj11bC54Ci1QaFJlY3RfdF91bF95PWFjY2Vzc29yPXVsLnkKLVBoUmVjdF90X2xyX3g9YWNjZXNzb3I9bHIueAotUGhSZWN0X3RfbHJfeT1hY2Nlc3Nvcj1sci55Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWdpb25fMXQ9Ci1QaFJlZ2lvbl90X3JpZD0KLVBoUmVnaW9uX3RfaGFuZGxlPQotUGhSZWdpb25fdF9vd25lcj0KLVBoUmVnaW9uX3RfZmxhZ3M9Ci1QaFJlZ2lvbl90X3N0YXRlPQotUGhSZWdpb25fdF9ldmVudHNfc2Vuc2U9Ci1QaFJlZ2lvbl90X2V2ZW50c19vcGFxdWU9Ci1QaFJlZ2lvbl90X29yaWdpbl94PWFjY2Vzc29yPW9yaWdpbi54Ci1QaFJlZ2lvbl90X29yaWdpbl95PWFjY2Vzc29yPW9yaWdpbi55Ci1QaFJlZ2lvbl90X3BhcmVudD0KLVBoUmVnaW9uX3RfY2hpbGQ9Ci1QaFJlZ2lvbl90X2Jyb19pbl9mcm9udD0KLVBoUmVnaW9uX3RfYnJvX2JlaGluZD0KLVBoUmVnaW9uX3RfY3Vyc29yX2NvbG9yPQotUGhSZWdpb25fdF9pbnB1dF9ncm91cD0KLVBoUmVnaW9uX3RfZGF0YV9sZW49Ci1QaFJlZ2lvbl90X2N1cnNvcl90eXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdD0KLVBoVGlsZV90X3JlY3RfdWxfeD1hY2Nlc3Nvcj1yZWN0LnVsLngKLVBoVGlsZV90X3JlY3RfdWxfeT1hY2Nlc3Nvcj1yZWN0LnVsLnkKLVBoVGlsZV90X3JlY3RfbHJfeD1hY2Nlc3Nvcj1yZWN0LmxyLngKLVBoVGlsZV90X3JlY3RfbHJfeT1hY2Nlc3Nvcj1yZWN0LmxyLnkKLVBoVGlsZV90X25leHQ9Y2FzdD0oUGhUaWxlX3QgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFdpbmRvd0V2ZW50XzF0PQotUGhXaW5kb3dFdmVudF90X2V2ZW50X2Y9Ci1QaFdpbmRvd0V2ZW50X3Rfc3RhdGVfZj0KLVBoV2luZG93RXZlbnRfdF9yaWQ9Ci1QaFdpbmRvd0V2ZW50X3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVBoV2luZG93RXZlbnRfdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUGhXaW5kb3dFdmVudF90X3NpemVfdz1hY2Nlc3Nvcj1zaXplLncKLVBoV2luZG93RXZlbnRfdF9zaXplX2g9YWNjZXNzb3I9c2l6ZS5oCi1QaFdpbmRvd0V2ZW50X3RfZXZlbnRfc3RhdGU9Ci1QaFdpbmRvd0V2ZW50X3RfaW5wdXRfZ3JvdXA9Ci1QaFdpbmRvd0V2ZW50X3RfcnN2ZDA9YWNjZXNzb3I9cnN2ZFswXQotUGhXaW5kb3dFdmVudF90X3JzdmQxPWFjY2Vzc29yPXJzdmRbMV0KLVBoV2luZG93RXZlbnRfdF9yc3ZkMj1hY2Nlc3Nvcj1yc3ZkWzJdCi1QaFdpbmRvd0V2ZW50X3RfcnN2ZDM9YWNjZXNzb3I9cnN2ZFszXQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0Q2FsbGJhY2tJbmZvXzF0PQotUHRDYWxsYmFja0luZm9fdF9yZWFzb249Ci1QdENhbGxiYWNrSW5mb190X3JlYXNvbl9zdWJ0eXBlPQotUHRDYWxsYmFja0luZm9fdF9ldmVudD1jYXN0PShQaEV2ZW50X3QgKikKLVB0Q2FsbGJhY2tJbmZvX3RfY2JkYXRhPWNhc3Q9KHZvaWQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdENvbG9yU2VsZWN0SW5mb18xdD0KLVB0Q29sb3JTZWxlY3RJbmZvX3RfZmxhZ3M9Ci1QdENvbG9yU2VsZWN0SW5mb190X25zZWxlY3RvcnM9Ci1QdENvbG9yU2VsZWN0SW5mb190X25jb2xvcl9tb2RlbHM9Ci1QdENvbG9yU2VsZWN0SW5mb190X2NvbG9yX21vZGVscz1jYXN0PShQZ0NvbG9yTW9kZWxfdCAqKikKLVB0Q29sb3JTZWxlY3RJbmZvX3Rfc2VsZWN0b3JzPWNhc3Q9KFB0Q29sb3JTZWxlY3RvclNwZWNfdCAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUHRDb2xvclNlbGVjdEluZm9fdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUHRDb2xvclNlbGVjdEluZm9fdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QdENvbG9yU2VsZWN0SW5mb190X3NpemVfaD1hY2Nlc3Nvcj1zaXplLmgKLVB0Q29sb3JTZWxlY3RJbmZvX3RfcGFsZXR0ZT1hY2Nlc3Nvcj1wYWxldHRlLmluc3RhbmNlLGNhc3Q9KHZvaWQgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfYWNjZXB0X3RleHQ9Y2FzdD0oY2hhciAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9kaXNtaXNzX3RleHQ9Y2FzdD0oY2hhciAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9hY2NlcHRfZGlzbWlzc190ZXh0PWNhc3Q9KGNoYXIgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfYXBwbHlfZj1jYXN0PSh2b2lkICopCi1QdENvbG9yU2VsZWN0SW5mb190X2RhdGE9Y2FzdD0odm9pZCAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9yZ2I9Ci1QdENvbG9yU2VsZWN0SW5mb190X2RpYWxvZz1jYXN0PShQdFdpZGdldF90ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRGaWxlU2VsZWN0aW9uSW5mb18xdD0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9yZXQ9Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfcGF0aD0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9kaW09Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfcG9zPQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2Zvcm1hdD0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9mc3BlYz0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF91c2VyX2RhdGE9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2NvbmZpcm1fZGlzcGxheT1jYXN0PSh2b2lkICopCi1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfY29uZmlybV9zZWxlY3Rpb249Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X25ld19kaXJlY3Rvcnk9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2J0bjE9Y2FzdD0oY2hhciAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2J0bjI9Y2FzdD0oY2hhciAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X251bV9hcmdzPQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2FyZ3M9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X21pbmZvPWNhc3Q9KFB0RmlsZVNlbGVjdG9ySW5mb190ICopCi1QdEZpbGVTZWxlY3Rpb25JbmZvX3Rfc3BhcmU9Y2FzdD0obG9uZyAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXQ9Ci1QdFNjcm9sbGJhckNhbGxiYWNrX3RfYWN0aW9uPQotUHRTY3JvbGxiYXJDYWxsYmFja190X3Bvc2l0aW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0PQotUHRUZXh0Q2FsbGJhY2tfdF9zdGFydF9wb3M9Ci1QdFRleHRDYWxsYmFja190X2VuZF9wb3M9Ci1QdFRleHRDYWxsYmFja190X2N1cl9pbnNlcnQ9Ci1QdFRleHRDYWxsYmFja190X25ld19pbnNlcnQ9Ci1QdFRleHRDYWxsYmFja190X2xlbmd0aD0KLVB0VGV4dENhbGxiYWNrX3RfcmVzZXJ2ZWQ9Ci1QdFRleHRDYWxsYmFja190X3RleHQ9Y2FzdD0oY2hhciAqKQotUHRUZXh0Q2FsbGJhY2tfdF9kb2l0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViQ2xpZW50RGF0YV8xdD0KLVB0V2ViQ2xpZW50RGF0YV90X3R5cGU9Ci1QdFdlYkNsaWVudERhdGFfdF91cmw9Ci1QdFdlYkNsaWVudERhdGFfdF9sZW5ndGg9Ci1QdFdlYkNsaWVudERhdGFfdF9kYXRhPWNhc3Q9Y2hhciAqCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJEYXRhUmVxQ2FsbGJhY2tfMXQ9Ci1QdFdlYkRhdGFSZXFDYWxsYmFja190X3R5cGU9Ci1QdFdlYkRhdGFSZXFDYWxsYmFja190X2xlbmd0aD0KLVB0V2ViRGF0YVJlcUNhbGxiYWNrX3RfdXJsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViTWV0YURhdGFDYWxsYmFja18xdD0KLVB0V2ViTWV0YURhdGFDYWxsYmFja190X25hbWU9Ci1QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfdF92YWx1ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0PQotUHRXZWJTdGF0dXNDYWxsYmFja190X2Rlc2M9Ci1QdFdlYlN0YXR1c0NhbGxiYWNrX3RfdHlwZT0KLVB0V2ViU3RhdHVzQ2FsbGJhY2tfdF91cmw9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJXaW5kb3dDYWxsYmFja18xdD0KLVB0V2ViV2luZG93Q2FsbGJhY2tfdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QdFdlYldpbmRvd0NhbGxiYWNrX3Rfc2l6ZV9oPWFjY2Vzc29yPXNpemUuaAotUHRXZWJXaW5kb3dDYWxsYmFja190X2ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX3V0c25hbWU9Ci11dHNuYW1lX3N5c25hbWU9Ci11dHNuYW1lX25vZGVuYW1lPQotdXRzbmFtZV9yZWxlYXNlPQotdXRzbmFtZV92ZXJzaW9uPQotdXRzbmFtZV9tYWNoaW5lPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjEyN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXAotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLSAqXG5cCi0gKiBDb250cmlidXRvcnM6XG5cCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbgotc3d0X3Byb3BlcnRpZXNfY29weXJpZ2h0PSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblwKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotI1xuXAotIyBDb250cmlidXRvcnM6XG5cCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cblwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN3dF9tYWluX2NsYXNzZXM9XAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLkFUSywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvZ3RrL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2NhcmJvbi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2RlLkNERSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUHJvZ3JhbS9jZGUvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLkdOT01FLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQcm9ncmFtL2dub21lL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuR1RLLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9tb3RpZl9ndGsvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvZ3RrL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvbW90aWYvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEuWFBDT00sLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE1vemlsbGEvY29tbW9uL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS93aW4zMi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucGhvdG9uLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9waG90b24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS93aW4zMi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ2RpcC5HZGlwLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS93aW4zMi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8uQ2Fpcm8sLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2NhaXJvL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ2x4LkdMWCwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgT3BlbkdML2dseC9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLndpbjMyLldHTCwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgT3BlbkdML3dpbjMyL2xpYnJhcnkvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Yjg1NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDI5MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQUNDRUw9Ci1BQ0NFTF9mVmlydD0KLUFDQ0VMX2tleT0KLUFDQ0VMX2NtZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUD0KLUJJVE1BUF9ibVR5cGU9Ci1CSVRNQVBfYm1XaWR0aD0KLUJJVE1BUF9ibUhlaWdodD0KLUJJVE1BUF9ibVdpZHRoQnl0ZXM9Ci1CSVRNQVBfYm1QbGFuZXM9Ci1CSVRNQVBfYm1CaXRzUGl4ZWw9Ci1CSVRNQVBfYm1CaXRzPWNhc3Q9KExQVk9JRCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVI9Ci1CSVRNQVBJTkZPSEVBREVSX2JpU2l6ZT0KLUJJVE1BUElORk9IRUFERVJfYmlXaWR0aD0KLUJJVE1BUElORk9IRUFERVJfYmlIZWlnaHQ9Ci1CSVRNQVBJTkZPSEVBREVSX2JpUGxhbmVzPQotQklUTUFQSU5GT0hFQURFUl9iaUJpdENvdW50PQotQklUTUFQSU5GT0hFQURFUl9iaUNvbXByZXNzaW9uPQotQklUTUFQSU5GT0hFQURFUl9iaVNpemVJbWFnZT0KLUJJVE1BUElORk9IRUFERVJfYmlYUGVsc1Blck1ldGVyPQotQklUTUFQSU5GT0hFQURFUl9iaVlQZWxzUGVyTWV0ZXI9Ci1CSVRNQVBJTkZPSEVBREVSX2JpQ2xyVXNlZD0KLUJJVE1BUElORk9IRUFERVJfYmlDbHJJbXBvcnRhbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CTEVOREZVTkNUSU9OPQotQkxFTkRGVU5DVElPTl9CbGVuZE9wPQotQkxFTkRGVU5DVElPTl9CbGVuZEZsYWdzPQotQkxFTkRGVU5DVElPTl9Tb3VyY2VDb25zdGFudEFscGhhPQotQkxFTkRGVU5DVElPTl9BbHBoYUZvcm1hdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JST1dTRUlORk89Ci1CUk9XU0VJTkZPX2h3bmRPd25lcj1jYXN0PShIV05EKQotQlJPV1NFSU5GT19waWRsUm9vdD1jYXN0PShMUENJVEVNSURMSVNUKQotQlJPV1NFSU5GT19wc3pEaXNwbGF5TmFtZT1jYXN0PShMUFRTVFIpCi1CUk9XU0VJTkZPX2xwc3pUaXRsZT1jYXN0PShMUENUU1RSKQotQlJPV1NFSU5GT191bEZsYWdzPQotQlJPV1NFSU5GT19scGZuPWNhc3Q9KEJGRkNBTExCQUNLKQotQlJPV1NFSU5GT19sUGFyYW09Ci1CUk9XU0VJTkZPX2lJbWFnZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUPQotQlVUVE9OX0lNQUdFTElTVF9oaW1sPWNhc3Q9SElNQUdFTElTVAotQlVUVE9OX0lNQUdFTElTVF9tYXJnaW5fbGVmdD1hY2Nlc3Nvcj1tYXJnaW4ubGVmdCxjYXN0PUxPTkcKLUJVVFRPTl9JTUFHRUxJU1RfbWFyZ2luX3RvcD1hY2Nlc3Nvcj1tYXJnaW4udG9wLGNhc3Q9TE9ORwotQlVUVE9OX0lNQUdFTElTVF9tYXJnaW5fcmlnaHQ9YWNjZXNzb3I9bWFyZ2luLnJpZ2h0LGNhc3Q9TE9ORwotQlVUVE9OX0lNQUdFTElTVF9tYXJnaW5fYm90dG9tPWFjY2Vzc29yPW1hcmdpbi5ib3R0b20sY2FzdD1MT05HCi1CVVRUT05fSU1BR0VMSVNUX3VBbGlnbj1jYXN0PVVJTlQKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0NIT09TRUNPTE9SPQotQ0hPT1NFQ09MT1JfbFN0cnVjdFNpemU9Ci1DSE9PU0VDT0xPUl9od25kT3duZXI9Y2FzdD0oSFdORCkKLUNIT09TRUNPTE9SX2hJbnN0YW5jZT1jYXN0PShIQU5ETEUpCi1DSE9PU0VDT0xPUl9yZ2JSZXN1bHQ9Ci1DSE9PU0VDT0xPUl9scEN1c3RDb2xvcnM9Y2FzdD0oQ09MT1JSRUYgKikKLUNIT09TRUNPTE9SX0ZsYWdzPQotQ0hPT1NFQ09MT1JfbEN1c3REYXRhPQotQ0hPT1NFQ09MT1JfbHBmbkhvb2s9Y2FzdD0oTFBDQ0hPT0tQUk9DKQotQ0hPT1NFQ09MT1JfbHBUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0NIT09TRUZPTlQ9Ci1DSE9PU0VGT05UX2xTdHJ1Y3RTaXplPQotQ0hPT1NFRk9OVF9od25kT3duZXI9Y2FzdD0oSFdORCkKLUNIT09TRUZPTlRfaERDPWNhc3Q9KEhEQykKLUNIT09TRUZPTlRfbHBMb2dGb250PWNhc3Q9KExQTE9HRk9OVCkKLUNIT09TRUZPTlRfaVBvaW50U2l6ZT0KLUNIT09TRUZPTlRfRmxhZ3M9Ci1DSE9PU0VGT05UX3JnYkNvbG9ycz0KLUNIT09TRUZPTlRfbEN1c3REYXRhPQotQ0hPT1NFRk9OVF9scGZuSG9vaz1jYXN0PShMUENGSE9PS1BST0MpCi1DSE9PU0VGT05UX2xwVGVtcGxhdGVOYW1lPWNhc3Q9KExQQ1RTVFIpCi1DSE9PU0VGT05UX2hJbnN0YW5jZT1jYXN0PShISU5TVEFOQ0UpCi1DSE9PU0VGT05UX2xwc3pTdHlsZT1jYXN0PShMUFRTVFIpCi1DSE9PU0VGT05UX25Gb250VHlwZT0KLUNIT09TRUZPTlRfblNpemVNaW49Ci1DSE9PU0VGT05UX25TaXplTWF4PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQ09NQk9CT1hJTkZPPQotQ09NQk9CT1hJTkZPX2NiU2l6ZT0KLUNPTUJPQk9YSU5GT19pdGVtTGVmdD1hY2Nlc3Nvcj1yY0l0ZW0ubGVmdAotQ09NQk9CT1hJTkZPX2l0ZW1Ub3A9YWNjZXNzb3I9cmNJdGVtLnRvcAotQ09NQk9CT1hJTkZPX2l0ZW1SaWdodD1hY2Nlc3Nvcj1yY0l0ZW0ucmlnaHQKLUNPTUJPQk9YSU5GT19pdGVtQm90dG9tPWFjY2Vzc29yPXJjSXRlbS5ib3R0b20KLUNPTUJPQk9YSU5GT19idXR0b25MZWZ0PWFjY2Vzc29yPXJjQnV0dG9uLmxlZnQKLUNPTUJPQk9YSU5GT19idXR0b25Ub3A9YWNjZXNzb3I9cmNCdXR0b24udG9wCi1DT01CT0JPWElORk9fYnV0dG9uUmlnaHQ9YWNjZXNzb3I9cmNCdXR0b24ucmlnaHQKLUNPTUJPQk9YSU5GT19idXR0b25Cb3R0b209YWNjZXNzb3I9cmNCdXR0b24uYm90dG9tCi1DT01CT0JPWElORk9fc3RhdGVCdXR0b249Ci1DT01CT0JPWElORk9faHduZENvbWJvPWNhc3Q9SFdORAotQ09NQk9CT1hJTkZPX2h3bmRJdGVtPWNhc3Q9SFdORAotQ09NQk9CT1hJTkZPX2h3bmRMaXN0PWNhc3Q9SFdORAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQ09NUE9TSVRJT05GT1JNPQotQ09NUE9TSVRJT05GT1JNX2R3U3R5bGU9Ci1DT01QT1NJVElPTkZPUk1feD1hY2Nlc3Nvcj1wdEN1cnJlbnRQb3MueAotQ09NUE9TSVRJT05GT1JNX3k9YWNjZXNzb3I9cHRDdXJyZW50UG9zLnkKLUNPTVBPU0lUSU9ORk9STV9sZWZ0PWFjY2Vzc29yPXJjQXJlYS5sZWZ0Ci1DT01QT1NJVElPTkZPUk1fdG9wPWFjY2Vzc29yPXJjQXJlYS50b3AKLUNPTVBPU0lUSU9ORk9STV9yaWdodD1hY2Nlc3Nvcj1yY0FyZWEucmlnaHQKLUNPTVBPU0lUSU9ORk9STV9ib3R0b209YWNjZXNzb3I9cmNBcmVhLmJvdHRvbQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQ1JFQVRFU1RSVUNUPQotQ1JFQVRFU1RSVUNUX2xwQ3JlYXRlUGFyYW1zPWNhc3Q9KExQVk9JRCkKLUNSRUFURVNUUlVDVF9oSW5zdGFuY2U9Y2FzdD0oSElOU1RBTkNFKQotQ1JFQVRFU1RSVUNUX2hNZW51PWNhc3Q9KEhNRU5VKQotQ1JFQVRFU1RSVUNUX2h3bmRQYXJlbnQ9Y2FzdD0oSFdORCkKLUNSRUFURVNUUlVDVF9jeT0KLUNSRUFURVNUUlVDVF9jeD0KLUNSRUFURVNUUlVDVF95PQotQ1JFQVRFU1RSVUNUX3g9Ci1DUkVBVEVTVFJVQ1Rfc3R5bGU9Ci1DUkVBVEVTVFJVQ1RfbHBzek5hbWU9Y2FzdD0oTFBDVFNUUikKLUNSRUFURVNUUlVDVF9scHN6Q2xhc3M9Y2FzdD0oTFBDVFNUUikKLUNSRUFURVNUUlVDVF9kd0V4U3R5bGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OPQotRElCU0VDVElPTl9iaVNpemU9YWNjZXNzb3I9ZHNCbWloLmJpU2l6ZQotRElCU0VDVElPTl9iaVdpZHRoPWFjY2Vzc29yPWRzQm1paC5iaVdpZHRoCi1ESUJTRUNUSU9OX2JpSGVpZ2h0PWFjY2Vzc29yPWRzQm1paC5iaUhlaWdodAotRElCU0VDVElPTl9iaVBsYW5lcz1hY2Nlc3Nvcj1kc0JtaWguYmlQbGFuZXMKLURJQlNFQ1RJT05fYmlCaXRDb3VudD1hY2Nlc3Nvcj1kc0JtaWguYmlCaXRDb3VudAotRElCU0VDVElPTl9iaUNvbXByZXNzaW9uPWFjY2Vzc29yPWRzQm1paC5iaUNvbXByZXNzaW9uCi1ESUJTRUNUSU9OX2JpU2l6ZUltYWdlPWFjY2Vzc29yPWRzQm1paC5iaVNpemVJbWFnZQotRElCU0VDVElPTl9iaVhQZWxzUGVyTWV0ZXI9YWNjZXNzb3I9ZHNCbWloLmJpWFBlbHNQZXJNZXRlcgotRElCU0VDVElPTl9iaVlQZWxzUGVyTWV0ZXI9YWNjZXNzb3I9ZHNCbWloLmJpWVBlbHNQZXJNZXRlcgotRElCU0VDVElPTl9iaUNsclVzZWQ9YWNjZXNzb3I9ZHNCbWloLmJpQ2xyVXNlZAotRElCU0VDVElPTl9iaUNsckltcG9ydGFudD1hY2Nlc3Nvcj1kc0JtaWguYmlDbHJJbXBvcnRhbnQKLURJQlNFQ1RJT05fZHNCaXRmaWVsZHMwPWFjY2Vzc29yPWRzQml0ZmllbGRzWzBdCi1ESUJTRUNUSU9OX2RzQml0ZmllbGRzMT1hY2Nlc3Nvcj1kc0JpdGZpZWxkc1sxXQotRElCU0VDVElPTl9kc0JpdGZpZWxkczI9YWNjZXNzb3I9ZHNCaXRmaWVsZHNbMl0KLURJQlNFQ1RJT05fZHNoU2VjdGlvbj1jYXN0PShIQU5ETEUpCi1ESUJTRUNUSU9OX2RzT2Zmc2V0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRExMVkVSU0lPTklORk89Ci1ETExWRVJTSU9OSU5GT19jYlNpemU9Ci1ETExWRVJTSU9OSU5GT19kd01ham9yVmVyc2lvbj0KLURMTFZFUlNJT05JTkZPX2R3TWlub3JWZXJzaW9uPQotRExMVkVSU0lPTklORk9fZHdCdWlsZE51bWJlcj0KLURMTFZFUlNJT05JTkZPX2R3UGxhdGZvcm1JRD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RPQ0lORk89Ci1ET0NJTkZPX2NiU2l6ZT0KLURPQ0lORk9fbHBzekRvY05hbWU9Y2FzdD0oTFBDVFNUUikKLURPQ0lORk9fbHBzek91dHB1dD1jYXN0PShMUENUU1RSKQotRE9DSU5GT19scHN6RGF0YXR5cGU9Y2FzdD0oTFBDVFNUUikKLURPQ0lORk9fZndUeXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJBV0lURU1TVFJVQ1Q9Ci1EUkFXSVRFTVNUUlVDVF9DdGxUeXBlPQotRFJBV0lURU1TVFJVQ1RfQ3RsSUQ9Ci1EUkFXSVRFTVNUUlVDVF9pdGVtSUQ9Ci1EUkFXSVRFTVNUUlVDVF9pdGVtQWN0aW9uPQotRFJBV0lURU1TVFJVQ1RfaXRlbVN0YXRlPQotRFJBV0lURU1TVFJVQ1RfaHduZEl0ZW09Y2FzdD0oSFdORCkKLURSQVdJVEVNU1RSVUNUX2hEQz1jYXN0PShIREMpCi1EUkFXSVRFTVNUUlVDVF9sZWZ0PWFjY2Vzc29yPXJjSXRlbS5sZWZ0Ci1EUkFXSVRFTVNUUlVDVF90b3A9YWNjZXNzb3I9cmNJdGVtLnRvcAotRFJBV0lURU1TVFJVQ1RfYm90dG9tPWFjY2Vzc29yPXJjSXRlbS5ib3R0b20KLURSQVdJVEVNU1RSVUNUX3JpZ2h0PWFjY2Vzc29yPXJjSXRlbS5yaWdodAotRFJBV0lURU1TVFJVQ1RfaXRlbURhdGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUk9QRklMRVM9Ci1EUk9QRklMRVNfcEZpbGVzPQotRFJPUEZJTEVTX3B0X3g9YWNjZXNzb3I9cHQueAotRFJPUEZJTEVTX3B0X3k9YWNjZXNzb3I9cHQueQotRFJPUEZJTEVTX2ZOQz0KLURST1BGSUxFU19mV2lkZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTj0KLUVYVExPR1BFTl9lbHBQZW5TdHlsZT0KLUVYVExPR1BFTl9lbHBXaWR0aD0KLUVYVExPR1BFTl9lbHBCcnVzaFN0eWxlPQotRVhUTE9HUEVOX2VscENvbG9yPQotRVhUTE9HUEVOX2VscEhhdGNoPQotRVhUTE9HUEVOX2VscE51bUVudHJpZXM9Ci1FWFRMT0dQRU5fZWxwU3R5bGVFbnRyeT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0ZJTEVUSU1FPQotRklMRVRJTUVfZHdMb3dEYXRlVGltZT0KLUZJTEVUSU1FX2R3SGlnaERhdGVUaW1lPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfR0NQXzFSRVNVTFRTPQotR0NQX1JFU1VMVFNfbFN0cnVjdFNpemU9Ci1HQ1BfUkVTVUxUU19scE91dFN0cmluZz1jYXN0PShMUFRTVFIpCi1HQ1BfUkVTVUxUU19scE9yZGVyPWNhc3Q9KFVJTlQgICopCi1HQ1BfUkVTVUxUU19scER4PWNhc3Q9KGludCAgKikKLUdDUF9SRVNVTFRTX2xwQ2FyZXRQb3M9Y2FzdD0oaW50ICAqKQotR0NQX1JFU1VMVFNfbHBDbGFzcz1jYXN0PShMUFNUUikKLUdDUF9SRVNVTFRTX2xwR2x5cGhzPWNhc3Q9KExQV1NUUikKLUdDUF9SRVNVTFRTX25HbHlwaHM9Ci1HQ1BfUkVTVUxUU19uTWF4Rml0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfR1JBRElFTlRfMVJFQ1Q9Ci1HUkFESUVOVF9SRUNUX1VwcGVyTGVmdD0KLUdSQURJRU5UX1JFQ1RfTG93ZXJSaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0dVSVRIUkVBRElORk89Ci1HVUlUSFJFQURJTkZPX2NiU2l6ZT1jYXN0PShEV09SRCkKLUdVSVRIUkVBRElORk9fZmxhZ3M9Y2FzdD0oRFdPUkQpCi1HVUlUSFJFQURJTkZPX2h3bmRBY3RpdmU9Y2FzdD0oSFdORCkKLUdVSVRIUkVBRElORk9faHduZEZvY3VzPWNhc3Q9KEhXTkQpCi1HVUlUSFJFQURJTkZPX2h3bmRDYXB0dXJlPWNhc3Q9KEhXTkQpCi1HVUlUSFJFQURJTkZPX2h3bmRNZW51T3duZXI9Y2FzdD0oSFdORCkKLUdVSVRIUkVBRElORk9faHduZE1vdmVTaXplPWNhc3Q9KEhXTkQpCi1HVUlUSFJFQURJTkZPX2h3bmRDYXJldD1jYXN0PShIV05EKQotR1VJVEhSRUFESU5GT19sZWZ0PWFjY2Vzc29yPXJjQ2FyZXQubGVmdAotR1VJVEhSRUFESU5GT190b3A9YWNjZXNzb3I9cmNDYXJldC50b3AKLUdVSVRIUkVBRElORk9fcmlnaHQ9YWNjZXNzb3I9cmNDYXJldC5yaWdodAotR1VJVEhSRUFESU5GT19ib3R0b209YWNjZXNzb3I9cmNDYXJldC5ib3R0b20KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTT0KLUhESVRFTV9tYXNrPQotSERJVEVNX2N4eT0KLUhESVRFTV9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLUhESVRFTV9oYm09Y2FzdD0oSEJJVE1BUCkKLUhESVRFTV9jY2hUZXh0TWF4PQotSERJVEVNX2ZtdD0KLUhESVRFTV9sUGFyYW09Ci1IRElURU1faUltYWdlPQotSERJVEVNX2lPcmRlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUPQotSERMQVlPVVRfcHJjPWNhc3Q9UkVDVCAqCi1IRExBWU9VVF9wd3Bvcz1jYXN0PShXSU5ET1dQT1MgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hFTFBJTkZPPQotSEVMUElORk9fY2JTaXplPQotSEVMUElORk9faUNvbnRleHRUeXBlPQotSEVMUElORk9faUN0cmxJZD0KLUhFTFBJTkZPX2hJdGVtSGFuZGxlPWNhc3Q9KEhBTkRMRSkKLUhFTFBJTkZPX2R3Q29udGV4dElkPQotSEVMUElORk9feD1hY2Nlc3Nvcj1Nb3VzZVBvcy54Ci1IRUxQSU5GT195PWFjY2Vzc29yPU1vdXNlUG9zLnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVD0KLUhJR0hDT05UUkFTVF9jYlNpemU9Ci1ISUdIQ09OVFJBU1RfZHdGbGFncz0KLUhJR0hDT05UUkFTVF9scHN6RGVmYXVsdFNjaGVtZT1jYXN0PUxQVFNUUgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSUNPTklORk89Ci1JQ09OSU5GT19mSWNvbj0KLUlDT05JTkZPX3hIb3RzcG90PQotSUNPTklORk9feUhvdHNwb3Q9Ci1JQ09OSU5GT19oYm1NYXNrPWNhc3Q9KEhCSVRNQVApCi1JQ09OSU5GT19oYm1Db2xvcj1jYXN0PShIQklUTUFQKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSU5JVENPTU1PTkNPTlRST0xTRVg9Ci1JTklUQ09NTU9OQ09OVFJPTFNFWF9kd1NpemU9Ci1JTklUQ09NTU9OQ09OVFJPTFNFWF9kd0lDQz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0lOUFVUPQotSU5QVVRfdHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVQ9Ci1LRVlCRElOUFVUX3dWaz0KLUtFWUJESU5QVVRfd1NjYW49Ci1LRVlCRElOUFVUX2R3RmxhZ3M9Ci1LRVlCRElOUFVUX3RpbWU9Ci1LRVlCRElOUFVUX2R3RXh0cmFJbmZvPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU09Ci1MSVRFTV9tYXNrPQotTElURU1faUxpbms9Ci1MSVRFTV9zdGF0ZT0KLUxJVEVNX3N0YXRlTWFzaz0KLUxJVEVNX3N6SUQ9Ci1MSVRFTV9zelVybD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIPQotTE9HQlJVU0hfbGJTdHlsZT0KLUxPR0JSVVNIX2xiQ29sb3I9Ci1MT0dCUlVTSF9sYkhhdGNoPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVD0KLUxPR0ZPTlRfbGZIZWlnaHQ9Ci1MT0dGT05UX2xmV2lkdGg9Ci1MT0dGT05UX2xmRXNjYXBlbWVudD0KLUxPR0ZPTlRfbGZPcmllbnRhdGlvbj0KLUxPR0ZPTlRfbGZXZWlnaHQ9Ci1MT0dGT05UX2xmSXRhbGljPQotTE9HRk9OVF9sZlVuZGVybGluZT0KLUxPR0ZPTlRfbGZTdHJpa2VPdXQ9Ci1MT0dGT05UX2xmQ2hhclNldD0KLUxPR0ZPTlRfbGZPdXRQcmVjaXNpb249Ci1MT0dGT05UX2xmQ2xpcFByZWNpc2lvbj0KLUxPR0ZPTlRfbGZRdWFsaXR5PQotTE9HRk9OVF9sZlBpdGNoQW5kRmFtaWx5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEE9Ci1MT0dGT05UQV9sZkZhY2VOYW1lPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFc9Ci1MT0dGT05UV19sZkZhY2VOYW1lPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOPQotTE9HUEVOX2xvcG5TdHlsZT0KLUxPR1BFTl94PWFjY2Vzc29yPWxvcG5XaWR0aC54Ci1MT0dQRU5feT1hY2Nlc3Nvcj1sb3BuV2lkdGgueQotTE9HUEVOX2xvcG5Db2xvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xSRVNVTFQ9ZmxhZ3M9bm9fZ2VuCi1MUkVTVUxUX3ZhbHVlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU49Ci1MVkNPTFVNTl9tYXNrPQotTFZDT0xVTU5fZm10PQotTFZDT0xVTU5fY3g9Ci1MVkNPTFVNTl9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLUxWQ09MVU1OX2NjaFRleHRNYXg9Ci1MVkNPTFVNTl9pU3ViSXRlbT0KLUxWQ09MVU1OX2lJbWFnZT0KLUxWQ09MVU1OX2lPcmRlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk89Ci1MVkhJVFRFU1RJTkZPX3g9YWNjZXNzb3I9cHQueAotTFZISVRURVNUSU5GT195PWFjY2Vzc29yPXB0LnkKLUxWSElUVEVTVElORk9fZmxhZ3M9Ci1MVkhJVFRFU1RJTkZPX2lJdGVtPQotTFZISVRURVNUSU5GT19pU3ViSXRlbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTT0KLUxWSVRFTV9tYXNrPQotTFZJVEVNX2lJdGVtPQotTFZJVEVNX2lTdWJJdGVtPQotTFZJVEVNX3N0YXRlPQotTFZJVEVNX3N0YXRlTWFzaz0KLUxWSVRFTV9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLUxWSVRFTV9jY2hUZXh0TWF4PQotTFZJVEVNX2lJbWFnZT0KLUxWSVRFTV9sUGFyYW09Ci1MVklURU1faUluZGVudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlM9Ci1NQVJHSU5TX2N4TGVmdFdpZHRoPQotTUFSR0lOU19jeFJpZ2h0V2lkdGg9Ci1NQVJHSU5TX2N5VG9wSGVpZ2h0PQotTUFSR0lOU19jeUJvdHRvbUhlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUPQotTUVBU1VSRUlURU1TVFJVQ1RfQ3RsVHlwZT0KLU1FQVNVUkVJVEVNU1RSVUNUX0N0bElEPQotTUVBU1VSRUlURU1TVFJVQ1RfaXRlbUlEPQotTUVBU1VSRUlURU1TVFJVQ1RfaXRlbVdpZHRoPQotTUVBU1VSRUlURU1TVFJVQ1RfaXRlbUhlaWdodD0KLU1FQVNVUkVJVEVNU1RSVUNUX2l0ZW1EYXRhPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVOVUJBUklORk89Ci1NRU5VQkFSSU5GT19jYlNpemU9Ci1NRU5VQkFSSU5GT19sZWZ0PWFjY2Vzc29yPXJjQmFyLmxlZnQKLU1FTlVCQVJJTkZPX3RvcD1hY2Nlc3Nvcj1yY0Jhci50b3AKLU1FTlVCQVJJTkZPX3JpZ2h0PWFjY2Vzc29yPXJjQmFyLnJpZ2h0Ci1NRU5VQkFSSU5GT19ib3R0b209YWNjZXNzb3I9cmNCYXIuYm90dG9tCi1NRU5VQkFSSU5GT19oTWVudT1jYXN0PShITUVOVSkKLU1FTlVCQVJJTkZPX2h3bmRNZW51PWNhc3Q9KEhXTkQpCi1NRU5VQkFSSU5GT19mQmFyRm9jdXNlZD0KLU1FTlVCQVJJTkZPX2ZGb2N1c2VkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVOVUlORk89Ci1NRU5VSU5GT19jYlNpemU9Ci1NRU5VSU5GT19mTWFzaz0KLU1FTlVJTkZPX2R3U3R5bGU9Ci1NRU5VSU5GT19jeU1heD0KLU1FTlVJTkZPX2hickJhY2s9Y2FzdD0oSEJSVVNIKQotTUVOVUlORk9fZHdDb250ZXh0SGVscElEPQotTUVOVUlORk9fZHdNZW51RGF0YT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FTlVJVEVNSU5GTz0KLU1FTlVJVEVNSU5GT19jYlNpemU9Ci1NRU5VSVRFTUlORk9fZk1hc2s9Ci1NRU5VSVRFTUlORk9fZlR5cGU9Ci1NRU5VSVRFTUlORk9fZlN0YXRlPQotTUVOVUlURU1JTkZPX3dJRD0KLU1FTlVJVEVNSU5GT19oU3ViTWVudT1jYXN0PShITUVOVSkKLU1FTlVJVEVNSU5GT19oYm1wQ2hlY2tlZD1jYXN0PShIQklUTUFQKQotTUVOVUlURU1JTkZPX2hibXBVbmNoZWNrZWQ9Y2FzdD0oSEJJVE1BUCkKLU1FTlVJVEVNSU5GT19kd0l0ZW1EYXRhPQotTUVOVUlURU1JTkZPX2R3VHlwZURhdGE9Y2FzdD0oTFBUU1RSKQotTUVOVUlURU1JTkZPX2NjaD0KLU1FTlVJVEVNSU5GT19oYm1wSXRlbT1jYXN0PShIQklUTUFQKSxmbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GTz0KLU1JTk1BWElORk9fcHRSZXNlcnZlZF94PWFjY2Vzc29yPXB0UmVzZXJ2ZWQueAotTUlOTUFYSU5GT19wdFJlc2VydmVkX3k9YWNjZXNzb3I9cHRSZXNlcnZlZC55Ci1NSU5NQVhJTkZPX3B0TWF4U2l6ZV94PWFjY2Vzc29yPXB0TWF4U2l6ZS54Ci1NSU5NQVhJTkZPX3B0TWF4U2l6ZV95PWFjY2Vzc29yPXB0TWF4U2l6ZS55Ci1NSU5NQVhJTkZPX3B0TWF4UG9zaXRpb25feD1hY2Nlc3Nvcj1wdE1heFBvc2l0aW9uLngKLU1JTk1BWElORk9fcHRNYXhQb3NpdGlvbl95PWFjY2Vzc29yPXB0TWF4UG9zaXRpb24ueQotTUlOTUFYSU5GT19wdE1pblRyYWNrU2l6ZV94PWFjY2Vzc29yPXB0TWluVHJhY2tTaXplLngKLU1JTk1BWElORk9fcHRNaW5UcmFja1NpemVfeT1hY2Nlc3Nvcj1wdE1pblRyYWNrU2l6ZS55Ci1NSU5NQVhJTkZPX3B0TWF4VHJhY2tTaXplX3g9YWNjZXNzb3I9cHRNYXhUcmFja1NpemUueAotTUlOTUFYSU5GT19wdE1heFRyYWNrU2l6ZV95PWFjY2Vzc29yPXB0TWF4VHJhY2tTaXplLnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PTklUT1JJTkZPPQotTU9OSVRPUklORk9fY2JTaXplPQotTU9OSVRPUklORk9fcmNNb25pdG9yX2xlZnQ9YWNjZXNzb3I9cmNNb25pdG9yLmxlZnQKLU1PTklUT1JJTkZPX3JjTW9uaXRvcl90b3A9YWNjZXNzb3I9cmNNb25pdG9yLnRvcAotTU9OSVRPUklORk9fcmNNb25pdG9yX3JpZ2h0PWFjY2Vzc29yPXJjTW9uaXRvci5yaWdodAotTU9OSVRPUklORk9fcmNNb25pdG9yX2JvdHRvbT1hY2Nlc3Nvcj1yY01vbml0b3IuYm90dG9tCi1NT05JVE9SSU5GT19yY1dvcmtfbGVmdD1hY2Nlc3Nvcj1yY1dvcmsubGVmdAotTU9OSVRPUklORk9fcmNXb3JrX3RvcD1hY2Nlc3Nvcj1yY1dvcmsudG9wCi1NT05JVE9SSU5GT19yY1dvcmtfcmlnaHQ9YWNjZXNzb3I9cmNXb3JrLnJpZ2h0Ci1NT05JVE9SSU5GT19yY1dvcmtfYm90dG9tPWFjY2Vzc29yPXJjV29yay5ib3R0b20KLU1PTklUT1JJTkZPX2R3RmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NT1VTRUlOUFVUPQotTU9VU0VJTlBVVF9keD0KLU1PVVNFSU5QVVRfZHk9Ci1NT1VTRUlOUFVUX21vdXNlRGF0YT0KLU1PVVNFSU5QVVRfZHdGbGFncz0KLU1PVVNFSU5QVVRfdGltZT0KLU1PVVNFSU5QVVRfZHdFeHRyYUluZm89Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0c9Ci1NU0dfaHduZD1jYXN0PShIV05EKQotTVNHX21lc3NhZ2U9Ci1NU0dfd1BhcmFtPQotTVNHX2xQYXJhbT0KLU1TR190aW1lPQotTVNHX3g9YWNjZXNzb3I9cHQueAotTVNHX3k9YWNjZXNzb3I9cHQueQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1DVVNUT01EUkFXPQotTk1DVVNUT01EUkFXX2R3RHJhd1N0YWdlPQotTk1DVVNUT01EUkFXX2hkYz1jYXN0PShIREMpCi1OTUNVU1RPTURSQVdfbGVmdD1hY2Nlc3Nvcj1yYy5sZWZ0Ci1OTUNVU1RPTURSQVdfdG9wPWFjY2Vzc29yPXJjLnRvcAotTk1DVVNUT01EUkFXX3JpZ2h0PWFjY2Vzc29yPXJjLnJpZ2h0Ci1OTUNVU1RPTURSQVdfYm90dG9tPWFjY2Vzc29yPXJjLmJvdHRvbQotTk1DVVNUT01EUkFXX2R3SXRlbVNwZWM9Ci1OTUNVU1RPTURSQVdfdUl0ZW1TdGF0ZT0KLU5NQ1VTVE9NRFJBV19sSXRlbWxQYXJhbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSERSPQotTk1IRFJfaHduZEZyb209Y2FzdD0oSFdORCkKLU5NSERSX2lkRnJvbT0KLU5NSERSX2NvZGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhFQURFUj0KLU5NSEVBREVSX2lJdGVtPQotTk1IRUFERVJfaUJ1dHRvbj0KLU5NSEVBREVSX3BpdGVtPWNhc3Q9KEhESVRFTSBGQVIgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElOSz0KLU5NTElOS19tYXNrPWFjY2Vzc29yPWl0ZW0ubWFzawotTk1MSU5LX2lMaW5rPWFjY2Vzc29yPWl0ZW0uaUxpbmsKLU5NTElOS19zdGF0ZT1hY2Nlc3Nvcj1pdGVtLnN0YXRlCi1OTUxJTktfc3RhdGVNYXNrPWFjY2Vzc29yPWl0ZW0uc3RhdGVNYXNrCi1OTUxJTktfc3pJRD1hY2Nlc3Nvcj1pdGVtLnN6SUQKLU5NTElOS19zelVybD1hY2Nlc3Nvcj1pdGVtLnN6VXJsCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJU1RWSUVXPQotTk1MSVNUVklFV19pSXRlbT0KLU5NTElTVFZJRVdfaVN1Ykl0ZW09Ci1OTUxJU1RWSUVXX3VOZXdTdGF0ZT0KLU5NTElTVFZJRVdfdU9sZFN0YXRlPQotTk1MSVNUVklFV191Q2hhbmdlZD0KLU5NTElTVFZJRVdfeD1hY2Nlc3Nvcj1wdEFjdGlvbi54Ci1OTUxJU1RWSUVXX3k9YWNjZXNzb3I9cHRBY3Rpb24ueQotTk1MSVNUVklFV19sUGFyYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBVz0KLU5NTFZDVVNUT01EUkFXX2NsclRleHQ9Ci1OTUxWQ1VTVE9NRFJBV19jbHJUZXh0Qms9Ci1OTUxWQ1VTVE9NRFJBV19pU3ViSXRlbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GTz0KLU5NTFZESVNQSU5GT19tYXNrPWFjY2Vzc29yPWl0ZW0ubWFzawotTk1MVkRJU1BJTkZPX2lJdGVtPWFjY2Vzc29yPWl0ZW0uaUl0ZW0KLU5NTFZESVNQSU5GT19pU3ViSXRlbT1hY2Nlc3Nvcj1pdGVtLmlTdWJJdGVtCi1OTUxWRElTUElORk9fc3RhdGU9YWNjZXNzb3I9aXRlbS5zdGF0ZQotTk1MVkRJU1BJTkZPX3N0YXRlTWFzaz1hY2Nlc3Nvcj1pdGVtLnN0YXRlTWFzawotTk1MVkRJU1BJTkZPX3BzelRleHQ9YWNjZXNzb3I9aXRlbS5wc3pUZXh0LGNhc3Q9TFBUU1RSCi1OTUxWRElTUElORk9fY2NoVGV4dE1heD1hY2Nlc3Nvcj1pdGVtLmNjaFRleHRNYXgKLU5NTFZESVNQSU5GT19pSW1hZ2U9YWNjZXNzb3I9aXRlbS5pSW1hZ2UKLU5NTFZESVNQSU5GT19sUGFyYW09YWNjZXNzb3I9aXRlbS5sUGFyYW0KLU5NTFZESVNQSU5GT19pSW5kZW50PWFjY2Vzc29yPWl0ZW0uaUluZGVudAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkZJTkRJVEVNPQotTk1MVkZJTkRJVEVNX2lTdGFydD0KLU5NTFZGSU5ESVRFTV9mbGFncz1hY2Nlc3Nvcj1sdmZpLmZsYWdzCi1OTUxWRklORElURU1fcHN6PWFjY2Vzc29yPWx2ZmkucHN6LGNhc3Q9TFBDVFNUUgotTk1MVkZJTkRJVEVNX2xQYXJhbT1hY2Nlc3Nvcj1sdmZpLmxQYXJhbQotTk1MVkZJTkRJVEVNX3g9YWNjZXNzb3I9bHZmaS5wdC54Ci1OTUxWRklORElURU1feT1hY2Nlc3Nvcj1sdmZpLnB0LnkKLU5NTFZGSU5ESVRFTV92a0RpcmVjdGlvbj1hY2Nlc3Nvcj1sdmZpLnZrRGlyZWN0aW9uCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hFVlJPTj0KLU5NUkVCQVJDSEVWUk9OX3VCYW5kPQotTk1SRUJBUkNIRVZST05fd0lEPQotTk1SRUJBUkNIRVZST05fbFBhcmFtPQotTk1SRUJBUkNIRVZST05fbGVmdD1hY2Nlc3Nvcj1yYy5sZWZ0Ci1OTVJFQkFSQ0hFVlJPTl90b3A9YWNjZXNzb3I9cmMudG9wCi1OTVJFQkFSQ0hFVlJPTl9yaWdodD1hY2Nlc3Nvcj1yYy5yaWdodAotTk1SRUJBUkNIRVZST05fYm90dG9tPWFjY2Vzc29yPXJjLmJvdHRvbQotTk1SRUJBUkNIRVZST05fbFBhcmFtTk09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hJTERTSVpFPQotTk1SRUJBUkNISUxEU0laRV91QmFuZD0KLU5NUkVCQVJDSElMRFNJWkVfd0lEPQotTk1SRUJBUkNISUxEU0laRV9yY0NoaWxkX2xlZnQ9YWNjZXNzb3I9cmNDaGlsZC5sZWZ0Ci1OTVJFQkFSQ0hJTERTSVpFX3JjQ2hpbGRfdG9wPWFjY2Vzc29yPXJjQ2hpbGQudG9wCi1OTVJFQkFSQ0hJTERTSVpFX3JjQ2hpbGRfcmlnaHQ9YWNjZXNzb3I9cmNDaGlsZC5yaWdodAotTk1SRUJBUkNISUxEU0laRV9yY0NoaWxkX2JvdHRvbT1hY2Nlc3Nvcj1yY0NoaWxkLmJvdHRvbQotTk1SRUJBUkNISUxEU0laRV9yY0JhbmRfbGVmdD1hY2Nlc3Nvcj1yY0JhbmQubGVmdAotTk1SRUJBUkNISUxEU0laRV9yY0JhbmRfdG9wPWFjY2Vzc29yPXJjQmFuZC50b3AKLU5NUkVCQVJDSElMRFNJWkVfcmNCYW5kX3JpZ2h0PWFjY2Vzc29yPXJjQmFuZC5yaWdodAotTk1SRUJBUkNISUxEU0laRV9yY0JhbmRfYm90dG9tPWFjY2Vzc29yPXJjQmFuZC5ib3R0b20KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkdJTkZPPQotTk1SR0lORk9feD1hY2Nlc3Nvcj1wdEFjdGlvbi54Ci1OTVJHSU5GT195PWFjY2Vzc29yPXB0QWN0aW9uLnkKLU5NUkdJTkZPX2R3SXRlbVNwZWM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRCSE9USVRFTT0KLU5NVEJIT1RJVEVNX2lkT2xkPQotTk1UQkhPVElURU1faWROZXc9Ci1OTVRCSE9USVRFTV9kd0ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UT09MQkFSPQotTk1UT09MQkFSX2lJdGVtPQotTk1UT09MQkFSX2lCaXRtYXA9YWNjZXNzb3I9dGJCdXR0b24uaUJpdG1hcAotTk1UT09MQkFSX2lkQ29tbWFuZD1hY2Nlc3Nvcj10YkJ1dHRvbi5pZENvbW1hbmQKLU5NVE9PTEJBUl9mc1N0YXRlPWFjY2Vzc29yPXRiQnV0dG9uLmZzU3RhdGUKLU5NVE9PTEJBUl9mc1N0eWxlPWFjY2Vzc29yPXRiQnV0dG9uLmZzU3R5bGUKLU5NVE9PTEJBUl9kd0RhdGE9YWNjZXNzb3I9dGJCdXR0b24uZHdEYXRhCi1OTVRPT0xCQVJfaVN0cmluZz1hY2Nlc3Nvcj10YkJ1dHRvbi5pU3RyaW5nCi1OTVRPT0xCQVJfY2NoVGV4dD0KLU5NVE9PTEJBUl9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLU5NVE9PTEJBUl9sZWZ0PWFjY2Vzc29yPXJjQnV0dG9uLmxlZnQsZmxhZ3M9bm9fd2luY2UKLU5NVE9PTEJBUl90b3A9YWNjZXNzb3I9cmNCdXR0b24udG9wLGZsYWdzPW5vX3dpbmNlCi1OTVRPT0xCQVJfcmlnaHQ9YWNjZXNzb3I9cmNCdXR0b24ucmlnaHQsZmxhZ3M9bm9fd2luY2UKLU5NVE9PTEJBUl9ib3R0b209YWNjZXNzb3I9cmNCdXR0b24uYm90dG9tLGZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk89Ci1OTVRURElTUElORk9fbHBzelRleHQ9Y2FzdD0odm9pZCAqKQotTk1UVERJU1BJTkZPX2hpbnN0PWNhc3Q9KEhJTlNUQU5DRSkKLU5NVFRESVNQSU5GT191RmxhZ3M9Ci1OTVRURElTUElORk9fbFBhcmFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQT0KLU5NVFRESVNQSU5GT0Ffc3pUZXh0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPVz0KLU5NVFRESVNQSU5GT1dfc3pUZXh0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVc9Ci1OTVRWQ1VTVE9NRFJBV19jbHJUZXh0PQotTk1UVkNVU1RPTURSQVdfY2xyVGV4dEJrPQotTk1UVkNVU1RPTURSQVdfaUxldmVsPWZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWRElTUElORk89Ci1OTVRWRElTUElORk9fbWFzaz1hY2Nlc3Nvcj1pdGVtLm1hc2sKLU5NVFZESVNQSU5GT19oSXRlbT1hY2Nlc3Nvcj1pdGVtLmhJdGVtLGNhc3Q9SFRSRUVJVEVNCi1OTVRWRElTUElORk9fc3RhdGU9YWNjZXNzb3I9aXRlbS5zdGF0ZQotTk1UVkRJU1BJTkZPX3N0YXRlTWFzaz1hY2Nlc3Nvcj1pdGVtLnN0YXRlTWFzawotTk1UVkRJU1BJTkZPX3BzelRleHQ9YWNjZXNzb3I9aXRlbS5wc3pUZXh0LGNhc3Q9TFBUU1RSCi1OTVRWRElTUElORk9fY2NoVGV4dE1heD1hY2Nlc3Nvcj1pdGVtLmNjaFRleHRNYXgKLU5NVFZESVNQSU5GT19pSW1hZ2U9YWNjZXNzb3I9aXRlbS5pSW1hZ2UKLU5NVFZESVNQSU5GT19pU2VsZWN0ZWRJbWFnZT1hY2Nlc3Nvcj1pdGVtLmlTZWxlY3RlZEltYWdlCi1OTVRWRElTUElORk9fY0NoaWxkcmVuPWFjY2Vzc29yPWl0ZW0uY0NoaWxkcmVuCi1OTVRWRElTUElORk9fbFBhcmFtPWFjY2Vzc29yPWl0ZW0ubFBhcmFtCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVVQRE9XTj0KLU5NVVBET1dOX2lQb3M9Ci1OTVVQRE9XTl9pRGVsdGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTPQotTk9OQ0xJRU5UTUVUUklDU19jYlNpemU9Ci1OT05DTElFTlRNRVRSSUNTX2lCb3JkZXJXaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaVNjcm9sbFdpZHRoPQotTk9OQ0xJRU5UTUVUUklDU19pU2Nyb2xsSGVpZ2h0PQotTk9OQ0xJRU5UTUVUUklDU19pQ2FwdGlvbldpZHRoPQotTk9OQ0xJRU5UTUVUUklDU19pQ2FwdGlvbkhlaWdodD0KLU5PTkNMSUVOVE1FVFJJQ1NfaVNtQ2FwdGlvbldpZHRoPQotTk9OQ0xJRU5UTUVUUklDU19pU21DYXB0aW9uSGVpZ2h0PQotTk9OQ0xJRU5UTUVUUklDU19pTWVudVdpZHRoPQotTk9OQ0xJRU5UTUVUUklDU19pTWVudUhlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBPQotTk9OQ0xJRU5UTUVUUklDU0FfbGZDYXB0aW9uRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NBX2xmU21DYXB0aW9uRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NBX2xmTWVudUZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTQV9sZlN0YXR1c0ZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTQV9sZk1lc3NhZ2VGb250PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1c9Ci1OT05DTElFTlRNRVRSSUNTV19sZkNhcHRpb25Gb250PQotTk9OQ0xJRU5UTUVUUklDU1dfbGZTbUNhcHRpb25Gb250PQotTk9OQ0xJRU5UTUVUUklDU1dfbGZNZW51Rm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NXX2xmU3RhdHVzRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NXX2xmTWVzc2FnZUZvbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT1RJRllJQ09OREFUQT0KLU5PVElGWUlDT05EQVRBX2NiU2l6ZT0KLU5PVElGWUlDT05EQVRBX2hXbmQ9Y2FzdD0oSFdORCkKLU5PVElGWUlDT05EQVRBX3VJRD0KLU5PVElGWUlDT05EQVRBX3VGbGFncz0KLU5PVElGWUlDT05EQVRBX3VDYWxsYmFja01lc3NhZ2U9Ci1OT1RJRllJQ09OREFUQV9oSWNvbj1jYXN0PShISUNPTikKLU5PVElGWUlDT05EQVRBX2R3U3RhdGU9ZmxhZ3M9bm9fd2luY2UKLU5PVElGWUlDT05EQVRBX2R3U3RhdGVNYXNrPWZsYWdzPW5vX3dpbmNlCi1OT1RJRllJQ09OREFUQV91VmVyc2lvbj1mbGFncz1ub193aW5jZQotTk9USUZZSUNPTkRBVEFfZHdJbmZvRmxhZ3M9ZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PVElGWUlDT05EQVRBQT0KLU5PVElGWUlDT05EQVRBQV9zelRpcD1jYXN0PShUQ0hBUikKLU5PVElGWUlDT05EQVRBQV9zekluZm89Y2FzdD0oVENIQVIpLGZsYWdzPW5vX3dpbmNlCi1OT1RJRllJQ09OREFUQUFfc3pJbmZvVGl0bGU9Y2FzdD0oVENIQVIpLGZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT1RJRllJQ09OREFUQVc9Ci1OT1RJRllJQ09OREFUQVdfc3pUaXA9Y2FzdD0oVENIQVIpCi1OT1RJRllJQ09OREFUQVdfc3pJbmZvPWNhc3Q9KFRDSEFSKSxmbGFncz1ub193aW5jZQotTk9USUZZSUNPTkRBVEFXX3N6SW5mb1RpdGxlPWNhc3Q9KFRDSEFSKSxmbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1BFTkZJTEVOQU1FPQotT1BFTkZJTEVOQU1FX2xTdHJ1Y3RTaXplPQotT1BFTkZJTEVOQU1FX2h3bmRPd25lcj1jYXN0PShIV05EKQotT1BFTkZJTEVOQU1FX2hJbnN0YW5jZT1jYXN0PShISU5TVEFOQ0UpCi1PUEVORklMRU5BTUVfbHBzdHJGaWx0ZXI9Y2FzdD0oTFBDVFNUUikKLU9QRU5GSUxFTkFNRV9scHN0ckN1c3RvbUZpbHRlcj1jYXN0PShMUFRTVFIpCi1PUEVORklMRU5BTUVfbk1heEN1c3RGaWx0ZXI9Ci1PUEVORklMRU5BTUVfbkZpbHRlckluZGV4PQotT1BFTkZJTEVOQU1FX2xwc3RyRmlsZT1jYXN0PShMUFRTVFIpCi1PUEVORklMRU5BTUVfbk1heEZpbGU9Ci1PUEVORklMRU5BTUVfbHBzdHJGaWxlVGl0bGU9Y2FzdD0oTFBUU1RSKQotT1BFTkZJTEVOQU1FX25NYXhGaWxlVGl0bGU9Ci1PUEVORklMRU5BTUVfbHBzdHJJbml0aWFsRGlyPWNhc3Q9KExQQ1RTVFIpCi1PUEVORklMRU5BTUVfbHBzdHJUaXRsZT1jYXN0PShMUENUU1RSKQotT1BFTkZJTEVOQU1FX0ZsYWdzPQotT1BFTkZJTEVOQU1FX25GaWxlT2Zmc2V0PQotT1BFTkZJTEVOQU1FX25GaWxlRXh0ZW5zaW9uPQotT1BFTkZJTEVOQU1FX2xwc3RyRGVmRXh0PWNhc3Q9KExQQ1RTVFIpCi1PUEVORklMRU5BTUVfbEN1c3REYXRhPQotT1BFTkZJTEVOQU1FX2xwZm5Ib29rPWNhc3Q9KExQT0ZOSE9PS1BST0MpCi1PUEVORklMRU5BTUVfbHBUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TPQotT1NfQWJvcnREb2M9Ci1PU19BYm9ydERvY18wPWNhc3Q9KEhEQykKLQotT1NfQWN0aXZhdGVLZXlib2FyZExheW91dD0KLU9TX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXRfMD1jYXN0PShIS0wpCi1PU19BY3RpdmF0ZUtleWJvYXJkTGF5b3V0XzE9Ci0KLU9TX0FkanVzdFdpbmRvd1JlY3RFeD0KLU9TX0FkanVzdFdpbmRvd1JlY3RFeF8wPQotT1NfQWRqdXN0V2luZG93UmVjdEV4XzE9Ci1PU19BZGp1c3RXaW5kb3dSZWN0RXhfMj0KLU9TX0FkanVzdFdpbmRvd1JlY3RFeF8zPQotCi1PU19BbHBoYUJsZW5kPWZsYWdzPWR5bmFtaWMKLU9TX0FscGhhQmxlbmRfMD0KLU9TX0FscGhhQmxlbmRfMT0KLU9TX0FscGhhQmxlbmRfMj0KLU9TX0FscGhhQmxlbmRfMz0KLU9TX0FscGhhQmxlbmRfND0KLU9TX0FscGhhQmxlbmRfNT0KLU9TX0FscGhhQmxlbmRfNj0KLU9TX0FscGhhQmxlbmRfNz0KLU9TX0FscGhhQmxlbmRfOD0KLU9TX0FscGhhQmxlbmRfOT0KLU9TX0FscGhhQmxlbmRfMTA9ZmxhZ3M9c3RydWN0Ci0KLU9TX0FyYz0KLU9TX0FyY18wPWNhc3Q9KEhEQykKLU9TX0FyY18xPQotT1NfQXJjXzI9Ci1PU19BcmNfMz0KLU9TX0FyY180PQotT1NfQXJjXzU9Ci1PU19BcmNfNj0KLU9TX0FyY183PQotT1NfQXJjXzg9Ci0KLU9TX0JlZ2luRGVmZXJXaW5kb3dQb3M9Ci1PU19CZWdpbkRlZmVyV2luZG93UG9zXzA9Ci0KLU9TX0JlZ2luUGFpbnQ9Ci1PU19CZWdpblBhaW50XzA9Y2FzdD0oSFdORCkKLU9TX0JlZ2luUGFpbnRfMT0KLQotT1NfQmVnaW5QYXRoPQotT1NfQmVnaW5QYXRoXzA9Y2FzdD0oSERDKQotCi1PU19CaXRCbHQ9Ci1PU19CaXRCbHRfMD1jYXN0PShIREMpCi1PU19CaXRCbHRfMT0KLU9TX0JpdEJsdF8yPQotT1NfQml0Qmx0XzM9Ci1PU19CaXRCbHRfND0KLU9TX0JpdEJsdF81PWNhc3Q9KEhEQykKLU9TX0JpdEJsdF82PQotT1NfQml0Qmx0Xzc9Ci1PU19CaXRCbHRfOD0KLQotT1NfQnJpbmdXaW5kb3dUb1RvcD0KLU9TX0JyaW5nV2luZG93VG9Ub3BfMD1jYXN0PShIV05EKQotCi1PU19DYWxsPQotT1NfQ2FsbF8wPWNhc3Q9KERMTEdFVFZFUlNJT05QUk9DKQotT1NfQ2FsbF8xPQotCi1PU19DYWxsTmV4dEhvb2tFeD0KLU9TX0NhbGxOZXh0SG9va0V4XzA9Y2FzdD0oSEhPT0spCi1PU19DYWxsTmV4dEhvb2tFeF8xPQotT1NfQ2FsbE5leHRIb29rRXhfMj1jYXN0PShXUEFSQU0pCi1PU19DYWxsTmV4dEhvb2tFeF8zPWNhc3Q9KExQQVJBTSkKLQotT1NfQ2FsbFdpbmRvd1Byb2NBPQotT1NfQ2FsbFdpbmRvd1Byb2NBXzA9Y2FzdD0oV05EUFJPQykKLU9TX0NhbGxXaW5kb3dQcm9jQV8xPWNhc3Q9KEhXTkQpCi1PU19DYWxsV2luZG93UHJvY0FfMj0KLU9TX0NhbGxXaW5kb3dQcm9jQV8zPQotT1NfQ2FsbFdpbmRvd1Byb2NBXzQ9Ci0KLU9TX0NhbGxXaW5kb3dQcm9jVz0KLU9TX0NhbGxXaW5kb3dQcm9jV18wPWNhc3Q9KFdORFBST0MpCi1PU19DYWxsV2luZG93UHJvY1dfMT1jYXN0PShIV05EKQotT1NfQ2FsbFdpbmRvd1Byb2NXXzI9Ci1PU19DYWxsV2luZG93UHJvY1dfMz0KLU9TX0NhbGxXaW5kb3dQcm9jV180PQotCi1PU19DaGFyTG93ZXJBPQotT1NfQ2hhckxvd2VyQV8wPWNhc3Q9KExQU1RSKQotCi1PU19DaGFyTG93ZXJXPQotT1NfQ2hhckxvd2VyV18wPWNhc3Q9KExQV1NUUikKLQotT1NfQ2hhclVwcGVyQT0KLU9TX0NoYXJVcHBlckFfMD1jYXN0PShMUFNUUikKLQotT1NfQ2hhclVwcGVyVz0KLU9TX0NoYXJVcHBlcldfMD1jYXN0PShMUFdTVFIpCi0KLU9TX0NoZWNrTWVudUl0ZW09Ci1PU19DaGVja01lbnVJdGVtXzA9Y2FzdD0oSE1FTlUpCi1PU19DaGVja01lbnVJdGVtXzE9Y2FzdD0oVUlOVCkKLU9TX0NoZWNrTWVudUl0ZW1fMj1jYXN0PShVSU5UKQotCi1PU19DaG9vc2VDb2xvckE9Ci1PU19DaG9vc2VDb2xvckFfMD0KLQotT1NfQ2hvb3NlQ29sb3JXPQotT1NfQ2hvb3NlQ29sb3JXXzA9Y2FzdD0oTFBDSE9PU0VDT0xPUlcpCi0KLU9TX0Nob29zZUZvbnRBPQotT1NfQ2hvb3NlRm9udEFfMD0KLQotT1NfQ2hvb3NlRm9udFc9Ci1PU19DaG9vc2VGb250V18wPWNhc3Q9KExQQ0hPT1NFRk9OVFcpCi0KLU9TX0NsaWVudFRvU2NyZWVuPQotT1NfQ2xpZW50VG9TY3JlZW5fMD1jYXN0PShIV05EKQotT1NfQ2xpZW50VG9TY3JlZW5fMT0KLQotT1NfQ2xvc2VDbGlwYm9hcmQ9Ci0KLU9TX0Nsb3NlVGhlbWVEYXRhPWZsYWdzPWR5bmFtaWMKLU9TX0Nsb3NlVGhlbWVEYXRhXzA9Y2FzdD1IVEhFTUUKLQotT1NfQ29DcmVhdGVJbnN0YW5jZT0KLU9TX0NvQ3JlYXRlSW5zdGFuY2VfMD1jYXN0PVJFRkNMU0lECi1PU19Db0NyZWF0ZUluc3RhbmNlXzE9Y2FzdD1MUFVOS05PV04KLU9TX0NvQ3JlYXRlSW5zdGFuY2VfMj0KLU9TX0NvQ3JlYXRlSW5zdGFuY2VfMz1jYXN0PVJFRklJRAotT1NfQ29DcmVhdGVJbnN0YW5jZV80PWNhc3Q9TFBWT0lEICoKLQotT1NfQ29tYmluZVJnbj0KLU9TX0NvbWJpbmVSZ25fMD1jYXN0PShIUkdOKQotT1NfQ29tYmluZVJnbl8xPWNhc3Q9KEhSR04pCi1PU19Db21iaW5lUmduXzI9Y2FzdD0oSFJHTikKLU9TX0NvbWJpbmVSZ25fMz0KLQotT1NfQ29tbURsZ0V4dGVuZGVkRXJyb3I9Ci0KLU9TX0NvbW1hbmRCYXJfQWRkQWRvcm5tZW50cz0KLU9TX0NvbW1hbmRCYXJfQWRkQWRvcm5tZW50c18wPWNhc3Q9KEhXTkQpCi1PU19Db21tYW5kQmFyX0FkZEFkb3JubWVudHNfMT0KLU9TX0NvbW1hbmRCYXJfQWRkQWRvcm5tZW50c18yPQotCi1PU19Db21tYW5kQmFyX0NyZWF0ZT0KLU9TX0NvbW1hbmRCYXJfQ3JlYXRlXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfQ29tbWFuZEJhcl9DcmVhdGVfMT1jYXN0PShIV05EKQotT1NfQ29tbWFuZEJhcl9DcmVhdGVfMj0KLQotT1NfQ29tbWFuZEJhcl9EZXN0cm95PQotT1NfQ29tbWFuZEJhcl9EZXN0cm95XzA9Y2FzdD0oSFdORCkKLQotT1NfQ29tbWFuZEJhcl9EcmF3TWVudUJhcj0KLU9TX0NvbW1hbmRCYXJfRHJhd01lbnVCYXJfMD1jYXN0PShIV05EKQotT1NfQ29tbWFuZEJhcl9EcmF3TWVudUJhcl8xPWNhc3Q9KFdPUkQpCi0KLU9TX0NvbW1hbmRCYXJfSGVpZ2h0PQotT1NfQ29tbWFuZEJhcl9IZWlnaHRfMD1jYXN0PShIV05EKQotCi1PU19Db21tYW5kQmFyX0luc2VydE1lbnViYXJFeD0KLU9TX0NvbW1hbmRCYXJfSW5zZXJ0TWVudWJhckV4XzA9Y2FzdD0oSFdORCkKLU9TX0NvbW1hbmRCYXJfSW5zZXJ0TWVudWJhckV4XzE9Y2FzdD0oSElOU1RBTkNFKQotT1NfQ29tbWFuZEJhcl9JbnNlcnRNZW51YmFyRXhfMj1jYXN0PShMUFRTVFIpCi1PU19Db21tYW5kQmFyX0luc2VydE1lbnViYXJFeF8zPWNhc3Q9KFdPUkQpCi0KLU9TX0NvbW1hbmRCYXJfU2hvdz0KLU9TX0NvbW1hbmRCYXJfU2hvd18wPWNhc3Q9KEhXTkQpCi1PU19Db21tYW5kQmFyX1Nob3dfMT1jYXN0PShCT09MKQotCi1PU19Db3B5SW1hZ2U9Ci1PU19Db3B5SW1hZ2VfMD1jYXN0PShIQU5ETEUpCi1PU19Db3B5SW1hZ2VfMT0KLU9TX0NvcHlJbWFnZV8yPQotT1NfQ29weUltYWdlXzM9Ci1PU19Db3B5SW1hZ2VfND0KLQotT1NfQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZUE9Ci1PU19DcmVhdGVBY2NlbGVyYXRvclRhYmxlQV8wPWNhc3Q9KExQQUNDRUwpCi1PU19DcmVhdGVBY2NlbGVyYXRvclRhYmxlQV8xPQotCi1PU19DcmVhdGVBY2NlbGVyYXRvclRhYmxlVz0KLU9TX0NyZWF0ZUFjY2VsZXJhdG9yVGFibGVXXzA9Y2FzdD0oTFBBQ0NFTCkKLU9TX0NyZWF0ZUFjY2VsZXJhdG9yVGFibGVXXzE9Ci0KLU9TX0NyZWF0ZUJpdG1hcD0KLU9TX0NyZWF0ZUJpdG1hcF8wPQotT1NfQ3JlYXRlQml0bWFwXzE9Ci1PU19DcmVhdGVCaXRtYXBfMj0KLU9TX0NyZWF0ZUJpdG1hcF8zPQotT1NfQ3JlYXRlQml0bWFwXzQ9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfQ3JlYXRlQ2FyZXQ9Ci1PU19DcmVhdGVDYXJldF8wPWNhc3Q9KEhXTkQpCi1PU19DcmVhdGVDYXJldF8xPWNhc3Q9KEhCSVRNQVApCi1PU19DcmVhdGVDYXJldF8yPQotT1NfQ3JlYXRlQ2FyZXRfMz0KLQotT1NfQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcD0KLU9TX0NyZWF0ZUNvbXBhdGlibGVCaXRtYXBfMD1jYXN0PShIREMpCi1PU19DcmVhdGVDb21wYXRpYmxlQml0bWFwXzE9Ci1PU19DcmVhdGVDb21wYXRpYmxlQml0bWFwXzI9Ci0KLU9TX0NyZWF0ZUNvbXBhdGlibGVEQz0KLU9TX0NyZWF0ZUNvbXBhdGlibGVEQ18wPWNhc3Q9KEhEQykKLQotT1NfQ3JlYXRlQ3Vyc29yPQotT1NfQ3JlYXRlQ3Vyc29yXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfQ3JlYXRlQ3Vyc29yXzE9Ci1PU19DcmVhdGVDdXJzb3JfMj0KLU9TX0NyZWF0ZUN1cnNvcl8zPQotT1NfQ3JlYXRlQ3Vyc29yXzQ9Ci1PU19DcmVhdGVDdXJzb3JfNT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfQ3JlYXRlQ3Vyc29yXzY9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfQ3JlYXRlRENBPQotT1NfQ3JlYXRlRENBXzA9Y2FzdD0oTFBTVFIpCi1PU19DcmVhdGVEQ0FfMT1jYXN0PShMUFNUUikKLU9TX0NyZWF0ZURDQV8yPWNhc3Q9KExQU1RSKQotT1NfQ3JlYXRlRENBXzM9Y2FzdD0oQ09OU1QgREVWTU9ERSAqKQotCi1PU19DcmVhdGVEQ1c9Ci1PU19DcmVhdGVEQ1dfMD1jYXN0PShMUFdTVFIpCi1PU19DcmVhdGVEQ1dfMT1jYXN0PShMUFdTVFIpCi1PU19DcmVhdGVEQ1dfMj1jYXN0PShMUFdTVFIpCi1PU19DcmVhdGVEQ1dfMz1jYXN0PShDT05TVCBERVZNT0RFVyAqKQotCi1PU19DcmVhdGVESUJTZWN0aW9uPQotT1NfQ3JlYXRlRElCU2VjdGlvbl8wPWNhc3Q9KEhEQykKLU9TX0NyZWF0ZURJQlNlY3Rpb25fMT1jYXN0PShCSVRNQVBJTkZPICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfQ3JlYXRlRElCU2VjdGlvbl8yPQotT1NfQ3JlYXRlRElCU2VjdGlvbl8zPWNhc3Q9KFZPSUQgKiopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19DcmVhdGVESUJTZWN0aW9uXzQ9Y2FzdD0oSEFORExFKQotT1NfQ3JlYXRlRElCU2VjdGlvbl81PQotCi1PU19DcmVhdGVGb250SW5kaXJlY3RBX19JPQotT1NfQ3JlYXRlRm9udEluZGlyZWN0QV9fSV8wPWNhc3Q9KExQTE9HRk9OVEEpCi0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdEFfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMj0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdEFfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMl8wPWZsYWdzPW5vX291dAotCi1PU19DcmVhdGVGb250SW5kaXJlY3RXX19JPQotT1NfQ3JlYXRlRm9udEluZGlyZWN0V19fSV8wPWNhc3Q9KExQTE9HRk9OVFcpCi0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdFdfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMj0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdFdfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMl8wPWZsYWdzPW5vX291dAotCi1PU19DcmVhdGVJY29uSW5kaXJlY3Q9Ci1PU19DcmVhdGVJY29uSW5kaXJlY3RfMD1mbGFncz1ub19vdXQKLQotT1NfQ3JlYXRlTWVudT0KLQotT1NfQ3JlYXRlUGFsZXR0ZT0KLU9TX0NyZWF0ZVBhbGV0dGVfMD1jYXN0PShMT0dQQUxFVFRFICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotCi1PU19DcmVhdGVQYXR0ZXJuQnJ1c2g9Ci1PU19DcmVhdGVQYXR0ZXJuQnJ1c2hfMD1jYXN0PShIQklUTUFQKQotCi1PU19DcmVhdGVQZW49Ci1PU19DcmVhdGVQZW5fMD0KLU9TX0NyZWF0ZVBlbl8xPQotT1NfQ3JlYXRlUGVuXzI9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX0NyZWF0ZVBvbHlnb25SZ249Ci1PU19DcmVhdGVQb2x5Z29uUmduXzA9Y2FzdD0oQ09OU1QgUE9JTlQgKikKLU9TX0NyZWF0ZVBvbHlnb25SZ25fMT0KLU9TX0NyZWF0ZVBvbHlnb25SZ25fMj0KLQotT1NfQ3JlYXRlUG9wdXBNZW51PQotCi1PU19DcmVhdGVSZWN0UmduPQotT1NfQ3JlYXRlUmVjdFJnbl8wPQotT1NfQ3JlYXRlUmVjdFJnbl8xPQotT1NfQ3JlYXRlUmVjdFJnbl8yPQotT1NfQ3JlYXRlUmVjdFJnbl8zPQotCi1PU19DcmVhdGVTb2xpZEJydXNoPQotT1NfQ3JlYXRlU29saWRCcnVzaF8wPWNhc3Q9KENPTE9SUkVGKQotCi1PU19DcmVhdGVTdHJlYW1PbkhHbG9iYWw9Ci1PU19DcmVhdGVTdHJlYW1PbkhHbG9iYWxfMD1jYXN0PUhHTE9CQUwKLU9TX0NyZWF0ZVN0cmVhbU9uSEdsb2JhbF8xPWNhc3Q9Qk9PTAotT1NfQ3JlYXRlU3RyZWFtT25IR2xvYmFsXzI9Y2FzdD1MUFNUUkVBTSAqCi0KLU9TX0NyZWF0ZVdpbmRvd0V4QT0KLU9TX0NyZWF0ZVdpbmRvd0V4QV8wPQotT1NfQ3JlYXRlV2luZG93RXhBXzE9Y2FzdD0oTFBTVFIpCi1PU19DcmVhdGVXaW5kb3dFeEFfMj0KLU9TX0NyZWF0ZVdpbmRvd0V4QV8zPQotT1NfQ3JlYXRlV2luZG93RXhBXzQ9Ci1PU19DcmVhdGVXaW5kb3dFeEFfNT0KLU9TX0NyZWF0ZVdpbmRvd0V4QV82PQotT1NfQ3JlYXRlV2luZG93RXhBXzc9Ci1PU19DcmVhdGVXaW5kb3dFeEFfOD1jYXN0PShIV05EKQotT1NfQ3JlYXRlV2luZG93RXhBXzk9Y2FzdD0oSE1FTlUpCi1PU19DcmVhdGVXaW5kb3dFeEFfMTA9Y2FzdD0oSElOU1RBTkNFKQotT1NfQ3JlYXRlV2luZG93RXhBXzExPQotCi1PU19DcmVhdGVXaW5kb3dFeFc9Ci1PU19DcmVhdGVXaW5kb3dFeFdfMD0KLU9TX0NyZWF0ZVdpbmRvd0V4V18xPWNhc3Q9KExQV1NUUikKLU9TX0NyZWF0ZVdpbmRvd0V4V18yPWNhc3Q9KExQV1NUUikKLU9TX0NyZWF0ZVdpbmRvd0V4V18zPQotT1NfQ3JlYXRlV2luZG93RXhXXzQ9Ci1PU19DcmVhdGVXaW5kb3dFeFdfNT0KLU9TX0NyZWF0ZVdpbmRvd0V4V182PQotT1NfQ3JlYXRlV2luZG93RXhXXzc9Ci1PU19DcmVhdGVXaW5kb3dFeFdfOD1jYXN0PShIV05EKQotT1NfQ3JlYXRlV2luZG93RXhXXzk9Y2FzdD0oSE1FTlUpCi1PU19DcmVhdGVXaW5kb3dFeFdfMTA9Y2FzdD0oSElOU1RBTkNFKQotT1NfQ3JlYXRlV2luZG93RXhXXzExPQotCi1PU19EZWZGcmFtZVByb2NBPQotT1NfRGVmRnJhbWVQcm9jQV8wPWNhc3Q9KEhXTkQpCi1PU19EZWZGcmFtZVByb2NBXzE9Y2FzdD0oSFdORCkKLU9TX0RlZkZyYW1lUHJvY0FfMj0KLU9TX0RlZkZyYW1lUHJvY0FfMz1jYXN0PShXUEFSQU0pCi1PU19EZWZGcmFtZVByb2NBXzQ9Y2FzdD0oTFBBUkFNKQotCi1PU19EZWZGcmFtZVByb2NXPQotT1NfRGVmRnJhbWVQcm9jV18wPWNhc3Q9KEhXTkQpCi1PU19EZWZGcmFtZVByb2NXXzE9Y2FzdD0oSFdORCkKLU9TX0RlZkZyYW1lUHJvY1dfMj0KLU9TX0RlZkZyYW1lUHJvY1dfMz1jYXN0PShXUEFSQU0pCi1PU19EZWZGcmFtZVByb2NXXzQ9Y2FzdD0oTFBBUkFNKQotCi1PU19EZWZNRElDaGlsZFByb2NBPQotT1NfRGVmTURJQ2hpbGRQcm9jQV8wPWNhc3Q9KEhXTkQpCi1PU19EZWZNRElDaGlsZFByb2NBXzE9Ci1PU19EZWZNRElDaGlsZFByb2NBXzI9Y2FzdD0oV1BBUkFNKQotT1NfRGVmTURJQ2hpbGRQcm9jQV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfRGVmTURJQ2hpbGRQcm9jVz0KLU9TX0RlZk1ESUNoaWxkUHJvY1dfMD1jYXN0PShIV05EKQotT1NfRGVmTURJQ2hpbGRQcm9jV18xPQotT1NfRGVmTURJQ2hpbGRQcm9jV18yPWNhc3Q9KFdQQVJBTSkKLU9TX0RlZk1ESUNoaWxkUHJvY1dfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0RlZldpbmRvd1Byb2NBPQotT1NfRGVmV2luZG93UHJvY0FfMD1jYXN0PShIV05EKQotT1NfRGVmV2luZG93UHJvY0FfMT0KLU9TX0RlZldpbmRvd1Byb2NBXzI9Y2FzdD0oV1BBUkFNKQotT1NfRGVmV2luZG93UHJvY0FfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0RlZldpbmRvd1Byb2NXPQotT1NfRGVmV2luZG93UHJvY1dfMD1jYXN0PShIV05EKQotT1NfRGVmV2luZG93UHJvY1dfMT0KLU9TX0RlZldpbmRvd1Byb2NXXzI9Y2FzdD0oV1BBUkFNKQotT1NfRGVmV2luZG93UHJvY1dfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0RlZmVyV2luZG93UG9zPQotT1NfRGVmZXJXaW5kb3dQb3NfMD1jYXN0PShIRFdQKQotT1NfRGVmZXJXaW5kb3dQb3NfMT1jYXN0PShIV05EKQotT1NfRGVmZXJXaW5kb3dQb3NfMj1jYXN0PShIV05EKQotT1NfRGVmZXJXaW5kb3dQb3NfMz0KLU9TX0RlZmVyV2luZG93UG9zXzQ9Ci1PU19EZWZlcldpbmRvd1Bvc181PQotT1NfRGVmZXJXaW5kb3dQb3NfNj0KLU9TX0RlZmVyV2luZG93UG9zXzc9Ci0KLU9TX0RlbGV0ZURDPQotT1NfRGVsZXRlRENfMD1jYXN0PShIREMpCi0KLU9TX0RlbGV0ZU1lbnU9Ci1PU19EZWxldGVNZW51XzA9Y2FzdD0oSE1FTlUpCi1PU19EZWxldGVNZW51XzE9Ci1PU19EZWxldGVNZW51XzI9Ci0KLU9TX0RlbGV0ZU9iamVjdD0KLU9TX0RlbGV0ZU9iamVjdF8wPWNhc3Q9KEhHRElPQkopCi0KLU9TX0Rlc3Ryb3lBY2NlbGVyYXRvclRhYmxlPQotT1NfRGVzdHJveUFjY2VsZXJhdG9yVGFibGVfMD1jYXN0PShIQUNDRUwpCi0KLU9TX0Rlc3Ryb3lDYXJldD0KLQotT1NfRGVzdHJveUN1cnNvcj0KLU9TX0Rlc3Ryb3lDdXJzb3JfMD1jYXN0PShIQ1VSU09SKQotCi1PU19EZXN0cm95SWNvbj0KLU9TX0Rlc3Ryb3lJY29uXzA9Y2FzdD0oSElDT04pCi0KLU9TX0Rlc3Ryb3lNZW51PQotT1NfRGVzdHJveU1lbnVfMD1jYXN0PShITUVOVSkKLQotT1NfRGVzdHJveVdpbmRvdz0KLU9TX0Rlc3Ryb3lXaW5kb3dfMD1jYXN0PShIV05EKQotCi1PU19EaXNwYXRjaE1lc3NhZ2VBPQotT1NfRGlzcGF0Y2hNZXNzYWdlQV8wPQotCi1PU19EaXNwYXRjaE1lc3NhZ2VXPQotT1NfRGlzcGF0Y2hNZXNzYWdlV18wPQotCi1PU19EcmFnRGV0ZWN0PQotT1NfRHJhZ0RldGVjdF8wPWNhc3Q9KEhXTkQpCi1PU19EcmFnRGV0ZWN0XzE9ZmxhZ3M9c3RydWN0Ci0KLU9TX0RyYWdGaW5pc2g9Ci1PU19EcmFnRmluaXNoXzA9Y2FzdD0oSERST1ApCi0KLU9TX0RyYWdRdWVyeUZpbGVBPQotT1NfRHJhZ1F1ZXJ5RmlsZUFfMD1jYXN0PShIRFJPUCkKLU9TX0RyYWdRdWVyeUZpbGVBXzE9Ci1PU19EcmFnUXVlcnlGaWxlQV8yPWNhc3Q9KExQVFNUUikKLU9TX0RyYWdRdWVyeUZpbGVBXzM9Ci0KLU9TX0RyYWdRdWVyeUZpbGVXPQotT1NfRHJhZ1F1ZXJ5RmlsZVdfMD1jYXN0PShIRFJPUCkKLU9TX0RyYWdRdWVyeUZpbGVXXzE9Ci1PU19EcmFnUXVlcnlGaWxlV18yPWNhc3Q9KExQV1NUUikKLU9TX0RyYWdRdWVyeUZpbGVXXzM9Ci0KLU9TX0RyYXdFZGdlPQotT1NfRHJhd0VkZ2VfMD1jYXN0PShIREMpCi1PU19EcmF3RWRnZV8xPQotT1NfRHJhd0VkZ2VfMj0KLU9TX0RyYXdFZGdlXzM9Ci0KLU9TX0RyYXdGb2N1c1JlY3Q9Ci1PU19EcmF3Rm9jdXNSZWN0XzA9Y2FzdD0oSERDKQotT1NfRHJhd0ZvY3VzUmVjdF8xPQotCi1PU19EcmF3RnJhbWVDb250cm9sPQotT1NfRHJhd0ZyYW1lQ29udHJvbF8wPWNhc3Q9KEhEQykKLU9TX0RyYXdGcmFtZUNvbnRyb2xfMT0KLU9TX0RyYXdGcmFtZUNvbnRyb2xfMj0KLU9TX0RyYXdGcmFtZUNvbnRyb2xfMz0KLQotT1NfRHJhd0ljb25FeD0KLU9TX0RyYXdJY29uRXhfMD1jYXN0PShIREMpCi1PU19EcmF3SWNvbkV4XzE9Ci1PU19EcmF3SWNvbkV4XzI9Ci1PU19EcmF3SWNvbkV4XzM9Y2FzdD0oSElDT04pCi1PU19EcmF3SWNvbkV4XzQ9Ci1PU19EcmF3SWNvbkV4XzU9Ci1PU19EcmF3SWNvbkV4XzY9Ci1PU19EcmF3SWNvbkV4Xzc9Y2FzdD0oSEJSVVNIKQotT1NfRHJhd0ljb25FeF84PQotCi1PU19EcmF3TWVudUJhcj0KLU9TX0RyYXdNZW51QmFyXzA9Y2FzdD0oSFdORCkKLQotT1NfRHJhd1N0YXRlQT0KLU9TX0RyYXdTdGF0ZUFfMD1jYXN0PShIREMpCi1PU19EcmF3U3RhdGVBXzE9Y2FzdD0oSEJSVVNIKQotT1NfRHJhd1N0YXRlQV8yPWNhc3Q9KERSQVdTVEFURVBST0MpCi1PU19EcmF3U3RhdGVBXzM9Y2FzdD0oTFBBUkFNKQotT1NfRHJhd1N0YXRlQV80PWNhc3Q9KFdQQVJBTSkKLU9TX0RyYXdTdGF0ZUFfNT0KLU9TX0RyYXdTdGF0ZUFfNj0KLU9TX0RyYXdTdGF0ZUFfNz0KLU9TX0RyYXdTdGF0ZUFfOD0KLU9TX0RyYXdTdGF0ZUFfOT0KLQotT1NfRHJhd1N0YXRlVz0KLU9TX0RyYXdTdGF0ZVdfMD1jYXN0PShIREMpCi1PU19EcmF3U3RhdGVXXzE9Y2FzdD0oSEJSVVNIKQotT1NfRHJhd1N0YXRlV18yPWNhc3Q9KERSQVdTVEFURVBST0MpCi1PU19EcmF3U3RhdGVXXzM9Y2FzdD0oTFBBUkFNKQotT1NfRHJhd1N0YXRlV180PWNhc3Q9KFdQQVJBTSkKLU9TX0RyYXdTdGF0ZVdfNT0KLU9TX0RyYXdTdGF0ZVdfNj0KLU9TX0RyYXdTdGF0ZVdfNz0KLU9TX0RyYXdTdGF0ZVdfOD0KLU9TX0RyYXdTdGF0ZVdfOT0KLQotT1NfRHJhd1RleHRBPQotT1NfRHJhd1RleHRBXzA9Y2FzdD0oSERDKQotT1NfRHJhd1RleHRBXzE9Y2FzdD0oTFBTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfRHJhd1RleHRBXzI9Ci1PU19EcmF3VGV4dEFfMz0KLU9TX0RyYXdUZXh0QV80PQotCi1PU19EcmF3VGV4dFc9Ci1PU19EcmF3VGV4dFdfMD1jYXN0PShIREMpCi1PU19EcmF3VGV4dFdfMT1jYXN0PShMUFdTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfRHJhd1RleHRXXzI9Ci1PU19EcmF3VGV4dFdfMz0KLU9TX0RyYXdUZXh0V180PQotCi1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kPWZsYWdzPWR5bmFtaWMKLU9TX0RyYXdUaGVtZUJhY2tncm91bmRfMD1jYXN0PUhUSEVNRQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF8xPWNhc3Q9SERDCi1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzI9Ci1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzM9Ci1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzQ9Y2FzdD1jb25zdCBSRUNUICoKLU9TX0RyYXdUaGVtZUJhY2tncm91bmRfNT1jYXN0PWNvbnN0IFJFQ1QgKgotCi1PU19FbGxpcHNlPQotT1NfRWxsaXBzZV8wPWNhc3Q9KEhEQykKLU9TX0VsbGlwc2VfMT0KLU9TX0VsbGlwc2VfMj0KLU9TX0VsbGlwc2VfMz0KLU9TX0VsbGlwc2VfND0KLQotT1NfRW5hYmxlTWVudUl0ZW09Ci1PU19FbmFibGVNZW51SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfRW5hYmxlTWVudUl0ZW1fMT0KLU9TX0VuYWJsZU1lbnVJdGVtXzI9Ci0KLU9TX0VuYWJsZVNjcm9sbEJhcj0KLU9TX0VuYWJsZVNjcm9sbEJhcl8wPWNhc3Q9KEhXTkQpCi1PU19FbmFibGVTY3JvbGxCYXJfMT0KLU9TX0VuYWJsZVNjcm9sbEJhcl8yPQotCi1PU19FbmFibGVXaW5kb3c9Ci1PU19FbmFibGVXaW5kb3dfMD1jYXN0PShIV05EKQotT1NfRW5hYmxlV2luZG93XzE9Ci0KLU9TX0VuZERlZmVyV2luZG93UG9zPQotT1NfRW5kRGVmZXJXaW5kb3dQb3NfMD1jYXN0PShIRFdQKQotCi1PU19FbmREb2M9Ci1PU19FbmREb2NfMD1jYXN0PShIREMpCi0KLU9TX0VuZFBhZ2U9Ci1PU19FbmRQYWdlXzA9Y2FzdD0oSERDKQotCi1PU19FbmRQYWludD0KLU9TX0VuZFBhaW50XzA9Y2FzdD0oSFdORCkKLU9TX0VuZFBhaW50XzE9Ci0KLU9TX0VuZFBhdGg9Ci1PU19FbmRQYXRoXzA9Y2FzdD0oSERDKQotCi1PU19FbnVtRGlzcGxheU1vbml0b3JzPWZsYWdzPWR5bmFtaWMKLU9TX0VudW1EaXNwbGF5TW9uaXRvcnNfMD1jYXN0PShIREMpCi1PU19FbnVtRGlzcGxheU1vbml0b3JzXzE9Y2FzdD0oTFBDUkVDVCkKLU9TX0VudW1EaXNwbGF5TW9uaXRvcnNfMj1jYXN0PShNT05JVE9SRU5VTVBST0MpCi1PU19FbnVtRGlzcGxheU1vbml0b3JzXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19FbnVtRm9udEZhbWlsaWVzQT0KLU9TX0VudW1Gb250RmFtaWxpZXNBXzA9Y2FzdD0oSERDKQotT1NfRW51bUZvbnRGYW1pbGllc0FfMT1jYXN0PShMUFNUUikKLU9TX0VudW1Gb250RmFtaWxpZXNBXzI9Y2FzdD0oRk9OVEVOVU1QUk9DKQotT1NfRW51bUZvbnRGYW1pbGllc0FfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0VudW1Gb250RmFtaWxpZXNFeEE9Ci1PU19FbnVtRm9udEZhbWlsaWVzRXhBXzA9Y2FzdD1IREMKLU9TX0VudW1Gb250RmFtaWxpZXNFeEFfMT1jYXN0PUxQTE9HRk9OVEEKLU9TX0VudW1Gb250RmFtaWxpZXNFeEFfMj1jYXN0PShGT05URU5VTVBST0NBKQotT1NfRW51bUZvbnRGYW1pbGllc0V4QV8zPWNhc3Q9KExQQVJBTSkKLU9TX0VudW1Gb250RmFtaWxpZXNFeEFfND0KLQotT1NfRW51bUZvbnRGYW1pbGllc0V4Vz0KLU9TX0VudW1Gb250RmFtaWxpZXNFeFdfMD1jYXN0PUhEQwotT1NfRW51bUZvbnRGYW1pbGllc0V4V18xPWNhc3Q9TFBMT0dGT05UVwotT1NfRW51bUZvbnRGYW1pbGllc0V4V18yPWNhc3Q9Rk9OVEVOVU1QUk9DVwotT1NfRW51bUZvbnRGYW1pbGllc0V4V18zPWNhc3Q9TFBBUkFNCi1PU19FbnVtRm9udEZhbWlsaWVzRXhXXzQ9Ci0KLU9TX0VudW1Gb250RmFtaWxpZXNXPQotT1NfRW51bUZvbnRGYW1pbGllc1dfMD1jYXN0PShIREMpCi1PU19FbnVtRm9udEZhbWlsaWVzV18xPWNhc3Q9KExQQ1dTVFIpCi1PU19FbnVtRm9udEZhbWlsaWVzV18yPWNhc3Q9KEZPTlRFTlVNUFJPQ1cpCi1PU19FbnVtRm9udEZhbWlsaWVzV18zPWNhc3Q9KExQQVJBTSkKLQotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzQT1mbGFncz1keW5hbWljCi1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNBXzA9Y2FzdD0oTEFOR1VBR0VHUk9VUF9FTlVNUFJPQ0EpCi1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNBXzE9Ci1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNBXzI9Y2FzdD0oTE9OR19QVFIpCi0KLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc1c9ZmxhZ3M9ZHluYW1pYwotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzV18wPWNhc3Q9KExBTkdVQUdFR1JPVVBfRU5VTVBST0NXKQotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzV18xPQotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzV18yPWNhc3Q9KExPTkdfUFRSKQotCi1PU19FbnVtU3lzdGVtTG9jYWxlc0E9Ci1PU19FbnVtU3lzdGVtTG9jYWxlc0FfMD1jYXN0PShMT0NBTEVfRU5VTVBST0NBKQotT1NfRW51bVN5c3RlbUxvY2FsZXNBXzE9Ci0KLU9TX0VudW1TeXN0ZW1Mb2NhbGVzVz0KLU9TX0VudW1TeXN0ZW1Mb2NhbGVzV18wPWNhc3Q9KExPQ0FMRV9FTlVNUFJPQ1cpCi1PU19FbnVtU3lzdGVtTG9jYWxlc1dfMT0KLQotT1NfRXF1YWxSZWN0PQotT1NfRXF1YWxSZWN0XzA9Y2FzdD0oQ09OU1QgUkVDVCAqKSxmbGFncz1ub19vdXQKLU9TX0VxdWFsUmVjdF8xPWNhc3Q9KENPTlNUIFJFQ1QgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX0VxdWFsUmduPQotT1NfRXF1YWxSZ25fMD1jYXN0PShIUkdOKQotT1NfRXF1YWxSZ25fMT1jYXN0PShIUkdOKQotCi1PU19FeGNsdWRlQ2xpcFJlY3Q9Ci1PU19FeGNsdWRlQ2xpcFJlY3RfMD1jYXN0PUhEQwotT1NfRXhjbHVkZUNsaXBSZWN0XzE9Ci1PU19FeGNsdWRlQ2xpcFJlY3RfMj0KLU9TX0V4Y2x1ZGVDbGlwUmVjdF8zPQotT1NfRXhjbHVkZUNsaXBSZWN0XzQ9Ci0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc0E9Ci1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NBXzA9Ci1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NBXzE9Ci1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NBXzI9Ci0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc1c9Ci1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXXzA9Ci1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXXzE9Ci1PU19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXXzI9Ci0KLU9TX0V4dENyZWF0ZVBlbj0KLU9TX0V4dENyZWF0ZVBlbl8wPQotT1NfRXh0Q3JlYXRlUGVuXzE9Ci1PU19FeHRDcmVhdGVQZW5fMj1jYXN0PUNPTlNUIExPR0JSVVNIICoKLU9TX0V4dENyZWF0ZVBlbl8zPQotT1NfRXh0Q3JlYXRlUGVuXzQ9Y2FzdD1DT05TVCBEV09SRCAqCi0KLU9TX0V4dENyZWF0ZVJlZ2lvbj0KLU9TX0V4dENyZWF0ZVJlZ2lvbl8wPWNhc3Q9WEZPUk0gKgotT1NfRXh0Q3JlYXRlUmVnaW9uXzE9Ci1PU19FeHRDcmVhdGVSZWdpb25fMj1jYXN0PUNPTlNUIFJHTkRBVEEgKgotCi1PU19FeHRUZXh0T3V0QT0KLU9TX0V4dFRleHRPdXRBXzA9Y2FzdD0oSERDKQotT1NfRXh0VGV4dE91dEFfMT0KLU9TX0V4dFRleHRPdXRBXzI9Ci1PU19FeHRUZXh0T3V0QV8zPQotT1NfRXh0VGV4dE91dEFfND1mbGFncz1ub19vdXQKLU9TX0V4dFRleHRPdXRBXzU9Y2FzdD0oTFBTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfRXh0VGV4dE91dEFfNj0KLU9TX0V4dFRleHRPdXRBXzc9Y2FzdD0oQ09OU1QgSU5UICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotCi1PU19FeHRUZXh0T3V0Vz0KLU9TX0V4dFRleHRPdXRXXzA9Y2FzdD0oSERDKQotT1NfRXh0VGV4dE91dFdfMT0KLU9TX0V4dFRleHRPdXRXXzI9Ci1PU19FeHRUZXh0T3V0V18zPQotT1NfRXh0VGV4dE91dFdfND1mbGFncz1ub19vdXQKLU9TX0V4dFRleHRPdXRXXzU9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0V4dFRleHRPdXRXXzY9Ci1PU19FeHRUZXh0T3V0V183PWNhc3Q9KENPTlNUIElOVCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfRXh0cmFjdEljb25FeEE9Ci1PU19FeHRyYWN0SWNvbkV4QV8wPWNhc3Q9KExQU1RSKQotT1NfRXh0cmFjdEljb25FeEFfMT0KLU9TX0V4dHJhY3RJY29uRXhBXzI9Y2FzdD0oSElDT04gRkFSICopCi1PU19FeHRyYWN0SWNvbkV4QV8zPWNhc3Q9KEhJQ09OIEZBUiAqKQotT1NfRXh0cmFjdEljb25FeEFfND0KLQotT1NfRXh0cmFjdEljb25FeFc9Ci1PU19FeHRyYWN0SWNvbkV4V18wPWNhc3Q9KExQV1NUUikKLU9TX0V4dHJhY3RJY29uRXhXXzE9Ci1PU19FeHRyYWN0SWNvbkV4V18yPWNhc3Q9KEhJQ09OIEZBUiAqKQotT1NfRXh0cmFjdEljb25FeFdfMz1jYXN0PShISUNPTiBGQVIgKikKLU9TX0V4dHJhY3RJY29uRXhXXzQ9Ci0KLU9TX0ZpbGxQYXRoPQotT1NfRmlsbFBhdGhfMD1jYXN0PShIREMpCi0KLU9TX0ZpbGxSZWN0PQotT1NfRmlsbFJlY3RfMD1jYXN0PShIREMpCi1PU19GaWxsUmVjdF8xPWZsYWdzPW5vX291dAotT1NfRmlsbFJlY3RfMj1jYXN0PShIQlJVU0gpCi0KLU9TX0ZpbmRXaW5kb3dBPQotT1NfRmluZFdpbmRvd0FfMD1jYXN0PShMUFNUUikKLU9TX0ZpbmRXaW5kb3dBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0ZpbmRXaW5kb3dXPQotT1NfRmluZFdpbmRvd1dfMD1jYXN0PShMUFdTVFIpCi1PU19GaW5kV2luZG93V18xPWNhc3Q9KExQV1NUUikKLQotT1NfRm9ybWF0TWVzc2FnZUE9Ci1PU19Gb3JtYXRNZXNzYWdlQV8wPQotT1NfRm9ybWF0TWVzc2FnZUFfMT1jYXN0PUxQQ1ZPSUQKLU9TX0Zvcm1hdE1lc3NhZ2VBXzI9Ci1PU19Gb3JtYXRNZXNzYWdlQV8zPQotT1NfRm9ybWF0TWVzc2FnZUFfND1jYXN0PUxQU1RSCi1PU19Gb3JtYXRNZXNzYWdlQV81PQotT1NfRm9ybWF0TWVzc2FnZUFfNj1jYXN0PXZhX2xpc3QqCi0KLU9TX0Zvcm1hdE1lc3NhZ2VXPQotT1NfRm9ybWF0TWVzc2FnZVdfMD0KLU9TX0Zvcm1hdE1lc3NhZ2VXXzE9Y2FzdD1MUENWT0lECi1PU19Gb3JtYXRNZXNzYWdlV18yPQotT1NfRm9ybWF0TWVzc2FnZVdfMz0KLU9TX0Zvcm1hdE1lc3NhZ2VXXzQ9Y2FzdD1MUFdTVFIKLU9TX0Zvcm1hdE1lc3NhZ2VXXzU9Ci1PU19Gb3JtYXRNZXNzYWdlV182PWNhc3Q9dmFfbGlzdCoKLQotT1NfRnJlZUxpYnJhcnk9Ci1PU19GcmVlTGlicmFyeV8wPWNhc3Q9KEhNT0RVTEUpCi0KLU9TX0dkaVNldEJhdGNoTGltaXQ9Ci1PU19HZGlTZXRCYXRjaExpbWl0XzA9Y2FzdD1EV09SRAotCi1PU19HZXRBQ1A9Ci0KLU9TX0dldEFjdGl2ZVdpbmRvdz0KLQotT1NfR2V0QmtDb2xvcj0KLU9TX0dldEJrQ29sb3JfMD1jYXN0PShIREMpCi0KLU9TX0dldENhcHR1cmU9Ci0KLU9TX0dldENhcmV0UG9zPQotT1NfR2V0Q2FyZXRQb3NfMD0KLQotT1NfR2V0Q2hhckFCQ1dpZHRoc0E9Ci1PU19HZXRDaGFyQUJDV2lkdGhzQV8wPWNhc3Q9KEhEQykKLU9TX0dldENoYXJBQkNXaWR0aHNBXzE9Ci1PU19HZXRDaGFyQUJDV2lkdGhzQV8yPQotT1NfR2V0Q2hhckFCQ1dpZHRoc0FfMz1jYXN0PShMUEFCQyksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0Q2hhckFCQ1dpZHRoc1c9Ci1PU19HZXRDaGFyQUJDV2lkdGhzV18wPWNhc3Q9KEhEQykKLU9TX0dldENoYXJBQkNXaWR0aHNXXzE9Ci1PU19HZXRDaGFyQUJDV2lkdGhzV18yPQotT1NfR2V0Q2hhckFCQ1dpZHRoc1dfMz1jYXN0PShMUEFCQyksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0Q2hhcldpZHRoQT0KLU9TX0dldENoYXJXaWR0aEFfMD1jYXN0PShIREMpCi1PU19HZXRDaGFyV2lkdGhBXzE9Ci1PU19HZXRDaGFyV2lkdGhBXzI9Ci1PU19HZXRDaGFyV2lkdGhBXzM9Y2FzdD0oTFBJTlQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldENoYXJXaWR0aFc9Ci1PU19HZXRDaGFyV2lkdGhXXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2hhcldpZHRoV18xPQotT1NfR2V0Q2hhcldpZHRoV18yPQotT1NfR2V0Q2hhcldpZHRoV18zPWNhc3Q9KExQSU5UKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBPQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QV8wPWNhc3Q9KEhEQykKLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEFfMT1jYXN0PShMUFNUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBXzI9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBXzM9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBXzQ9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBXzU9Ci0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFc9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50V18xPWNhc3Q9KExQV1NUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXXzI9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXXzM9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXXzQ9Y2FzdD0oTFBHQ1BfUkVTVUxUU1cpCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXXzU9Ci0KLU9TX0dldENsYXNzSW5mb0E9Ci1PU19HZXRDbGFzc0luZm9BXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfR2V0Q2xhc3NJbmZvQV8xPWNhc3Q9KExQU1RSKQotT1NfR2V0Q2xhc3NJbmZvQV8yPQotCi1PU19HZXRDbGFzc0luZm9XPQotT1NfR2V0Q2xhc3NJbmZvV18wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0dldENsYXNzSW5mb1dfMT1jYXN0PShMUFdTVFIpCi1PU19HZXRDbGFzc0luZm9XXzI9Y2FzdD0oTFBXTkRDTEFTU1cpCi0KLU9TX0dldENsYXNzTmFtZUE9Ci1PU19HZXRDbGFzc05hbWVBXzA9Y2FzdD1IV05ECi1PU19HZXRDbGFzc05hbWVBXzE9Ci1PU19HZXRDbGFzc05hbWVBXzI9Ci0KLU9TX0dldENsYXNzTmFtZVc9Ci1PU19HZXRDbGFzc05hbWVXXzA9Y2FzdD1IV05ECi1PU19HZXRDbGFzc05hbWVXXzE9Ci1PU19HZXRDbGFzc05hbWVXXzI9Ci0KLU9TX0dldENsaWVudFJlY3Q9Ci1PU19HZXRDbGllbnRSZWN0XzA9Y2FzdD0oSFdORCkKLU9TX0dldENsaWVudFJlY3RfMT0KLQotT1NfR2V0Q2xpcEJveD0KLU9TX0dldENsaXBCb3hfMD1jYXN0PShIREMpCi1PU19HZXRDbGlwQm94XzE9Ci0KLU9TX0dldENsaXBSZ249Ci1PU19HZXRDbGlwUmduXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2xpcFJnbl8xPWNhc3Q9KEhSR04pCi0KLU9TX0dldENsaXBib2FyZERhdGE9Ci1PU19HZXRDbGlwYm9hcmREYXRhXzA9Ci0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVBPQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUFfMD0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVBXzE9Ci1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lQV8yPQotCi1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lVz0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVXXzA9Ci1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lV18xPWNhc3Q9KExQV1NUUikKLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVXXzI9Ci0KLU9TX0dldENvbWJvQm94SW5mbz1mbGFncz1keW5hbWljCi1PU19HZXRDb21ib0JveEluZm9fMD1jYXN0PShIV05EKQotT1NfR2V0Q29tYm9Cb3hJbmZvXzE9Ci0KLU9TX0dldEN1cnJlbnRPYmplY3Q9Ci1PU19HZXRDdXJyZW50T2JqZWN0XzA9Y2FzdD0oSERDKQotT1NfR2V0Q3VycmVudE9iamVjdF8xPQotCi1PU19HZXRDdXJyZW50UHJvY2Vzc0lkPQotCi1PU19HZXRDdXJyZW50VGhyZWFkSWQ9Ci0KLU9TX0dldEN1cnNvcj0KLQotT1NfR2V0Q3Vyc29yUG9zPQotT1NfR2V0Q3Vyc29yUG9zXzA9Ci0KLU9TX0dldERDPQotT1NfR2V0RENfMD1jYXN0PShIV05EKQotCi1PU19HZXREQ0V4PQotT1NfR2V0RENFeF8wPWNhc3Q9KEhXTkQpCi1PU19HZXREQ0V4XzE9Y2FzdD0oSFJHTikKLU9TX0dldERDRXhfMj0KLQotT1NfR2V0RElCQ29sb3JUYWJsZT0KLU9TX0dldERJQkNvbG9yVGFibGVfMD1jYXN0PShIREMpCi1PU19HZXRESUJDb2xvclRhYmxlXzE9Ci1PU19HZXRESUJDb2xvclRhYmxlXzI9Ci1PU19HZXRESUJDb2xvclRhYmxlXzM9Y2FzdD0oUkdCUVVBRCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRESUJpdHM9Ci1PU19HZXRESUJpdHNfMD1jYXN0PShIREMpCi1PU19HZXRESUJpdHNfMT1jYXN0PShIQklUTUFQKQotT1NfR2V0RElCaXRzXzI9Ci1PU19HZXRESUJpdHNfMz0KLU9TX0dldERJQml0c180PWNhc3Q9KExQVk9JRCkKLU9TX0dldERJQml0c181PWNhc3Q9KExQQklUTUFQSU5GTyksZmxhZ3M9Y3JpdGljYWwKLU9TX0dldERJQml0c182PQotCi1PU19HZXREZXNrdG9wV2luZG93PQotCi1PU19HZXREZXZpY2VDYXBzPQotT1NfR2V0RGV2aWNlQ2Fwc18wPWNhc3Q9KEhEQykKLU9TX0dldERldmljZUNhcHNfMT0KLQotT1NfR2V0RGlhbG9nQmFzZVVuaXRzPQotCi1PU19HZXREbGdJdGVtPQotT1NfR2V0RGxnSXRlbV8wPWNhc3Q9KEhXTkQpCi1PU19HZXREbGdJdGVtXzE9Ci0KLU9TX0dldERvdWJsZUNsaWNrVGltZT0KLQotT1NfR2V0Rm9jdXM9Ci0KLU9TX0dldEZvbnRMYW5ndWFnZUluZm89Ci1PU19HZXRGb250TGFuZ3VhZ2VJbmZvXzA9Y2FzdD0oSERDKQotCi1PU19HZXRGb3JlZ3JvdW5kV2luZG93PQotCi1PU19HZXRHVUlUaHJlYWRJbmZvPQotT1NfR2V0R1VJVGhyZWFkSW5mb18wPWNhc3Q9KERXT1JEKQotT1NfR2V0R1VJVGhyZWFkSW5mb18xPWNhc3Q9KExQR1VJVEhSRUFESU5GTykKLQotT1NfR2V0SWNvbkluZm89Ci1PU19HZXRJY29uSW5mb18wPWNhc3Q9KEhJQ09OKQotT1NfR2V0SWNvbkluZm9fMT1mbGFncz1ub19pbgotCi1PU19HZXRLZXlOYW1lVGV4dEE9Ci1PU19HZXRLZXlOYW1lVGV4dEFfMD0KLU9TX0dldEtleU5hbWVUZXh0QV8xPWNhc3Q9KExQU1RSKQotT1NfR2V0S2V5TmFtZVRleHRBXzI9Ci0KLU9TX0dldEtleU5hbWVUZXh0Vz0KLU9TX0dldEtleU5hbWVUZXh0V18wPQotT1NfR2V0S2V5TmFtZVRleHRXXzE9Y2FzdD0oTFBXU1RSKQotT1NfR2V0S2V5TmFtZVRleHRXXzI9Ci0KLU9TX0dldEtleVN0YXRlPQotT1NfR2V0S2V5U3RhdGVfMD0KLQotT1NfR2V0S2V5Ym9hcmRMYXlvdXQ9Ci1PU19HZXRLZXlib2FyZExheW91dF8wPQotCi1PU19HZXRLZXlib2FyZExheW91dExpc3Q9Ci1PU19HZXRLZXlib2FyZExheW91dExpc3RfMD0KLU9TX0dldEtleWJvYXJkTGF5b3V0TGlzdF8xPWNhc3Q9KEhLTCBGQVIgKikKLQotT1NfR2V0S2V5Ym9hcmRTdGF0ZT0KLU9TX0dldEtleWJvYXJkU3RhdGVfMD1jYXN0PShQQllURSkKLQotT1NfR2V0TGFzdEFjdGl2ZVBvcHVwPQotT1NfR2V0TGFzdEFjdGl2ZVBvcHVwXzA9Y2FzdD0oSFdORCkKLQotT1NfR2V0TGFzdEVycm9yPQotCi1PU19HZXRMYXlvdXQ9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0TGF5b3V0XzA9Y2FzdD0oSERDKQotCi1PU19HZXRMaWJyYXJ5SGFuZGxlPWZsYWdzPW5vX2dlbgotCi1PU19HZXRMb2NhbGVJbmZvQT0KLU9TX0dldExvY2FsZUluZm9BXzA9Ci1PU19HZXRMb2NhbGVJbmZvQV8xPQotT1NfR2V0TG9jYWxlSW5mb0FfMj1jYXN0PShMUFNUUikKLU9TX0dldExvY2FsZUluZm9BXzM9Ci0KLU9TX0dldExvY2FsZUluZm9XPQotT1NfR2V0TG9jYWxlSW5mb1dfMD0KLU9TX0dldExvY2FsZUluZm9XXzE9Ci1PU19HZXRMb2NhbGVJbmZvV18yPWNhc3Q9KExQV1NUUikKLU9TX0dldExvY2FsZUluZm9XXzM9Ci0KLU9TX0dldE1lbnU9Ci1PU19HZXRNZW51XzA9Y2FzdD0oSFdORCkKLQotT1NfR2V0TWVudUJhckluZm89ZmxhZ3M9ZHluYW1pYwotT1NfR2V0TWVudUJhckluZm9fMD0KLU9TX0dldE1lbnVCYXJJbmZvXzE9Ci1PU19HZXRNZW51QmFySW5mb18yPQotT1NfR2V0TWVudUJhckluZm9fMz0KLQotT1NfR2V0TWVudURlZmF1bHRJdGVtPQotT1NfR2V0TWVudURlZmF1bHRJdGVtXzA9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51RGVmYXVsdEl0ZW1fMT0KLU9TX0dldE1lbnVEZWZhdWx0SXRlbV8yPQotCi1PU19HZXRNZW51SW5mbz1mbGFncz1keW5hbWljCi1PU19HZXRNZW51SW5mb18wPWNhc3Q9KEhNRU5VKQotT1NfR2V0TWVudUluZm9fMT0KLQotT1NfR2V0TWVudUl0ZW1Db3VudD0KLU9TX0dldE1lbnVJdGVtQ291bnRfMD1jYXN0PShITUVOVSkKLQotT1NfR2V0TWVudUl0ZW1JbmZvQT0KLU9TX0dldE1lbnVJdGVtSW5mb0FfMD1jYXN0PShITUVOVSkKLU9TX0dldE1lbnVJdGVtSW5mb0FfMT0KLU9TX0dldE1lbnVJdGVtSW5mb0FfMj0KLU9TX0dldE1lbnVJdGVtSW5mb0FfMz0KLQotT1NfR2V0TWVudUl0ZW1JbmZvVz0KLU9TX0dldE1lbnVJdGVtSW5mb1dfMD1jYXN0PShITUVOVSkKLU9TX0dldE1lbnVJdGVtSW5mb1dfMT0KLU9TX0dldE1lbnVJdGVtSW5mb1dfMj0KLU9TX0dldE1lbnVJdGVtSW5mb1dfMz1jYXN0PShMUE1FTlVJVEVNSU5GT1cpCi0KLU9TX0dldE1lbnVJdGVtUmVjdD0KLU9TX0dldE1lbnVJdGVtUmVjdF8wPWNhc3Q9KEhXTkQpCi1PU19HZXRNZW51SXRlbVJlY3RfMT1jYXN0PShITUVOVSkKLU9TX0dldE1lbnVJdGVtUmVjdF8yPQotT1NfR2V0TWVudUl0ZW1SZWN0XzM9Ci0KLU9TX0dldE1lc3NhZ2VBPQotT1NfR2V0TWVzc2FnZUFfMD0KLU9TX0dldE1lc3NhZ2VBXzE9Y2FzdD0oSFdORCkKLU9TX0dldE1lc3NhZ2VBXzI9Ci1PU19HZXRNZXNzYWdlQV8zPQotCi1PU19HZXRNZXNzYWdlUG9zPQotCi1PU19HZXRNZXNzYWdlVGltZT0KLQotT1NfR2V0TWVzc2FnZVc9Ci1PU19HZXRNZXNzYWdlV18wPQotT1NfR2V0TWVzc2FnZVdfMT1jYXN0PShIV05EKQotT1NfR2V0TWVzc2FnZVdfMj0KLU9TX0dldE1lc3NhZ2VXXzM9Ci0KLU9TX0dldE1ldGFSZ249Ci1PU19HZXRNZXRhUmduXzA9Y2FzdD1IREMKLU9TX0dldE1ldGFSZ25fMT1jYXN0PUhSR04KLQotT1NfR2V0TW9kdWxlSGFuZGxlQT0KLU9TX0dldE1vZHVsZUhhbmRsZUFfMD1jYXN0PShMUFNUUikKLQotT1NfR2V0TW9kdWxlSGFuZGxlVz0KLU9TX0dldE1vZHVsZUhhbmRsZVdfMD1jYXN0PShMUFdTVFIpCi0KLU9TX0dldE1vbml0b3JJbmZvQT1mbGFncz1keW5hbWljCi1PU19HZXRNb25pdG9ySW5mb0FfMD1jYXN0PShITU9OSVRPUikKLU9TX0dldE1vbml0b3JJbmZvQV8xPWNhc3Q9KExQTU9OSVRPUklORk8pCi0KLU9TX0dldE1vbml0b3JJbmZvVz1mbGFncz1keW5hbWljCi1PU19HZXRNb25pdG9ySW5mb1dfMD1jYXN0PShITU9OSVRPUikKLU9TX0dldE1vbml0b3JJbmZvV18xPWNhc3Q9KExQTU9OSVRPUklORk8pCi0KLU9TX0dldE5lYXJlc3RQYWxldHRlSW5kZXg9Ci1PU19HZXROZWFyZXN0UGFsZXR0ZUluZGV4XzA9Y2FzdD0oSFBBTEVUVEUpCi1PU19HZXROZWFyZXN0UGFsZXR0ZUluZGV4XzE9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX0dldE9iamVjdEFfX0lJST0KLU9TX0dldE9iamVjdEFfX0lJSV8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUlfMT0KLU9TX0dldE9iamVjdEFfX0lJSV8yPWNhc3Q9TFBWT0lELGZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMj0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzJfMT0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzI9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzJfMT0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzI9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yXzE9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMj0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yXzE9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8yPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJfMT0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMl8xPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlJPQotT1NfR2V0T2JqZWN0V19fSUlJXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJSV8xPQotT1NfR2V0T2JqZWN0V19fSUlJXzI9Y2FzdD1MUFZPSUQsZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMl8xPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMj0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMl8xPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMj0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJfMT0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzJfMT0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzI9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMl8xPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzI9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yXzE9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPcGVuRmlsZU5hbWVBPQotT1NfR2V0T3BlbkZpbGVOYW1lQV8wPQotCi1PU19HZXRPcGVuRmlsZU5hbWVXPQotT1NfR2V0T3BlbkZpbGVOYW1lV18wPWNhc3Q9KExQT1BFTkZJTEVOQU1FVykKLQotT1NfR2V0UGFsZXR0ZUVudHJpZXM9Ci1PU19HZXRQYWxldHRlRW50cmllc18wPWNhc3Q9KEhQQUxFVFRFKQotT1NfR2V0UGFsZXR0ZUVudHJpZXNfMT0KLU9TX0dldFBhbGV0dGVFbnRyaWVzXzI9Ci1PU19HZXRQYWxldHRlRW50cmllc18zPWNhc3Q9KExQUEFMRVRURUVOVFJZKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRQYXJlbnQ9Ci1PU19HZXRQYXJlbnRfMD1jYXN0PShIV05EKQotCi1PU19HZXRQaXhlbD0KLU9TX0dldFBpeGVsXzA9Y2FzdD0oSERDKQotT1NfR2V0UGl4ZWxfMT0KLU9TX0dldFBpeGVsXzI9Ci0KLU9TX0dldFBvbHlGaWxsTW9kZT0KLU9TX0dldFBvbHlGaWxsTW9kZV8wPWNhc3Q9SERDCi0KLU9TX0dldFByb2NBZGRyZXNzPQotT1NfR2V0UHJvY0FkZHJlc3NfMD1jYXN0PShITU9EVUxFKQotT1NfR2V0UHJvY0FkZHJlc3NfMT1jYXN0PShMUENUU1RSKQotCi1PU19HZXRQcm9jZXNzSGVhcD0KLQotT1NfR2V0UHJvZmlsZVN0cmluZ0E9Ci1PU19HZXRQcm9maWxlU3RyaW5nQV8wPWNhc3Q9KExQU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ0FfMT1jYXN0PShMUFNUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdBXzI9Y2FzdD0oTFBTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nQV8zPWNhc3Q9KExQU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ0FfND0KLQotT1NfR2V0UHJvZmlsZVN0cmluZ1c9Ci1PU19HZXRQcm9maWxlU3RyaW5nV18wPWNhc3Q9KExQV1NUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdXXzE9Y2FzdD0oTFBXU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ1dfMj1jYXN0PShMUFdTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nV18zPWNhc3Q9KExQV1NUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdXXzQ9Ci0KLU9TX0dldFByb3BBPQotT1NfR2V0UHJvcEFfMD1jYXN0PUhXTkQKLU9TX0dldFByb3BBXzE9Y2FzdD1MUENUU1RSCi0KLU9TX0dldFByb3BXPQotT1NfR2V0UHJvcFdfMD1jYXN0PUhXTkQKLU9TX0dldFByb3BXXzE9Y2FzdD0oTFBDV1NUUikKLQotT1NfR2V0Uk9QMj0KLU9TX0dldFJPUDJfMD1jYXN0PShIREMpCi0KLU9TX0dldFJhbmRvbVJnbj0KLU9TX0dldFJhbmRvbVJnbl8wPWNhc3Q9SERDCi1PU19HZXRSYW5kb21SZ25fMT1jYXN0PUhSR04KLU9TX0dldFJhbmRvbVJnbl8yPQotCi1PU19HZXRSZWdpb25EYXRhPQotT1NfR2V0UmVnaW9uRGF0YV8wPWNhc3Q9KEhSR04pCi1PU19HZXRSZWdpb25EYXRhXzE9Ci1PU19HZXRSZWdpb25EYXRhXzI9Y2FzdD0oUkdOREFUQSAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRSZ25Cb3g9Ci1PU19HZXRSZ25Cb3hfMD1jYXN0PShIUkdOKQotT1NfR2V0UmduQm94XzE9ZmxhZ3M9bm9faW4KLQotT1NfR2V0U2F2ZUZpbGVOYW1lQT0KLU9TX0dldFNhdmVGaWxlTmFtZUFfMD0KLQotT1NfR2V0U2F2ZUZpbGVOYW1lVz0KLU9TX0dldFNhdmVGaWxlTmFtZVdfMD1jYXN0PShMUE9QRU5GSUxFTkFNRVcpCi0KLU9TX0dldFNjcm9sbEluZm89Ci1PU19HZXRTY3JvbGxJbmZvXzA9Y2FzdD0oSFdORCkKLU9TX0dldFNjcm9sbEluZm9fMT0KLU9TX0dldFNjcm9sbEluZm9fMj0KLQotT1NfR2V0U3RvY2tPYmplY3Q9Ci1PU19HZXRTdG9ja09iamVjdF8wPQotCi1PU19HZXRTeXNDb2xvcj0KLU9TX0dldFN5c0NvbG9yXzA9Ci0KLU9TX0dldFN5c0NvbG9yQnJ1c2g9Ci1PU19HZXRTeXNDb2xvckJydXNoXzA9Ci0KLU9TX0dldFN5c3RlbURlZmF1bHRVSUxhbmd1YWdlPWZsYWdzPWR5bmFtaWMKLQotT1NfR2V0U3lzdGVtTWVudT0KLU9TX0dldFN5c3RlbU1lbnVfMD1jYXN0PShIV05EKQotT1NfR2V0U3lzdGVtTWVudV8xPQotCi1PU19HZXRTeXN0ZW1NZXRyaWNzPQotT1NfR2V0U3lzdGVtTWV0cmljc18wPQotCi1PU19HZXRTeXN0ZW1QYWxldHRlRW50cmllcz0KLU9TX0dldFN5c3RlbVBhbGV0dGVFbnRyaWVzXzA9Y2FzdD0oSERDKQotT1NfR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXNfMT1jYXN0PShVSU5UKQotT1NfR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXNfMj1jYXN0PShVSU5UKQotT1NfR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXNfMz1jYXN0PShMUFBBTEVUVEVFTlRSWSksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0VGV4dENoYXJzZXQ9Ci1PU19HZXRUZXh0Q2hhcnNldF8wPWNhc3Q9KEhEQykKLQotT1NfR2V0VGV4dENvbG9yPQotT1NfR2V0VGV4dENvbG9yXzA9Y2FzdD0oSERDKQotCi1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMkE9Ci1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMkFfMD1jYXN0PShIREMpCi1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMkFfMT1jYXN0PShMUFNUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMkFfMj0KLU9TX0dldFRleHRFeHRlbnRQb2ludDMyQV8zPWZsYWdzPW5vX2luCi0KLU9TX0dldFRleHRFeHRlbnRQb2ludDMyVz0KLU9TX0dldFRleHRFeHRlbnRQb2ludDMyV18wPWNhc3Q9KEhEQykKLU9TX0dldFRleHRFeHRlbnRQb2ludDMyV18xPWNhc3Q9KExQV1NUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19HZXRUZXh0RXh0ZW50UG9pbnQzMldfMj0KLU9TX0dldFRleHRFeHRlbnRQb2ludDMyV18zPWZsYWdzPW5vX2luCi0KLU9TX0dldFRleHRNZXRyaWNzQT0KLU9TX0dldFRleHRNZXRyaWNzQV8wPWNhc3Q9KEhEQykKLU9TX0dldFRleHRNZXRyaWNzQV8xPWZsYWdzPW5vX2luCi0KLU9TX0dldFRleHRNZXRyaWNzVz0KLU9TX0dldFRleHRNZXRyaWNzV18wPWNhc3Q9KEhEQykKLU9TX0dldFRleHRNZXRyaWNzV18xPWZsYWdzPW5vX2luCi0KLU9TX0dldFRpY2tDb3VudD0KLQotT1NfR2V0VXBkYXRlUmVjdD0KLU9TX0dldFVwZGF0ZVJlY3RfMD1jYXN0PShIV05EKQotT1NfR2V0VXBkYXRlUmVjdF8xPWNhc3Q9KExQUkVDVCkKLU9TX0dldFVwZGF0ZVJlY3RfMj1jYXN0PShCT09MKQotCi1PU19HZXRVcGRhdGVSZ249Ci1PU19HZXRVcGRhdGVSZ25fMD1jYXN0PShIV05EKQotT1NfR2V0VXBkYXRlUmduXzE9Y2FzdD0oSFJHTikKLU9TX0dldFVwZGF0ZVJnbl8yPQotCi1PU19HZXRWZXJzaW9uRXhBPQotT1NfR2V0VmVyc2lvbkV4QV8wPQotCi1PU19HZXRWZXJzaW9uRXhXPQotT1NfR2V0VmVyc2lvbkV4V18wPQotCi1PU19HZXRXaW5kb3c9Ci1PU19HZXRXaW5kb3dfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93XzE9Ci0KLU9TX0dldFdpbmRvd0RDPQotT1NfR2V0V2luZG93RENfMD1jYXN0PUhXTkQKLQotT1NfR2V0V2luZG93TG9uZ0E9Ci1PU19HZXRXaW5kb3dMb25nQV8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dMb25nQV8xPQotCi1PU19HZXRXaW5kb3dMb25nVz0KLU9TX0dldFdpbmRvd0xvbmdXXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd0xvbmdXXzE9Ci0KLU9TX0dldFdpbmRvd09yZ0V4PQotT1NfR2V0V2luZG93T3JnRXhfMD1jYXN0PUhEQwotT1NfR2V0V2luZG93T3JnRXhfMT0KLQotT1NfR2V0V2luZG93UGxhY2VtZW50PQotT1NfR2V0V2luZG93UGxhY2VtZW50XzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd1BsYWNlbWVudF8xPQotCi1PU19HZXRXaW5kb3dSZWN0PQotT1NfR2V0V2luZG93UmVjdF8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dSZWN0XzE9Ci0KLU9TX0dldFdpbmRvd1Jnbj0KLU9TX0dldFdpbmRvd1Jnbl8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dSZ25fMT1jYXN0PShIUkdOKQotCi1PU19HZXRXaW5kb3dUZXh0QT0KLU9TX0dldFdpbmRvd1RleHRBXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd1RleHRBXzE9Y2FzdD0oTFBTVFIpCi1PU19HZXRXaW5kb3dUZXh0QV8yPQotCi1PU19HZXRXaW5kb3dUZXh0TGVuZ3RoQT0KLU9TX0dldFdpbmRvd1RleHRMZW5ndGhBXzA9Y2FzdD0oSFdORCkKLQotT1NfR2V0V2luZG93VGV4dExlbmd0aFc9Ci1PU19HZXRXaW5kb3dUZXh0TGVuZ3RoV18wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldFdpbmRvd1RleHRXPQotT1NfR2V0V2luZG93VGV4dFdfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93VGV4dFdfMT1jYXN0PShMUFdTVFIpCi1PU19HZXRXaW5kb3dUZXh0V18yPQotCi1PU19HZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQ9Ci1PU19HZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWRfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkXzE9Y2FzdD0oTFBEV09SRCkKLQotT1NfR2V0V29ybGRUcmFuc2Zvcm09Ci1PU19HZXRXb3JsZFRyYW5zZm9ybV8wPWNhc3Q9SERDCi1PU19HZXRXb3JsZFRyYW5zZm9ybV8xPWNhc3Q9TFBYRk9STQotCi1PU19HbG9iYWxBZGRBdG9tQT0KLU9TX0dsb2JhbEFkZEF0b21BXzA9Y2FzdD1MUENUU1RSCi0KLU9TX0dsb2JhbEFkZEF0b21XPQotT1NfR2xvYmFsQWRkQXRvbVdfMD1jYXN0PShMUENXU1RSKQotCi1PU19HbG9iYWxBbGxvYz0KLU9TX0dsb2JhbEFsbG9jXzA9Ci1PU19HbG9iYWxBbGxvY18xPQotCi1PU19HbG9iYWxGcmVlPQotT1NfR2xvYmFsRnJlZV8wPWNhc3Q9KEhBTkRMRSkKLQotT1NfR2xvYmFsTG9jaz0KLU9TX0dsb2JhbExvY2tfMD1jYXN0PShIQU5ETEUpCi0KLU9TX0dsb2JhbFNpemU9Ci1PU19HbG9iYWxTaXplXzA9Y2FzdD0oSEFORExFKQotCi1PU19HbG9iYWxVbmxvY2s9Ci1PU19HbG9iYWxVbmxvY2tfMD1jYXN0PShIQU5ETEUpCi0KLU9TX0dyYWRpZW50RmlsbD1mbGFncz1keW5hbWljCi1PU19HcmFkaWVudEZpbGxfMD1jYXN0PShIREMpCi1PU19HcmFkaWVudEZpbGxfMT1jYXN0PShQVFJJVkVSVEVYKQotT1NfR3JhZGllbnRGaWxsXzI9Y2FzdD0oVUxPTkcpCi1PU19HcmFkaWVudEZpbGxfMz1jYXN0PShQVk9JRCkKLU9TX0dyYWRpZW50RmlsbF80PWNhc3Q9KFVMT05HKQotT1NfR3JhZGllbnRGaWxsXzU9Y2FzdD0oVUxPTkcpCi0KLU9TX0hlYXBBbGxvYz0KLU9TX0hlYXBBbGxvY18wPWNhc3Q9KEhBTkRMRSkKLU9TX0hlYXBBbGxvY18xPQotT1NfSGVhcEFsbG9jXzI9Ci0KLU9TX0hlYXBGcmVlPQotT1NfSGVhcEZyZWVfMD1jYXN0PShIQU5ETEUpCi1PU19IZWFwRnJlZV8xPQotT1NfSGVhcEZyZWVfMj1jYXN0PShMUFZPSUQpCi0KLU9TX0hpZGVDYXJldD0KLU9TX0hpZGVDYXJldF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0lJREZyb21TdHJpbmc9Ci1PU19JSURGcm9tU3RyaW5nXzA9Y2FzdD1MUE9MRVNUUgotT1NfSUlERnJvbVN0cmluZ18xPWNhc3Q9TFBJSUQKLQotT1NfSW1hZ2VMaXN0X0FkZD0KLU9TX0ltYWdlTGlzdF9BZGRfMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X0FkZF8xPWNhc3Q9KEhCSVRNQVApCi1PU19JbWFnZUxpc3RfQWRkXzI9Y2FzdD0oSEJJVE1BUCkKLQotT1NfSW1hZ2VMaXN0X0FkZE1hc2tlZD0KLU9TX0ltYWdlTGlzdF9BZGRNYXNrZWRfMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X0FkZE1hc2tlZF8xPWNhc3Q9KEhCSVRNQVApCi1PU19JbWFnZUxpc3RfQWRkTWFza2VkXzI9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX0ltYWdlTGlzdF9DcmVhdGU9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzA9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzE9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzI9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzM9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzQ9Ci0KLU9TX0ltYWdlTGlzdF9EZXN0cm95PQotT1NfSW1hZ2VMaXN0X0Rlc3Ryb3lfMD1jYXN0PShISU1BR0VMSVNUKQotCi1PU19JbWFnZUxpc3RfR2V0SWNvbj0KLU9TX0ltYWdlTGlzdF9HZXRJY29uXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9HZXRJY29uXzE9Ci1PU19JbWFnZUxpc3RfR2V0SWNvbl8yPQotCi1PU19JbWFnZUxpc3RfR2V0SWNvblNpemU9Ci1PU19JbWFnZUxpc3RfR2V0SWNvblNpemVfMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X0dldEljb25TaXplXzE9Ci1PU19JbWFnZUxpc3RfR2V0SWNvblNpemVfMj0KLQotT1NfSW1hZ2VMaXN0X0dldEltYWdlQ291bnQ9Ci1PU19JbWFnZUxpc3RfR2V0SW1hZ2VDb3VudF8wPWNhc3Q9KEhJTUFHRUxJU1QpCi0KLU9TX0ltYWdlTGlzdF9SZW1vdmU9Ci1PU19JbWFnZUxpc3RfUmVtb3ZlXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9SZW1vdmVfMT0KLQotT1NfSW1hZ2VMaXN0X1JlcGxhY2U9Ci1PU19JbWFnZUxpc3RfUmVwbGFjZV8wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfUmVwbGFjZV8xPQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VfMj1jYXN0PShIQklUTUFQKQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VfMz1jYXN0PShIQklUTUFQKQotCi1PU19JbWFnZUxpc3RfUmVwbGFjZUljb249Ci1PU19JbWFnZUxpc3RfUmVwbGFjZUljb25fMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VJY29uXzE9Ci1PU19JbWFnZUxpc3RfUmVwbGFjZUljb25fMj1jYXN0PShISUNPTikKLQotT1NfSW1hZ2VMaXN0X1NldEljb25TaXplPQotT1NfSW1hZ2VMaXN0X1NldEljb25TaXplXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9TZXRJY29uU2l6ZV8xPQotT1NfSW1hZ2VMaXN0X1NldEljb25TaXplXzI9Ci0KLU9TX0ltbUFzc29jaWF0ZUNvbnRleHQ9Ci1PU19JbW1Bc3NvY2lhdGVDb250ZXh0XzA9Y2FzdD0oSFdORCkKLU9TX0ltbUFzc29jaWF0ZUNvbnRleHRfMT1jYXN0PShISU1DKQotCi1PU19JbW1DcmVhdGVDb250ZXh0PQotCi1PU19JbW1EZXN0cm95Q29udGV4dD0KLU9TX0ltbURlc3Ryb3lDb250ZXh0XzA9Y2FzdD0oSElNQykKLQotT1NfSW1tRGlzYWJsZVRleHRGcmFtZVNlcnZpY2U9ZmxhZ3M9ZHluYW1pYwotT1NfSW1tRGlzYWJsZVRleHRGcmFtZVNlcnZpY2VfMD0KLQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250QT0KLU9TX0ltbUdldENvbXBvc2l0aW9uRm9udEFfMD1jYXN0PShISU1DKQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250QV8xPQotCi1PU19JbW1HZXRDb21wb3NpdGlvbkZvbnRXPQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250V18wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb21wb3NpdGlvbkZvbnRXXzE9Ci0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQT0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQV8wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ0FfMT0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQV8yPWNhc3Q9KExQU1RSKQotT1NfSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdBXzM9Ci0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nVz0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nV18wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ1dfMT0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nV18yPWNhc3Q9KExQV1NUUikKLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nV18zPQotCi1PU19JbW1HZXRDb250ZXh0PQotT1NfSW1tR2V0Q29udGV4dF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0ltbUdldENvbnZlcnNpb25TdGF0dXM9Ci1PU19JbW1HZXRDb252ZXJzaW9uU3RhdHVzXzA9Y2FzdD0oSElNQykKLU9TX0ltbUdldENvbnZlcnNpb25TdGF0dXNfMT0KLU9TX0ltbUdldENvbnZlcnNpb25TdGF0dXNfMj0KLQotT1NfSW1tR2V0RGVmYXVsdElNRVduZD0KLU9TX0ltbUdldERlZmF1bHRJTUVXbmRfMD1jYXN0PShIV05EKQotCi1PU19JbW1HZXRPcGVuU3RhdHVzPQotT1NfSW1tR2V0T3BlblN0YXR1c18wPWNhc3Q9KEhJTUMpCi0KLU9TX0ltbVJlbGVhc2VDb250ZXh0PQotT1NfSW1tUmVsZWFzZUNvbnRleHRfMD1jYXN0PShIV05EKQotT1NfSW1tUmVsZWFzZUNvbnRleHRfMT1jYXN0PShISU1DKQotCi1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRBPQotT1NfSW1tU2V0Q29tcG9zaXRpb25Gb250QV8wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRBXzE9Ci0KLU9TX0ltbVNldENvbXBvc2l0aW9uRm9udFc9Ci1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRXXzA9Y2FzdD0oSElNQykKLU9TX0ltbVNldENvbXBvc2l0aW9uRm9udFdfMT0KLQotT1NfSW1tU2V0Q29tcG9zaXRpb25XaW5kb3c9Ci1PU19JbW1TZXRDb21wb3NpdGlvbldpbmRvd18wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb21wb3NpdGlvbldpbmRvd18xPQotCi1PU19JbW1TZXRDb252ZXJzaW9uU3RhdHVzPQotT1NfSW1tU2V0Q29udmVyc2lvblN0YXR1c18wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb252ZXJzaW9uU3RhdHVzXzE9Ci1PU19JbW1TZXRDb252ZXJzaW9uU3RhdHVzXzI9Ci0KLU9TX0ltbVNldE9wZW5TdGF0dXM9Ci1PU19JbW1TZXRPcGVuU3RhdHVzXzA9Y2FzdD0oSElNQykKLU9TX0ltbVNldE9wZW5TdGF0dXNfMT0KLQotT1NfSW5pdENvbW1vbkNvbnRyb2xzPQotCi1PU19Jbml0Q29tbW9uQ29udHJvbHNFeD0KLU9TX0luaXRDb21tb25Db250cm9sc0V4XzA9Ci0KLU9TX0luc2VydE1lbnVBPQotT1NfSW5zZXJ0TWVudUFfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVBXzE9Ci1PU19JbnNlcnRNZW51QV8yPQotT1NfSW5zZXJ0TWVudUFfMz0KLU9TX0luc2VydE1lbnVBXzQ9Ci0KLU9TX0luc2VydE1lbnVJdGVtQT0KLU9TX0luc2VydE1lbnVJdGVtQV8wPWNhc3Q9KEhNRU5VKQotT1NfSW5zZXJ0TWVudUl0ZW1BXzE9Ci1PU19JbnNlcnRNZW51SXRlbUFfMj0KLU9TX0luc2VydE1lbnVJdGVtQV8zPQotCi1PU19JbnNlcnRNZW51SXRlbVc9Ci1PU19JbnNlcnRNZW51SXRlbVdfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVJdGVtV18xPQotT1NfSW5zZXJ0TWVudUl0ZW1XXzI9Ci1PU19JbnNlcnRNZW51SXRlbVdfMz1jYXN0PShMUE1FTlVJVEVNSU5GT1cpCi0KLU9TX0luc2VydE1lbnVXPQotT1NfSW5zZXJ0TWVudVdfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVXXzE9Ci1PU19JbnNlcnRNZW51V18yPQotT1NfSW5zZXJ0TWVudVdfMz0KLU9TX0luc2VydE1lbnVXXzQ9Ci0KLU9TX0ludGVybmV0U2V0T3B0aW9uPQotT1NfSW50ZXJuZXRTZXRPcHRpb25fMD1jYXN0PShISU5URVJORVQpCi1PU19JbnRlcm5ldFNldE9wdGlvbl8xPQotT1NfSW50ZXJuZXRTZXRPcHRpb25fMj1jYXN0PShMUFZPSUQpCi1PU19JbnRlcm5ldFNldE9wdGlvbl8zPQotCi1PU19JbnRlcnNlY3RDbGlwUmVjdD0KLU9TX0ludGVyc2VjdENsaXBSZWN0XzA9Y2FzdD1IREMKLU9TX0ludGVyc2VjdENsaXBSZWN0XzE9Ci1PU19JbnRlcnNlY3RDbGlwUmVjdF8yPQotT1NfSW50ZXJzZWN0Q2xpcFJlY3RfMz0KLU9TX0ludGVyc2VjdENsaXBSZWN0XzQ9Ci0KLU9TX0ludGVyc2VjdFJlY3Q9Ci1PU19JbnRlcnNlY3RSZWN0XzA9ZmxhZ3M9bm9faW4KLU9TX0ludGVyc2VjdFJlY3RfMT1mbGFncz1ub19vdXQKLU9TX0ludGVyc2VjdFJlY3RfMj1mbGFncz1ub19vdXQKLQotT1NfSW52YWxpZGF0ZVJlY3Q9Ci1PU19JbnZhbGlkYXRlUmVjdF8wPWNhc3Q9KEhXTkQpCi1PU19JbnZhbGlkYXRlUmVjdF8xPQotT1NfSW52YWxpZGF0ZVJlY3RfMj0KLQotT1NfSW52YWxpZGF0ZVJnbj0KLU9TX0ludmFsaWRhdGVSZ25fMD1jYXN0PShIV05EKQotT1NfSW52YWxpZGF0ZVJnbl8xPWNhc3Q9KEhSR04pCi1PU19JbnZhbGlkYXRlUmduXzI9Ci0KLU9TX0lzQXBwVGhlbWVkPWZsYWdzPWR5bmFtaWMKLQotT1NfSXNEQkNTTGVhZEJ5dGU9Ci1PU19Jc0RCQ1NMZWFkQnl0ZV8wPQotCi1PU19Jc0h1bmdBcHBXaW5kb3c9ZmxhZ3M9ZHluYW1pYwotT1NfSXNIdW5nQXBwV2luZG93XzA9Y2FzdD1IV05ECi0KLU9TX0lzSWNvbmljPQotT1NfSXNJY29uaWNfMD1jYXN0PShIV05EKQotCi1PU19Jc1BQQz1mbGFncz1ub19nZW4KLQotT1NfSXNTUD1mbGFncz1ub19nZW4KLQotT1NfSXNXaW5kb3dFbmFibGVkPQotT1NfSXNXaW5kb3dFbmFibGVkXzA9Y2FzdD0oSFdORCkKLQotT1NfSXNXaW5kb3dWaXNpYmxlPQotT1NfSXNXaW5kb3dWaXNpYmxlXzA9Y2FzdD0oSFdORCkKLQotT1NfSXNab29tZWQ9Ci1PU19Jc1pvb21lZF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0tpbGxUaW1lcj0KLU9TX0tpbGxUaW1lcl8wPWNhc3Q9KEhXTkQpCi1PU19LaWxsVGltZXJfMT0KLQotT1NfTGluZVRvPQotT1NfTGluZVRvXzA9Y2FzdD0oSERDKQotT1NfTGluZVRvXzE9Ci1PU19MaW5lVG9fMj0KLQotT1NfTG9hZEJpdG1hcEE9Ci1PU19Mb2FkQml0bWFwQV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRCaXRtYXBBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRCaXRtYXBXPQotT1NfTG9hZEJpdG1hcFdfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkQml0bWFwV18xPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZEN1cnNvckE9Ci1PU19Mb2FkQ3Vyc29yQV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRDdXJzb3JBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRDdXJzb3JXPQotT1NfTG9hZEN1cnNvcldfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkQ3Vyc29yV18xPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZEljb25BPQotT1NfTG9hZEljb25BXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEljb25BXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRJY29uVz0KLU9TX0xvYWRJY29uV18wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJY29uV18xPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZEltYWdlQV9fSUlJSUlJPQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzE9Y2FzdD0oTFBTVFIpCi1PU19Mb2FkSW1hZ2VBX19JSUlJSUlfMj0KLU9TX0xvYWRJbWFnZUFfX0lJSUlJSV8zPQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzQ9Ci1PU19Mb2FkSW1hZ2VBX19JSUlJSUlfNT0KLQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUk9Ci1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJbWFnZUFfX0lfM0JJSUlJXzE9Y2FzdD0oTFBTVFIpCi1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV8yPQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUlfMz0KLU9TX0xvYWRJbWFnZUFfX0lfM0JJSUlJXzQ9Ci1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV81PQotCi1PU19Mb2FkSW1hZ2VXX19JSUlJSUk9Ci1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMT1jYXN0PShMUFdTVFIpCi1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMj0KLU9TX0xvYWRJbWFnZVdfX0lJSUlJSV8zPQotT1NfTG9hZEltYWdlV19fSUlJSUlJXzQ9Ci1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfNT0KLQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUk9Ci1PU19Mb2FkSW1hZ2VXX19JXzNDSUlJSV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJXzE9Y2FzdD0oTFBXU1RSKQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUlfMj0KLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJXzM9Ci1PU19Mb2FkSW1hZ2VXX19JXzNDSUlJSV80PQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUlfNT0KLQotT1NfTG9hZExpYnJhcnlBPQotT1NfTG9hZExpYnJhcnlBXzA9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRMaWJyYXJ5Vz0KLU9TX0xvYWRMaWJyYXJ5V18wPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZFN0cmluZ0E9Ci1PU19Mb2FkU3RyaW5nQV8wPWNhc3Q9SElOU1RBTkNFCi1PU19Mb2FkU3RyaW5nQV8xPQotT1NfTG9hZFN0cmluZ0FfMj1jYXN0PUxQU1RSCi1PU19Mb2FkU3RyaW5nQV8zPQotCi1PU19Mb2FkU3RyaW5nVz0KLU9TX0xvYWRTdHJpbmdXXzA9Y2FzdD1ISU5TVEFOQ0UKLU9TX0xvYWRTdHJpbmdXXzE9Ci1PU19Mb2FkU3RyaW5nV18yPWNhc3Q9TFBXU1RSCi1PU19Mb2FkU3RyaW5nV18zPQotCi1PU19Mb2NhbEZyZWU9Ci1PU19Mb2NhbEZyZWVfMD1jYXN0PUhMT0NBTAotCi1PU19NYXBWaXJ0dWFsS2V5QT0KLU9TX01hcFZpcnR1YWxLZXlBXzA9Ci1PU19NYXBWaXJ0dWFsS2V5QV8xPQotCi1PU19NYXBWaXJ0dWFsS2V5Vz0KLU9TX01hcFZpcnR1YWxLZXlXXzA9Ci1PU19NYXBWaXJ0dWFsS2V5V18xPQotCi1PU19NYXBXaW5kb3dQb2ludHNfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8yST0KLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJXzA9Y2FzdD0oSFdORCkKLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJXzE9Y2FzdD0oSFdORCkKLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJXzI9Y2FzdD0oTFBQT0lOVCkKLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJXzM9Ci0KLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkk9Ci1PU19NYXBXaW5kb3dQb2ludHNfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzA9Y2FzdD0oSFdORCkKLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMT1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8yPWNhc3Q9KExQUE9JTlQpCi1PU19NYXBXaW5kb3dQb2ludHNfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzM9Ci0KLU9TX01lc3NhZ2VCZWVwPQotT1NfTWVzc2FnZUJlZXBfMD0KLQotT1NfTWVzc2FnZUJveEE9Ci1PU19NZXNzYWdlQm94QV8wPWNhc3Q9KEhXTkQpCi1PU19NZXNzYWdlQm94QV8xPWNhc3Q9KExQU1RSKQotT1NfTWVzc2FnZUJveEFfMj1jYXN0PShMUFNUUikKLU9TX01lc3NhZ2VCb3hBXzM9Ci0KLU9TX01lc3NhZ2VCb3hXPQotT1NfTWVzc2FnZUJveFdfMD1jYXN0PShIV05EKQotT1NfTWVzc2FnZUJveFdfMT1jYXN0PShMUFdTVFIpCi1PU19NZXNzYWdlQm94V18yPWNhc3Q9KExQV1NUUikKLU9TX01lc3NhZ2VCb3hXXzM9Ci0KLU9TX01vbml0b3JGcm9tV2luZG93PWZsYWdzPWR5bmFtaWMKLU9TX01vbml0b3JGcm9tV2luZG93XzA9Ci1PU19Nb25pdG9yRnJvbVdpbmRvd18xPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUk9QRklMRVNfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUk9QRklMRVNfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUk9QRklMRVNfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfR1JBRElFTlRfMVJFQ1RfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfR1JBRElFTlRfMVJFQ1RfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfR1JBRElFTlRfMVJFQ1RfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfS0VZQkRJTlBVVF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVRfMklfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9LRVlCRElOUFVUXzJJXzE9Y2FzdD1DT05TVCBWT0lEICosZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9LRVlCRElOUFVUXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJXzA9Y2FzdD1QVk9JRAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PVVNFSU5QVVRfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NT1VTRUlOUFVUXzJJXzA9Y2FzdD1QVk9JRAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTU9VU0VJTlBVVF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NT1VTRUlOUFVUXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0FfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0FfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPV18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPV18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySV8wPWNhc3Q9UFZPSUQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKixmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSSVZFUlRFWF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSSVZFUlRFWF8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFJJVkVSVEVYXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSSVZFUlRFWF8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JXzNCST0KLU9TX01vdmVNZW1vcnlfX0lfM0JJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JXzNCSV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19JXzNCSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JXzNDST0KLU9TX01vdmVNZW1vcnlfX0lfM0NJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JXzNDSV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19JXzNDSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JXzNEST0KLU9TX01vdmVNZW1vcnlfX0lfM0RJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JXzNESV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19JXzNESV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JXzNGST0KLU9TX01vdmVNZW1vcnlfX0lfM0ZJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JXzNGSV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19JXzNGSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JXzNJST0KLU9TX01vdmVNZW1vcnlfX0lfM0lJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JXzNJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19JXzNJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JXzNTST0KLU9TX01vdmVNZW1vcnlfX0lfM1NJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JXzNTSV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19JXzNTSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMl8zQkk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMl8zQklfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8yXzNCSV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMl8zQklfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUkFXSVRFTVNUUlVDVF8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RSQVdJVEVNU1RSVUNUXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUkFXSVRFTVNUUlVDVF8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RSQVdJVEVNU1RSVUNUXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hFTFBJTkZPXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSEVMUElORk9fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hFTFBJTkZPXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSEVMUElORk9fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NQ1VTVE9NRFJBV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NQ1VTVE9NRFJBV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1DVVNUT01EUkFXXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1DVVNUT01EUkFXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSERSXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRFJfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSERSXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRFJfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRUFERVJfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhFQURFUl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRUFERVJfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhFQURFUl8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJTktfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJTktfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElOS18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElOS18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJU1RWSUVXXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSVNUVklFV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSVNUVklFV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElTVFZJRVdfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVdfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWQ1VTVE9NRFJBV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMklJXzA9Y2FzdD0oUFZPSUQsZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRElTUElORk9fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkZJTkRJVEVNXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkZJTkRJVEVNXzJJSV8wPWNhc3Q9UFZPSUQsZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkZJTkRJVEVNXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZGSU5ESVRFTV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hFVlJPTl8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSEVWUk9OXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hFVlJPTl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSEVWUk9OXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSElMRFNJWkVfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hJTERTSVpFXzJJSV8wPWNhc3Q9UFZPSUQsZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNISUxEU0laRV8ySUlfMT1jYXN0PUNPTlNUIFZPSUQgKgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hJTERTSVpFXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkdJTkZPXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SR0lORk9fMklJXzA9Y2FzdD1QVk9JRCxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJHSU5GT18ySUlfMT1jYXN0PUNPTlNUIFZPSUQgKgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJHSU5GT18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRCSE9USVRFTV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVEJIT1RJVEVNXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRCSE9USVRFTV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVEJIT1RJVEVNXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVE9PTEJBUl8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVE9PTEJBUl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UT09MQkFSXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UT09MQkFSXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0FfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWRElTUElORk9fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWRElTUElORk9fMklJXzA9Y2FzdD1QVk9JRCxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWRElTUElORk9fMklJXzE9Y2FzdD1DT05TVCBWT0lEICoKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVVBET1dOXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV05fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVVBET1dOXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV05fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8ySUlfMD1jYXN0PVBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xSVRFTV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xSVRFTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xTE9HQVRUUl8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xTE9HQVRUUl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xUFJPUEVSVElFU18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xUFJPUEVSVElFU18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNBXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0FfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNBXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0FfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ1dfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ1dfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zQklJPQotT1NfTW92ZU1lbW9yeV9fXzNCSUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zQklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fXzNCSUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ0NFTF8yST0KLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQUNDRUxfMklfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQUNDRUxfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ0NFTF8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMkk9Ci1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMklfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNDSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM0NJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNDSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM0NJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0RJST0KLU9TX01vdmVNZW1vcnlfX18zRElJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19fM0RJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX18zRElJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zRklJPQotT1NfTW92ZU1lbW9yeV9fXzNGSUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zRklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fXzNGSUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNJSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM0lJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNJSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM0lJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM1NJST0KLU9TX01vdmVNZW1vcnlfX18zU0lJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19fM1NJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX18zU0lJXzI9Ci0KLU9TX01vdmVUb0V4PQotT1NfTW92ZVRvRXhfMD1jYXN0PShIREMpCi1PU19Nb3ZlVG9FeF8xPQotT1NfTW92ZVRvRXhfMj0KLU9TX01vdmVUb0V4XzM9Y2FzdD0oTFBQT0lOVCkKLQotT1NfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4PQotT1NfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4XzA9Y2FzdD0oRFdPUkQpCi1PU19Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXhfMT1jYXN0PShMUEhBTkRMRSkKLU9TX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeF8yPWNhc3Q9KERXT1JEKQotT1NfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4XzM9Y2FzdD0oRFdPUkQpCi1PU19Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXhfND1jYXN0PShEV09SRCkKLQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0k9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDSV8wPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0lfMT0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJXzI9Y2FzdD0oTFBDU1RSKQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0lfMz0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJXzQ9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0lfNT0KLQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDST0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0lfMD0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0lfMT0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0lfMj1jYXN0PShMUENTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDSV8zPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlfM0JJXzNDSV80PWNhc3Q9KExQV1NUUiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0lfNT0KLQotT1NfTm90aWZ5V2luRXZlbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfTm90aWZ5V2luRXZlbnRfMD1jYXN0PURXT1JECi1PU19Ob3RpZnlXaW5FdmVudF8xPWNhc3Q9SFdORAotT1NfTm90aWZ5V2luRXZlbnRfMj1jYXN0PUxPTkcKLU9TX05vdGlmeVdpbkV2ZW50XzM9Y2FzdD1MT05HCi0KLU9TX09mZnNldFJlY3Q9Ci1PU19PZmZzZXRSZWN0XzA9Ci1PU19PZmZzZXRSZWN0XzE9Ci1PU19PZmZzZXRSZWN0XzI9Ci0KLU9TX09mZnNldFJnbj0KLU9TX09mZnNldFJnbl8wPWNhc3Q9SFJHTgotT1NfT2Zmc2V0UmduXzE9Ci1PU19PZmZzZXRSZ25fMj0KLQotT1NfT2xlSW5pdGlhbGl6ZT0KLU9TX09sZUluaXRpYWxpemVfMD1jYXN0PShMUFZPSUQpCi0KLU9TX09sZVVuaW5pdGlhbGl6ZT0KLQotT1NfT3BlbkNsaXBib2FyZD0KLU9TX09wZW5DbGlwYm9hcmRfMD1jYXN0PShIV05EKQotCi1PU19PcGVuVGhlbWVEYXRhPWZsYWdzPWR5bmFtaWMKLU9TX09wZW5UaGVtZURhdGFfMD1jYXN0PUhXTkQKLU9TX09wZW5UaGVtZURhdGFfMT1jYXN0PUxQQ1dTVFIKLQotT1NfUFJJTUFSWUxBTkdJRD0KLU9TX1BSSU1BUllMQU5HSURfMD0KLQotT1NfUGF0Qmx0PQotT1NfUGF0Qmx0XzA9Y2FzdD0oSERDKQotT1NfUGF0Qmx0XzE9Ci1PU19QYXRCbHRfMj0KLU9TX1BhdEJsdF8zPQotT1NfUGF0Qmx0XzQ9Ci1PU19QYXRCbHRfNT0KLQotT1NfUGVla01lc3NhZ2VBPQotT1NfUGVla01lc3NhZ2VBXzA9Ci1PU19QZWVrTWVzc2FnZUFfMT1jYXN0PShIV05EKQotT1NfUGVla01lc3NhZ2VBXzI9Ci1PU19QZWVrTWVzc2FnZUFfMz0KLU9TX1BlZWtNZXNzYWdlQV80PQotCi1PU19QZWVrTWVzc2FnZVc9Ci1PU19QZWVrTWVzc2FnZVdfMD0KLU9TX1BlZWtNZXNzYWdlV18xPWNhc3Q9KEhXTkQpCi1PU19QZWVrTWVzc2FnZVdfMj0KLU9TX1BlZWtNZXNzYWdlV18zPQotT1NfUGVla01lc3NhZ2VXXzQ9Ci0KLU9TX1BpZT0KLU9TX1BpZV8wPWNhc3Q9KEhEQykKLU9TX1BpZV8xPQotT1NfUGllXzI9Ci1PU19QaWVfMz0KLU9TX1BpZV80PQotT1NfUGllXzU9Ci1PU19QaWVfNj0KLU9TX1BpZV83PQotT1NfUGllXzg9Ci0KLU9TX1BvbHlnb249Ci1PU19Qb2x5Z29uXzA9Y2FzdD0oSERDKQotT1NfUG9seWdvbl8xPWNhc3Q9KENPTlNUIFBPSU5UICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfUG9seWdvbl8yPQotCi1PU19Qb2x5bGluZT0KLU9TX1BvbHlsaW5lXzA9Y2FzdD0oSERDKQotT1NfUG9seWxpbmVfMT1jYXN0PShDT05TVCBQT0lOVCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX1BvbHlsaW5lXzI9Ci0KLU9TX1Bvc3RNZXNzYWdlQT0KLU9TX1Bvc3RNZXNzYWdlQV8wPWNhc3Q9KEhXTkQpCi1PU19Qb3N0TWVzc2FnZUFfMT0KLU9TX1Bvc3RNZXNzYWdlQV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1Bvc3RNZXNzYWdlQV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfUG9zdE1lc3NhZ2VXPQotT1NfUG9zdE1lc3NhZ2VXXzA9Y2FzdD0oSFdORCkKLU9TX1Bvc3RNZXNzYWdlV18xPQotT1NfUG9zdE1lc3NhZ2VXXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdE1lc3NhZ2VXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19Qb3N0VGhyZWFkTWVzc2FnZUE9Ci1PU19Qb3N0VGhyZWFkTWVzc2FnZUFfMD0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlQV8xPQotT1NfUG9zdFRocmVhZE1lc3NhZ2VBXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdFRocmVhZE1lc3NhZ2VBXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19Qb3N0VGhyZWFkTWVzc2FnZVc9Ci1PU19Qb3N0VGhyZWFkTWVzc2FnZVdfMD0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlV18xPQotT1NfUG9zdFRocmVhZE1lc3NhZ2VXXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdFRocmVhZE1lc3NhZ2VXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19QcmludERsZ0E9Ci1PU19QcmludERsZ0FfMD0KLQotT1NfUHJpbnREbGdXPQotT1NfUHJpbnREbGdXXzA9Y2FzdD0oTFBQUklOVERMR1cpCi0KLU9TX1B0SW5SZWN0PQotT1NfUHRJblJlY3RfMD1mbGFncz1ub19vdXQKLU9TX1B0SW5SZWN0XzE9ZmxhZ3M9bm9fb3V0IHN0cnVjdAotCi1PU19QdEluUmVnaW9uPQotT1NfUHRJblJlZ2lvbl8wPWNhc3Q9KEhSR04pCi1PU19QdEluUmVnaW9uXzE9Ci1PU19QdEluUmVnaW9uXzI9Ci0KLU9TX1JlYWxpemVQYWxldHRlPQotT1NfUmVhbGl6ZVBhbGV0dGVfMD1jYXN0PShIREMpCi0KLU9TX1JlY3RJblJlZ2lvbj0KLU9TX1JlY3RJblJlZ2lvbl8wPWNhc3Q9KEhSR04pCi1PU19SZWN0SW5SZWdpb25fMT1mbGFncz1ub19vdXQKLQotT1NfUmVjdGFuZ2xlPQotT1NfUmVjdGFuZ2xlXzA9Y2FzdD0oSERDKQotT1NfUmVjdGFuZ2xlXzE9Ci1PU19SZWN0YW5nbGVfMj0KLU9TX1JlY3RhbmdsZV8zPQotT1NfUmVjdGFuZ2xlXzQ9Ci0KLU9TX1JlZHJhd1dpbmRvdz0KLU9TX1JlZHJhd1dpbmRvd18wPWNhc3Q9KEhXTkQpCi1PU19SZWRyYXdXaW5kb3dfMT0KLU9TX1JlZHJhd1dpbmRvd18yPWNhc3Q9KEhSR04pCi1PU19SZWRyYXdXaW5kb3dfMz0KLQotT1NfUmVnQ2xvc2VLZXk9Ci1PU19SZWdDbG9zZUtleV8wPWNhc3Q9KEhLRVkpCi0KLU9TX1JlZ0VudW1LZXlFeEE9Ci1PU19SZWdFbnVtS2V5RXhBXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ0VudW1LZXlFeEFfMT0KLU9TX1JlZ0VudW1LZXlFeEFfMj1jYXN0PShMUFNUUikKLU9TX1JlZ0VudW1LZXlFeEFfMz0KLU9TX1JlZ0VudW1LZXlFeEFfND0KLU9TX1JlZ0VudW1LZXlFeEFfNT1jYXN0PShMUFNUUikKLU9TX1JlZ0VudW1LZXlFeEFfNj0KLU9TX1JlZ0VudW1LZXlFeEFfNz0KLQotT1NfUmVnRW51bUtleUV4Vz0KLU9TX1JlZ0VudW1LZXlFeFdfMD1jYXN0PShIS0VZKQotT1NfUmVnRW51bUtleUV4V18xPQotT1NfUmVnRW51bUtleUV4V18yPWNhc3Q9KExQV1NUUikKLU9TX1JlZ0VudW1LZXlFeFdfMz0KLU9TX1JlZ0VudW1LZXlFeFdfND0KLU9TX1JlZ0VudW1LZXlFeFdfNT1jYXN0PShMUFdTVFIpCi1PU19SZWdFbnVtS2V5RXhXXzY9Ci1PU19SZWdFbnVtS2V5RXhXXzc9Ci0KLU9TX1JlZ09wZW5LZXlFeEE9Ci1PU19SZWdPcGVuS2V5RXhBXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ09wZW5LZXlFeEFfMT1jYXN0PShMUFNUUikKLU9TX1JlZ09wZW5LZXlFeEFfMj0KLU9TX1JlZ09wZW5LZXlFeEFfMz0KLU9TX1JlZ09wZW5LZXlFeEFfND1jYXN0PShQSEtFWSkKLQotT1NfUmVnT3BlbktleUV4Vz0KLU9TX1JlZ09wZW5LZXlFeFdfMD1jYXN0PShIS0VZKQotT1NfUmVnT3BlbktleUV4V18xPWNhc3Q9KExQV1NUUikKLU9TX1JlZ09wZW5LZXlFeFdfMj0KLU9TX1JlZ09wZW5LZXlFeFdfMz0KLU9TX1JlZ09wZW5LZXlFeFdfND1jYXN0PShQSEtFWSkKLQotT1NfUmVnUXVlcnlJbmZvS2V5QT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfMD1jYXN0PShIS0VZKQotT1NfUmVnUXVlcnlJbmZvS2V5QV8xPWNhc3Q9KExQU1RSKQotT1NfUmVnUXVlcnlJbmZvS2V5QV8yPQotT1NfUmVnUXVlcnlJbmZvS2V5QV8zPWNhc3Q9KExQRFdPUkQpCi1PU19SZWdRdWVyeUluZm9LZXlBXzQ9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzU9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzY9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzc9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzg9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzk9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzEwPQotT1NfUmVnUXVlcnlJbmZvS2V5QV8xMT1jYXN0PShQRklMRVRJTUUpCi0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVc9Ci1PU19SZWdRdWVyeUluZm9LZXlXXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMT1jYXN0PShMUFdTVFIpCi1PU19SZWdRdWVyeUluZm9LZXlXXzI9Ci1PU19SZWdRdWVyeUluZm9LZXlXXzM9Y2FzdD0oTFBEV09SRCkKLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfND0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfNT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfNj0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfNz0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfOD0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfOT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMTA9Ci1PU19SZWdRdWVyeUluZm9LZXlXXzExPWNhc3Q9KFBGSUxFVElNRSkKLQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0JfM0k9Ci1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV8xPWNhc3Q9KExQU1RSKQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0JfM0lfMj1jYXN0PShMUERXT1JEKQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0JfM0lfMz0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNCXzNJXzQ9Y2FzdD0oTFBCWVRFKQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0JfM0lfNT0KLQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0lfM0k9Ci1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV8xPWNhc3Q9KExQU1RSKQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0lfM0lfMj1jYXN0PShMUERXT1JEKQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0lfM0lfMz0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNJXzNJXzQ9Y2FzdD0oTFBCWVRFKQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0lfM0lfNT0KLQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0k9Ci1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zQ18zSV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zQ18zSV8xPWNhc3Q9KExQV1NUUikKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzI9Y2FzdD0oTFBEV09SRCkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzM9Ci1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zQ18zSV80PWNhc3Q9KExQQllURSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzU9Ci0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJPQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0lfM0lfMD1jYXN0PShIS0VZKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0lfM0lfMT1jYXN0PShMUFdTVFIpCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV8yPWNhc3Q9KExQRFdPUkQpCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV8zPQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0lfM0lfND1jYXN0PShMUEJZVEUpCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV81PQotCi1PU19SZWdpc3RlckNsYXNzQT0KLU9TX1JlZ2lzdGVyQ2xhc3NBXzA9Ci0KLU9TX1JlZ2lzdGVyQ2xhc3NXPQotT1NfUmVnaXN0ZXJDbGFzc1dfMD1jYXN0PShMUFdORENMQVNTVykKLQotT1NfUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXRBPQotT1NfUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXRBXzA9Y2FzdD0oTFBUU1RSKQotCi1PU19SZWdpc3RlckNsaXBib2FyZEZvcm1hdFc9Ci1PU19SZWdpc3RlckNsaXBib2FyZEZvcm1hdFdfMD1jYXN0PShMUFdTVFIpCi0KLU9TX1JlZ2lzdGVyV2luZG93TWVzc2FnZUE9Ci1PU19SZWdpc3RlcldpbmRvd01lc3NhZ2VBXzA9Y2FzdD0oTFBUU1RSKQotCi1PU19SZWdpc3RlcldpbmRvd01lc3NhZ2VXPQotT1NfUmVnaXN0ZXJXaW5kb3dNZXNzYWdlV18wPWNhc3Q9KExQV1NUUikKLQotT1NfUmVsZWFzZUNhcHR1cmU9Ci0KLU9TX1JlbGVhc2VEQz0KLU9TX1JlbGVhc2VEQ18wPWNhc3Q9KEhXTkQpCi1PU19SZWxlYXNlRENfMT1jYXN0PShIREMpCi0KLU9TX1JlbW92ZU1lbnU9Ci1PU19SZW1vdmVNZW51XzA9Y2FzdD0oSE1FTlUpCi1PU19SZW1vdmVNZW51XzE9Ci1PU19SZW1vdmVNZW51XzI9Ci0KLU9TX1JlbW92ZVByb3BBPQotT1NfUmVtb3ZlUHJvcEFfMD1jYXN0PUhXTkQKLU9TX1JlbW92ZVByb3BBXzE9Y2FzdD1MUENUU1RSCi0KLU9TX1JlbW92ZVByb3BXPQotT1NfUmVtb3ZlUHJvcFdfMD1jYXN0PUhXTkQKLU9TX1JlbW92ZVByb3BXXzE9Y2FzdD0oTFBDV1NUUikKLQotT1NfUmVzdG9yZURDPQotT1NfUmVzdG9yZURDXzA9Y2FzdD0oSERDKQotT1NfUmVzdG9yZURDXzE9Y2FzdD0oaW50KQotCi1PU19Sb3VuZFJlY3Q9Ci1PU19Sb3VuZFJlY3RfMD1jYXN0PShIREMpCi1PU19Sb3VuZFJlY3RfMT0KLU9TX1JvdW5kUmVjdF8yPQotT1NfUm91bmRSZWN0XzM9Ci1PU19Sb3VuZFJlY3RfND0KLU9TX1JvdW5kUmVjdF81PQotT1NfUm91bmRSZWN0XzY9Ci0KLU9TX1NIQnJvd3NlRm9yRm9sZGVyQT0KLU9TX1NIQnJvd3NlRm9yRm9sZGVyQV8wPQotCi1PU19TSEJyb3dzZUZvckZvbGRlclc9Ci1PU19TSEJyb3dzZUZvckZvbGRlcldfMD1jYXN0PShMUEJST1dTRUlORk9XKQotCi1PU19TSENyZWF0ZU1lbnVCYXI9Ci1PU19TSENyZWF0ZU1lbnVCYXJfMD1jYXN0PShQU0hNRU5VQkFSSU5GTykKLQotT1NfU0hHZXRNYWxsb2M9Ci1PU19TSEdldE1hbGxvY18wPWNhc3Q9KExQTUFMTE9DICopCi0KLU9TX1NIR2V0UGF0aEZyb21JRExpc3RBPQotT1NfU0hHZXRQYXRoRnJvbUlETGlzdEFfMD1jYXN0PShMUENJVEVNSURMSVNUKQotT1NfU0hHZXRQYXRoRnJvbUlETGlzdEFfMT1jYXN0PShMUFNUUikKLQotT1NfU0hHZXRQYXRoRnJvbUlETGlzdFc9Ci1PU19TSEdldFBhdGhGcm9tSURMaXN0V18wPWNhc3Q9KExQQ0lURU1JRExJU1QpCi1PU19TSEdldFBhdGhGcm9tSURMaXN0V18xPWNhc3Q9KExQV1NUUikKLQotT1NfU0hIYW5kbGVXTVNldHRpbmdDaGFuZ2U9Ci1PU19TSEhhbmRsZVdNU2V0dGluZ0NoYW5nZV8wPWNhc3Q9KEhXTkQpCi1PU19TSEhhbmRsZVdNU2V0dGluZ0NoYW5nZV8xPQotT1NfU0hIYW5kbGVXTVNldHRpbmdDaGFuZ2VfMj0KLU9TX1NISGFuZGxlV01TZXR0aW5nQ2hhbmdlXzM9Ci0KLU9TX1NIUmVjb2duaXplR2VzdHVyZT0KLU9TX1NIUmVjb2duaXplR2VzdHVyZV8wPQotCi1PU19TSFNlbmRCYWNrVG9Gb2N1c1dpbmRvdz0KLU9TX1NIU2VuZEJhY2tUb0ZvY3VzV2luZG93XzA9Ci1PU19TSFNlbmRCYWNrVG9Gb2N1c1dpbmRvd18xPQotT1NfU0hTZW5kQmFja1RvRm9jdXNXaW5kb3dfMj0KLQotT1NfU0hTZXRBcHBLZXlXbmRBc3NvYz0KLU9TX1NIU2V0QXBwS2V5V25kQXNzb2NfMD1jYXN0PShCWVRFKQotT1NfU0hTZXRBcHBLZXlXbmRBc3NvY18xPWNhc3Q9KEhXTkQpCi0KLU9TX1NIU2lwUHJlZmVyZW5jZT0KLU9TX1NIU2lwUHJlZmVyZW5jZV8wPWNhc3Q9KEhXTkQpCi1PU19TSFNpcFByZWZlcmVuY2VfMT0KLQotT1NfU2F2ZURDPQotT1NfU2F2ZURDXzA9Y2FzdD0oSERDKQotCi1PU19TY3JlZW5Ub0NsaWVudD0KLU9TX1NjcmVlblRvQ2xpZW50XzA9Y2FzdD0oSFdORCkKLU9TX1NjcmVlblRvQ2xpZW50XzE9Ci0KLU9TX1NjcmlwdEJyZWFrPQotT1NfU2NyaXB0QnJlYWtfMD1jYXN0PWNvbnN0IFdDSEFSICoKLU9TX1NjcmlwdEJyZWFrXzE9Ci1PU19TY3JpcHRCcmVha18yPWNhc3Q9Y29uc3QgU0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdEJyZWFrXzM9Y2FzdD1TQ1JJUFRfTE9HQVRUUiAqCi0KLU9TX1NjcmlwdENQdG9YPQotT1NfU2NyaXB0Q1B0b1hfMD0KLU9TX1NjcmlwdENQdG9YXzE9Ci1PU19TY3JpcHRDUHRvWF8yPQotT1NfU2NyaXB0Q1B0b1hfMz0KLU9TX1NjcmlwdENQdG9YXzQ9Y2FzdD1jb25zdCBXT1JEICoKLU9TX1NjcmlwdENQdG9YXzU9Y2FzdD1jb25zdCBTQ1JJUFRfVklTQVRUUiAqCi1PU19TY3JpcHRDUHRvWF82PWNhc3Q9Y29uc3QgaW50ICoKLU9TX1NjcmlwdENQdG9YXzc9Y2FzdD1jb25zdCBTQ1JJUFRfQU5BTFlTSVMgKgotT1NfU2NyaXB0Q1B0b1hfOD1jYXN0PWludCAqCi0KLU9TX1NjcmlwdENhY2hlR2V0SGVpZ2h0PQotT1NfU2NyaXB0Q2FjaGVHZXRIZWlnaHRfMD1jYXN0PUhEQwotT1NfU2NyaXB0Q2FjaGVHZXRIZWlnaHRfMT1jYXN0PShTQ1JJUFRfQ0FDSEUgKikKLU9TX1NjcmlwdENhY2hlR2V0SGVpZ2h0XzI9Y2FzdD1sb25nICoKLQotT1NfU2NyaXB0RnJlZUNhY2hlPQotT1NfU2NyaXB0RnJlZUNhY2hlXzA9Y2FzdD0oU0NSSVBUX0NBQ0hFICopCi0KLU9TX1NjcmlwdEdldEZvbnRQcm9wZXJ0aWVzPQotT1NfU2NyaXB0R2V0Rm9udFByb3BlcnRpZXNfMD1jYXN0PUhEQwotT1NfU2NyaXB0R2V0Rm9udFByb3BlcnRpZXNfMT1jYXN0PVNDUklQVF9DQUNIRSAqCi1PU19TY3JpcHRHZXRGb250UHJvcGVydGllc18yPWNhc3Q9U0NSSVBUX0ZPTlRQUk9QRVJUSUVTICoKLQotT1NfU2NyaXB0R2V0TG9naWNhbFdpZHRocz0KLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfMD1jYXN0PWNvbnN0IFNDUklQVF9BTkFMWVNJUyAqCi1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzE9Ci1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzI9Ci1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzM9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0R2V0TG9naWNhbFdpZHRoc180PWNhc3Q9Y29uc3QgV09SRCAqCi1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzU9Y2FzdD0oY29uc3QgU0NSSVBUX1ZJU0FUVFIgKikKLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfNj1jYXN0PShpbnQgKikKLQotT1NfU2NyaXB0R2V0UHJvcGVydGllcz0KLU9TX1NjcmlwdEdldFByb3BlcnRpZXNfMD1jYXN0PWNvbnN0IFNDUklQVF9QUk9QRVJUSUVTICoqKgotT1NfU2NyaXB0R2V0UHJvcGVydGllc18xPWNhc3Q9aW50ICoKLQotT1NfU2NyaXB0SXRlbWl6ZT0KLU9TX1NjcmlwdEl0ZW1pemVfMD1jYXN0PWNvbnN0IFdDSEFSICoKLU9TX1NjcmlwdEl0ZW1pemVfMT0KLU9TX1NjcmlwdEl0ZW1pemVfMj0KLU9TX1NjcmlwdEl0ZW1pemVfMz1jYXN0PWNvbnN0IFNDUklQVF9DT05UUk9MICoKLU9TX1NjcmlwdEl0ZW1pemVfND1jYXN0PWNvbnN0IFNDUklQVF9TVEFURSAqCi1PU19TY3JpcHRJdGVtaXplXzU9Y2FzdD1TQ1JJUFRfSVRFTSAqCi1PU19TY3JpcHRJdGVtaXplXzY9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRKdXN0aWZ5PQotT1NfU2NyaXB0SnVzdGlmeV8wPWNhc3Q9KFNDUklQVF9WSVNBVFRSICopCi1PU19TY3JpcHRKdXN0aWZ5XzE9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0SnVzdGlmeV8yPQotT1NfU2NyaXB0SnVzdGlmeV8zPQotT1NfU2NyaXB0SnVzdGlmeV80PQotT1NfU2NyaXB0SnVzdGlmeV81PWNhc3Q9aW50ICoKLQotT1NfU2NyaXB0TGF5b3V0PQotT1NfU2NyaXB0TGF5b3V0XzA9Ci1PU19TY3JpcHRMYXlvdXRfMT1jYXN0PWNvbnN0IEJZVEUgKgotT1NfU2NyaXB0TGF5b3V0XzI9Y2FzdD1pbnQgKgotT1NfU2NyaXB0TGF5b3V0XzM9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRQbGFjZT0KLU9TX1NjcmlwdFBsYWNlXzA9Y2FzdD1IREMKLU9TX1NjcmlwdFBsYWNlXzE9Y2FzdD1TQ1JJUFRfQ0FDSEUgKgotT1NfU2NyaXB0UGxhY2VfMj1jYXN0PWNvbnN0IFdPUkQgKgotT1NfU2NyaXB0UGxhY2VfMz0KLU9TX1NjcmlwdFBsYWNlXzQ9Y2FzdD1jb25zdCBTQ1JJUFRfVklTQVRUUiAqCi1PU19TY3JpcHRQbGFjZV81PWNhc3Q9U0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdFBsYWNlXzY9Y2FzdD1pbnQgKgotT1NfU2NyaXB0UGxhY2VfNz1jYXN0PUdPRkZTRVQgKgotT1NfU2NyaXB0UGxhY2VfOD1jYXN0PUFCQyAqCi0KLU9TX1NjcmlwdFNoYXBlPQotT1NfU2NyaXB0U2hhcGVfMD1jYXN0PUhEQwotT1NfU2NyaXB0U2hhcGVfMT1jYXN0PVNDUklQVF9DQUNIRSAqCi1PU19TY3JpcHRTaGFwZV8yPWNhc3Q9Y29uc3QgV0NIQVIgKgotT1NfU2NyaXB0U2hhcGVfMz0KLU9TX1NjcmlwdFNoYXBlXzQ9Ci1PU19TY3JpcHRTaGFwZV81PWNhc3Q9KFNDUklQVF9BTkFMWVNJUyAqKQotT1NfU2NyaXB0U2hhcGVfNj1jYXN0PVdPUkQgKgotT1NfU2NyaXB0U2hhcGVfNz1jYXN0PVdPUkQgKgotT1NfU2NyaXB0U2hhcGVfOD1jYXN0PVNDUklQVF9WSVNBVFRSICoKLU9TX1NjcmlwdFNoYXBlXzk9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRUZXh0T3V0PQotT1NfU2NyaXB0VGV4dE91dF8wPWNhc3Q9Y29uc3QgSERDCi1PU19TY3JpcHRUZXh0T3V0XzE9Y2FzdD1TQ1JJUFRfQ0FDSEUgKgotT1NfU2NyaXB0VGV4dE91dF8yPQotT1NfU2NyaXB0VGV4dE91dF8zPQotT1NfU2NyaXB0VGV4dE91dF80PQotT1NfU2NyaXB0VGV4dE91dF81PWNhc3Q9Y29uc3QgUkVDVCAqCi1PU19TY3JpcHRUZXh0T3V0XzY9Y2FzdD1jb25zdCBTQ1JJUFRfQU5BTFlTSVMgKgotT1NfU2NyaXB0VGV4dE91dF83PWNhc3Q9Y29uc3QgV0NIQVIgKgotT1NfU2NyaXB0VGV4dE91dF84PQotT1NfU2NyaXB0VGV4dE91dF85PWNhc3Q9Y29uc3QgV09SRCAqCi1PU19TY3JpcHRUZXh0T3V0XzEwPQotT1NfU2NyaXB0VGV4dE91dF8xMT1jYXN0PWNvbnN0IGludCAqCi1PU19TY3JpcHRUZXh0T3V0XzEyPWNhc3Q9Y29uc3QgaW50ICoKLU9TX1NjcmlwdFRleHRPdXRfMTM9Y2FzdD1jb25zdCBHT0ZGU0VUICoKLQotT1NfU2NyaXB0WHRvQ1A9Ci1PU19TY3JpcHRYdG9DUF8wPQotT1NfU2NyaXB0WHRvQ1BfMT0KLU9TX1NjcmlwdFh0b0NQXzI9Ci1PU19TY3JpcHRYdG9DUF8zPWNhc3Q9KGNvbnN0IFdPUkQgKikKLU9TX1NjcmlwdFh0b0NQXzQ9Y2FzdD1jb25zdCBTQ1JJUFRfVklTQVRUUiAqCi1PU19TY3JpcHRYdG9DUF81PWNhc3Q9Y29uc3QgaW50ICoKLU9TX1NjcmlwdFh0b0NQXzY9Y2FzdD1jb25zdCBTQ1JJUFRfQU5BTFlTSVMgKgotT1NfU2NyaXB0WHRvQ1BfNz1jYXN0PWludCAqCi1PU19TY3JpcHRYdG9DUF84PWNhc3Q9aW50ICoKLQotT1NfU2Nyb2xsV2luZG93RXg9Ci1PU19TY3JvbGxXaW5kb3dFeF8wPWNhc3Q9KEhXTkQpCi1PU19TY3JvbGxXaW5kb3dFeF8xPQotT1NfU2Nyb2xsV2luZG93RXhfMj0KLU9TX1Njcm9sbFdpbmRvd0V4XzM9Ci1PU19TY3JvbGxXaW5kb3dFeF80PQotT1NfU2Nyb2xsV2luZG93RXhfNT1jYXN0PShIUkdOKQotT1NfU2Nyb2xsV2luZG93RXhfNj0KLU9TX1Njcm9sbFdpbmRvd0V4Xzc9Ci0KLU9TX1NlbGVjdENsaXBSZ249Ci1PU19TZWxlY3RDbGlwUmduXzA9Y2FzdD0oSERDKQotT1NfU2VsZWN0Q2xpcFJnbl8xPWNhc3Q9KEhSR04pCi0KLU9TX1NlbGVjdE9iamVjdD0KLU9TX1NlbGVjdE9iamVjdF8wPWNhc3Q9KEhEQykKLU9TX1NlbGVjdE9iamVjdF8xPWNhc3Q9KEhHRElPQkopCi0KLU9TX1NlbGVjdFBhbGV0dGU9Ci1PU19TZWxlY3RQYWxldHRlXzA9Y2FzdD0oSERDKQotT1NfU2VsZWN0UGFsZXR0ZV8xPWNhc3Q9KEhQQUxFVFRFKQotT1NfU2VsZWN0UGFsZXR0ZV8yPQotCi1PU19TZW5kSW5wdXQ9Ci1PU19TZW5kSW5wdXRfMD0KLU9TX1NlbmRJbnB1dF8xPWNhc3Q9TFBJTlBVVAotT1NfU2VuZElucHV0XzI9Ci0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJST0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUlfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJSV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMz1jYXN0PUxQQVJBTQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MSVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MSVRFTV8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkNPTFVNTl8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkNPTFVNTl8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZISVRURVNUSU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZISVRURVNUSU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTV8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUFSR0lOU18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUFSR0lOU18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQkFSQkFORElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQkFSQkFORElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMz1jYXN0PUxQQVJBTQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNCPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNCXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNJPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNTPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNTXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lJPQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0k9Ci1PU19TZW5kTWVzc2FnZUFfX0lJXzNJXzNJXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0lfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0lfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJXzNJXzNJXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUk9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlJXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UT09MSU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZISVRURVNUSU5GT18yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJTlNFUlRTVFJVQ1RfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0M9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSV8zQ18wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zQ18xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0NfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zQ18zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0k9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSV8zSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zSV8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0lfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM1M9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSV8zU18wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zU18xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM1NfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSV8zU18zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSUk9Ci1PU19TZW5kTWVzc2FnZVdfX0lJXzNJSV8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJSV8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSUlfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJSV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSV8zST1mbGFncz1ub19nZW4KLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lfM0lfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSV8zSV8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSV8zSV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lfM0lfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NldEFjdGl2ZVdpbmRvdz0KLU9TX1NldEFjdGl2ZVdpbmRvd18wPWNhc3Q9KEhXTkQpCi0KLU9TX1NldEJrQ29sb3I9Ci1PU19TZXRCa0NvbG9yXzA9Y2FzdD0oSERDKQotT1NfU2V0QmtDb2xvcl8xPWNhc3Q9KENPTE9SUkVGKQotCi1PU19TZXRCa01vZGU9Ci1PU19TZXRCa01vZGVfMD1jYXN0PShIREMpCi1PU19TZXRCa01vZGVfMT0KLQotT1NfU2V0QnJ1c2hPcmdFeD0KLU9TX1NldEJydXNoT3JnRXhfMD1jYXN0PUhEQwotT1NfU2V0QnJ1c2hPcmdFeF8xPQotT1NfU2V0QnJ1c2hPcmdFeF8yPQotT1NfU2V0QnJ1c2hPcmdFeF8zPWNhc3Q9KExQUE9JTlQpCi0KLU9TX1NldENhcHR1cmU9Ci1PU19TZXRDYXB0dXJlXzA9Y2FzdD0oSFdORCkKLQotT1NfU2V0Q2FyZXRQb3M9Ci1PU19TZXRDYXJldFBvc18wPQotT1NfU2V0Q2FyZXRQb3NfMT0KLQotT1NfU2V0Q2xpcGJvYXJkRGF0YT0KLU9TX1NldENsaXBib2FyZERhdGFfMD0KLU9TX1NldENsaXBib2FyZERhdGFfMT1jYXN0PShIQU5ETEUpCi0KLU9TX1NldEN1cnNvcj0KLU9TX1NldEN1cnNvcl8wPWNhc3Q9KEhDVVJTT1IpCi0KLU9TX1NldEN1cnNvclBvcz0KLU9TX1NldEN1cnNvclBvc18wPQotT1NfU2V0Q3Vyc29yUG9zXzE9Ci0KLU9TX1NldERJQkNvbG9yVGFibGU9Ci1PU19TZXRESUJDb2xvclRhYmxlXzA9Y2FzdD0oSERDKQotT1NfU2V0RElCQ29sb3JUYWJsZV8xPQotT1NfU2V0RElCQ29sb3JUYWJsZV8yPQotT1NfU2V0RElCQ29sb3JUYWJsZV8zPWNhc3Q9KFJHQlFVQUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX1NldEVycm9yTW9kZT0KLU9TX1NldEVycm9yTW9kZV8wPQotCi1PU19TZXRGb2N1cz0KLU9TX1NldEZvY3VzXzA9Y2FzdD0oSFdORCkKLQotT1NfU2V0Rm9yZWdyb3VuZFdpbmRvdz0KLU9TX1NldEZvcmVncm91bmRXaW5kb3dfMD1jYXN0PShIV05EKQotCi1PU19TZXRHcmFwaGljc01vZGU9Ci1PU19TZXRHcmFwaGljc01vZGVfMD1jYXN0PUhEQwotT1NfU2V0R3JhcGhpY3NNb2RlXzE9Ci0KLU9TX1NldExheW91dD1mbGFncz1keW5hbWljCi1PU19TZXRMYXlvdXRfMD1jYXN0PShIREMpCi1PU19TZXRMYXlvdXRfMT1jYXN0PShEV09SRCkKLQotT1NfU2V0TWVudT0KLU9TX1NldE1lbnVfMD1jYXN0PShIV05EKQotT1NfU2V0TWVudV8xPWNhc3Q9KEhNRU5VKQotCi1PU19TZXRNZW51RGVmYXVsdEl0ZW09Ci1PU19TZXRNZW51RGVmYXVsdEl0ZW1fMD1jYXN0PShITUVOVSkKLU9TX1NldE1lbnVEZWZhdWx0SXRlbV8xPQotT1NfU2V0TWVudURlZmF1bHRJdGVtXzI9Ci0KLU9TX1NldE1lbnVJbmZvPWZsYWdzPWR5bmFtaWMKLU9TX1NldE1lbnVJbmZvXzA9Y2FzdD0oSE1FTlUpCi1PU19TZXRNZW51SW5mb18xPQotCi1PU19TZXRNZW51SXRlbUluZm9BPQotT1NfU2V0TWVudUl0ZW1JbmZvQV8wPWNhc3Q9KEhNRU5VKQotT1NfU2V0TWVudUl0ZW1JbmZvQV8xPQotT1NfU2V0TWVudUl0ZW1JbmZvQV8yPQotT1NfU2V0TWVudUl0ZW1JbmZvQV8zPQotCi1PU19TZXRNZW51SXRlbUluZm9XPQotT1NfU2V0TWVudUl0ZW1JbmZvV18wPWNhc3Q9KEhNRU5VKQotT1NfU2V0TWVudUl0ZW1JbmZvV18xPQotT1NfU2V0TWVudUl0ZW1JbmZvV18yPQotT1NfU2V0TWVudUl0ZW1JbmZvV18zPWNhc3Q9KExQTUVOVUlURU1JTkZPVykKLQotT1NfU2V0TWV0YVJnbj0KLU9TX1NldE1ldGFSZ25fMD1jYXN0PUhEQwotCi1PU19TZXRQYWxldHRlRW50cmllcz0KLU9TX1NldFBhbGV0dGVFbnRyaWVzXzA9Y2FzdD0oSFBBTEVUVEUpCi1PU19TZXRQYWxldHRlRW50cmllc18xPQotT1NfU2V0UGFsZXR0ZUVudHJpZXNfMj0KLU9TX1NldFBhbGV0dGVFbnRyaWVzXzM9Y2FzdD0oUEFMRVRURUVOVFJZICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotCi1PU19TZXRQYXJlbnQ9Ci1PU19TZXRQYXJlbnRfMD1jYXN0PShIV05EKQotT1NfU2V0UGFyZW50XzE9Y2FzdD0oSFdORCkKLQotT1NfU2V0UGl4ZWw9Ci1PU19TZXRQaXhlbF8wPWNhc3Q9KEhEQykKLU9TX1NldFBpeGVsXzE9Ci1PU19TZXRQaXhlbF8yPQotT1NfU2V0UGl4ZWxfMz0KLQotT1NfU2V0UG9seUZpbGxNb2RlPQotT1NfU2V0UG9seUZpbGxNb2RlXzA9Y2FzdD1IREMKLU9TX1NldFBvbHlGaWxsTW9kZV8xPQotCi1PU19TZXRQcm9wQT0KLU9TX1NldFByb3BBXzA9Y2FzdD1IV05ECi1PU19TZXRQcm9wQV8xPWNhc3Q9TFBDVFNUUgotT1NfU2V0UHJvcEFfMj1jYXN0PShIQU5ETEUpCi0KLU9TX1NldFByb3BXPQotT1NfU2V0UHJvcFdfMD1jYXN0PUhXTkQKLU9TX1NldFByb3BXXzE9Y2FzdD0oTFBDV1NUUikKLU9TX1NldFByb3BXXzI9Y2FzdD1IQU5ETEUKLQotT1NfU2V0Uk9QMj0KLU9TX1NldFJPUDJfMD1jYXN0PShIREMpCi1PU19TZXRST1AyXzE9Ci0KLU9TX1NldFJlY3Q9Ci1PU19TZXRSZWN0XzA9ZmxhZ3M9bm9faW4KLU9TX1NldFJlY3RfMT0KLU9TX1NldFJlY3RfMj0KLU9TX1NldFJlY3RfMz0KLU9TX1NldFJlY3RfND0KLQotT1NfU2V0UmVjdFJnbj0KLU9TX1NldFJlY3RSZ25fMD1jYXN0PShIUkdOKQotT1NfU2V0UmVjdFJnbl8xPQotT1NfU2V0UmVjdFJnbl8yPQotT1NfU2V0UmVjdFJnbl8zPQotT1NfU2V0UmVjdFJnbl80PQotCi1PU19TZXRTY3JvbGxJbmZvPQotT1NfU2V0U2Nyb2xsSW5mb18wPWNhc3Q9KEhXTkQpCi1PU19TZXRTY3JvbGxJbmZvXzE9Ci1PU19TZXRTY3JvbGxJbmZvXzI9Ci1PU19TZXRTY3JvbGxJbmZvXzM9Ci0KLU9TX1NldFN0cmV0Y2hCbHRNb2RlPQotT1NfU2V0U3RyZXRjaEJsdE1vZGVfMD1jYXN0PShIREMpCi1PU19TZXRTdHJldGNoQmx0TW9kZV8xPQotCi1PU19TZXRUZXh0QWxpZ249Ci1PU19TZXRUZXh0QWxpZ25fMD1jYXN0PShIREMpCi1PU19TZXRUZXh0QWxpZ25fMT0KLQotT1NfU2V0VGV4dENvbG9yPQotT1NfU2V0VGV4dENvbG9yXzA9Y2FzdD0oSERDKQotT1NfU2V0VGV4dENvbG9yXzE9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX1NldFRpbWVyPQotT1NfU2V0VGltZXJfMD1jYXN0PShIV05EKQotT1NfU2V0VGltZXJfMT0KLU9TX1NldFRpbWVyXzI9Ci1PU19TZXRUaW1lcl8zPWNhc3Q9KFRJTUVSUFJPQykKLQotT1NfU2V0V2luZG93TG9uZ0E9Ci1PU19TZXRXaW5kb3dMb25nQV8wPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dMb25nQV8xPQotT1NfU2V0V2luZG93TG9uZ0FfMj0KLQotT1NfU2V0V2luZG93TG9uZ1c9Ci1PU19TZXRXaW5kb3dMb25nV18wPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dMb25nV18xPQotT1NfU2V0V2luZG93TG9uZ1dfMj0KLQotT1NfU2V0V2luZG93T3JnRXg9Ci1PU19TZXRXaW5kb3dPcmdFeF8wPWNhc3Q9SERDCi1PU19TZXRXaW5kb3dPcmdFeF8xPQotT1NfU2V0V2luZG93T3JnRXhfMj0KLU9TX1NldFdpbmRvd09yZ0V4XzM9Ci0KLU9TX1NldFdpbmRvd1BsYWNlbWVudD0KLU9TX1NldFdpbmRvd1BsYWNlbWVudF8wPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dQbGFjZW1lbnRfMT0KLQotT1NfU2V0V2luZG93UG9zPQotT1NfU2V0V2luZG93UG9zXzA9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd1Bvc18xPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dQb3NfMj0KLU9TX1NldFdpbmRvd1Bvc18zPQotT1NfU2V0V2luZG93UG9zXzQ9Ci1PU19TZXRXaW5kb3dQb3NfNT0KLU9TX1NldFdpbmRvd1Bvc182PQotCi1PU19TZXRXaW5kb3dSZ249Ci1PU19TZXRXaW5kb3dSZ25fMD1jYXN0PUhXTkQKLU9TX1NldFdpbmRvd1Jnbl8xPWNhc3Q9SFJHTgotT1NfU2V0V2luZG93UmduXzI9Ci0KLU9TX1NldFdpbmRvd1RleHRBPQotT1NfU2V0V2luZG93VGV4dEFfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93VGV4dEFfMT1jYXN0PShMUFNUUikKLQotT1NfU2V0V2luZG93VGV4dFc9Ci1PU19TZXRXaW5kb3dUZXh0V18wPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dUZXh0V18xPWNhc3Q9KExQV1NUUikKLQotT1NfU2V0V2luZG93c0hvb2tFeEE9Ci1PU19TZXRXaW5kb3dzSG9va0V4QV8wPQotT1NfU2V0V2luZG93c0hvb2tFeEFfMT1jYXN0PShIT09LUFJPQykKLU9TX1NldFdpbmRvd3NIb29rRXhBXzI9Y2FzdD0oSElOU1RBTkNFKQotT1NfU2V0V2luZG93c0hvb2tFeEFfMz0KLQotT1NfU2V0V2luZG93c0hvb2tFeFc9Ci1PU19TZXRXaW5kb3dzSG9va0V4V18wPQotT1NfU2V0V2luZG93c0hvb2tFeFdfMT1jYXN0PShIT09LUFJPQykKLU9TX1NldFdpbmRvd3NIb29rRXhXXzI9Y2FzdD0oSElOU1RBTkNFKQotT1NfU2V0V2luZG93c0hvb2tFeFdfMz0KLQotT1NfU2V0V29ybGRUcmFuc2Zvcm09Ci1PU19TZXRXb3JsZFRyYW5zZm9ybV8wPWNhc3Q9SERDCi1PU19TZXRXb3JsZFRyYW5zZm9ybV8xPWNhc3Q9WEZPUk0gKgotCi1PU19TaGVsbEV4ZWN1dGVFeEE9Ci1PU19TaGVsbEV4ZWN1dGVFeEFfMD0KLQotT1NfU2hlbGxFeGVjdXRlRXhXPQotT1NfU2hlbGxFeGVjdXRlRXhXXzA9Y2FzdD0oTFBTSEVMTEVYRUNVVEVJTkZPVykKLQotT1NfU2hlbGxfTm90aWZ5SWNvbkE9Ci1PU19TaGVsbF9Ob3RpZnlJY29uQV8wPQotT1NfU2hlbGxfTm90aWZ5SWNvbkFfMT0KLQotT1NfU2hlbGxfTm90aWZ5SWNvblc9Ci1PU19TaGVsbF9Ob3RpZnlJY29uV18wPQotT1NfU2hlbGxfTm90aWZ5SWNvbldfMT0KLQotT1NfU2hvd0NhcmV0PQotT1NfU2hvd0NhcmV0XzA9Y2FzdD0oSFdORCkKLQotT1NfU2hvd093bmVkUG9wdXBzPQotT1NfU2hvd093bmVkUG9wdXBzXzA9Y2FzdD0oSFdORCkKLU9TX1Nob3dPd25lZFBvcHVwc18xPQotCi1PU19TaG93U2Nyb2xsQmFyPQotT1NfU2hvd1Njcm9sbEJhcl8wPWNhc3Q9KEhXTkQpCi1PU19TaG93U2Nyb2xsQmFyXzE9Ci1PU19TaG93U2Nyb2xsQmFyXzI9Ci0KLU9TX1Nob3dXaW5kb3c9Ci1PU19TaG93V2luZG93XzA9Y2FzdD0oSFdORCkKLU9TX1Nob3dXaW5kb3dfMT0KLQotT1NfU2lwR2V0SW5mbz0KLU9TX1NpcEdldEluZm9fMD0KLQotT1NfU3RhcnREb2NBPQotT1NfU3RhcnREb2NBXzA9Y2FzdD0oSERDKQotT1NfU3RhcnREb2NBXzE9Ci0KLU9TX1N0YXJ0RG9jVz0KLU9TX1N0YXJ0RG9jV18wPWNhc3Q9KEhEQykKLU9TX1N0YXJ0RG9jV18xPWNhc3Q9KExQRE9DSU5GT1cpCi0KLU9TX1N0YXJ0UGFnZT0KLU9TX1N0YXJ0UGFnZV8wPWNhc3Q9KEhEQykKLQotT1NfU3RyZXRjaEJsdD0KLU9TX1N0cmV0Y2hCbHRfMD1jYXN0PShIREMpCi1PU19TdHJldGNoQmx0XzE9Ci1PU19TdHJldGNoQmx0XzI9Ci1PU19TdHJldGNoQmx0XzM9Ci1PU19TdHJldGNoQmx0XzQ9Ci1PU19TdHJldGNoQmx0XzU9Y2FzdD0oSERDKQotT1NfU3RyZXRjaEJsdF82PQotT1NfU3RyZXRjaEJsdF83PQotT1NfU3RyZXRjaEJsdF84PQotT1NfU3RyZXRjaEJsdF85PQotT1NfU3RyZXRjaEJsdF8xMD0KLQotT1NfU3Ryb2tlUGF0aD0KLU9TX1N0cm9rZVBhdGhfMD1jYXN0PShIREMpCi0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8zPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQV8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQV8ySV8xPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU0FfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlfM0lJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSV8zSUlfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlfM0lJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJXzNJSV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSV8zSUlfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1dfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTV18ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1dfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSV8zSUk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJXzNJSV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSV8zSUlfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlfM0lJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJXzNJSV8zPQotCi1PU19Ub0FzY2lpPQotT1NfVG9Bc2NpaV8wPQotT1NfVG9Bc2NpaV8xPQotT1NfVG9Bc2NpaV8yPWNhc3Q9KFBCWVRFKQotT1NfVG9Bc2NpaV8zPWNhc3Q9KExQV09SRCkKLU9TX1RvQXNjaWlfND0KLQotT1NfVG9Vbmljb2RlPQotT1NfVG9Vbmljb2RlXzA9Ci1PU19Ub1VuaWNvZGVfMT0KLU9TX1RvVW5pY29kZV8yPWNhc3Q9KFBCWVRFKQotT1NfVG9Vbmljb2RlXzM9Y2FzdD0oTFBXU1RSKQotT1NfVG9Vbmljb2RlXzQ9Ci1PU19Ub1VuaWNvZGVfNT0KLQotT1NfVHJhY2tNb3VzZUV2ZW50PQotT1NfVHJhY2tNb3VzZUV2ZW50XzA9Ci0KLU9TX1RyYWNrUG9wdXBNZW51PQotT1NfVHJhY2tQb3B1cE1lbnVfMD1jYXN0PShITUVOVSkKLU9TX1RyYWNrUG9wdXBNZW51XzE9Ci1PU19UcmFja1BvcHVwTWVudV8yPQotT1NfVHJhY2tQb3B1cE1lbnVfMz0KLU9TX1RyYWNrUG9wdXBNZW51XzQ9Ci1PU19UcmFja1BvcHVwTWVudV81PWNhc3Q9KEhXTkQpCi1PU19UcmFja1BvcHVwTWVudV82PQotCi1PU19UcmFuc2xhdGVBY2NlbGVyYXRvckE9Ci1PU19UcmFuc2xhdGVBY2NlbGVyYXRvckFfMD1jYXN0PShIV05EKQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JBXzE9Y2FzdD0oSEFDQ0VMKQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JBXzI9Ci0KLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yVz0KLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yV18wPWNhc3Q9KEhXTkQpCi1PU19UcmFuc2xhdGVBY2NlbGVyYXRvcldfMT1jYXN0PShIQUNDRUwpCi1PU19UcmFuc2xhdGVBY2NlbGVyYXRvcldfMj0KLQotT1NfVHJhbnNsYXRlQ2hhcnNldEluZm89Ci1PU19UcmFuc2xhdGVDaGFyc2V0SW5mb18wPWNhc3Q9KERXT1JEICopCi1PU19UcmFuc2xhdGVDaGFyc2V0SW5mb18xPWNhc3Q9KExQQ0hBUlNFVElORk8pCi1PU19UcmFuc2xhdGVDaGFyc2V0SW5mb18yPQotCi1PU19UcmFuc2xhdGVNRElTeXNBY2NlbD0KLU9TX1RyYW5zbGF0ZU1ESVN5c0FjY2VsXzA9Y2FzdD0oSFdORCkKLU9TX1RyYW5zbGF0ZU1ESVN5c0FjY2VsXzE9Y2FzdD0oTFBNU0cpCi0KLU9TX1RyYW5zbGF0ZU1lc3NhZ2U9Ci1PU19UcmFuc2xhdGVNZXNzYWdlXzA9Ci0KLU9TX1RyYW5zcGFyZW50Qmx0PWZsYWdzPWR5bmFtaWMKLU9TX1RyYW5zcGFyZW50Qmx0XzA9Ci1PU19UcmFuc3BhcmVudEJsdF8xPQotT1NfVHJhbnNwYXJlbnRCbHRfMj0KLU9TX1RyYW5zcGFyZW50Qmx0XzM9Ci1PU19UcmFuc3BhcmVudEJsdF80PQotT1NfVHJhbnNwYXJlbnRCbHRfNT0KLU9TX1RyYW5zcGFyZW50Qmx0XzY9Ci1PU19UcmFuc3BhcmVudEJsdF83PQotT1NfVHJhbnNwYXJlbnRCbHRfOD0KLU9TX1RyYW5zcGFyZW50Qmx0Xzk9Ci1PU19UcmFuc3BhcmVudEJsdF8xMD0KLQotT1NfVHJhbnNwYXJlbnRJbWFnZT0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfMD1jYXN0PShIREMpCi1PU19UcmFuc3BhcmVudEltYWdlXzE9Ci1PU19UcmFuc3BhcmVudEltYWdlXzI9Ci1PU19UcmFuc3BhcmVudEltYWdlXzM9Ci1PU19UcmFuc3BhcmVudEltYWdlXzQ9Ci1PU19UcmFuc3BhcmVudEltYWdlXzU9Y2FzdD0oSEFORExFKQotT1NfVHJhbnNwYXJlbnRJbWFnZV82PQotT1NfVHJhbnNwYXJlbnRJbWFnZV83PQotT1NfVHJhbnNwYXJlbnRJbWFnZV84PQotT1NfVHJhbnNwYXJlbnRJbWFnZV85PQotT1NfVHJhbnNwYXJlbnRJbWFnZV8xMD1jYXN0PShDT0xPUlJFRikKLQotT1NfVW5ob29rV2luZG93c0hvb2tFeD0KLU9TX1VuaG9va1dpbmRvd3NIb29rRXhfMD1jYXN0PShISE9PSykKLQotT1NfVW5yZWdpc3RlckNsYXNzQT0KLU9TX1VucmVnaXN0ZXJDbGFzc0FfMD1jYXN0PShMUFNUUikKLU9TX1VucmVnaXN0ZXJDbGFzc0FfMT1jYXN0PShISU5TVEFOQ0UpCi0KLU9TX1VucmVnaXN0ZXJDbGFzc1c9Ci1PU19VbnJlZ2lzdGVyQ2xhc3NXXzA9Y2FzdD0oTFBXU1RSKQotT1NfVW5yZWdpc3RlckNsYXNzV18xPWNhc3Q9KEhJTlNUQU5DRSkKLQotT1NfVXBkYXRlV2luZG93PQotT1NfVXBkYXRlV2luZG93XzA9Y2FzdD0oSFdORCkKLQotT1NfVmFsaWRhdGVSZWN0PQotT1NfVmFsaWRhdGVSZWN0XzA9Y2FzdD0oSFdORCkKLU9TX1ZhbGlkYXRlUmVjdF8xPQotCi1PU19Wa0tleVNjYW5BPQotT1NfVmtLZXlTY2FuQV8wPWNhc3Q9KFRDSEFSKQotCi1PU19Wa0tleVNjYW5XPQotT1NfVmtLZXlTY2FuV18wPWNhc3Q9KFdDSEFSKQotCi1PU19WdGJsQ2FsbF9fSUk9Ci1PU19WdGJsQ2FsbF9fSUlfMD0KLU9TX1Z0YmxDYWxsX19JSV8xPQotCi1PU19WdGJsQ2FsbF9fSUlJPQotT1NfVnRibENhbGxfX0lJSV8wPQotT1NfVnRibENhbGxfX0lJSV8xPQotT1NfVnRibENhbGxfX0lJSV8yPQotCi1PU19WdGJsQ2FsbF9fSUlJSUlfM0k9Ci1PU19WdGJsQ2FsbF9fSUlJSUlfM0lfMD0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zSV8xPQotT1NfVnRibENhbGxfX0lJSUlJXzNJXzI9Ci1PU19WdGJsQ2FsbF9fSUlJSUlfM0lfMz0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zSV80PQotT1NfVnRibENhbGxfX0lJSUlJXzNJXzU9Ci0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJPQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfMD0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJXzE9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV8yPQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfMz0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJXzQ9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV81PQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfNj0KLQotT1NfV2FpdE1lc3NhZ2U9Ci0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfMD0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzE9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl8yPWNhc3Q9KExQQ1dTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfMz0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzQ9Y2FzdD0oTFBTVFIpCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl81PQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfNj1jYXN0PShMUENTVFIpCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl83PWNhc3Q9KExQQk9PTCkKLQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWj0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfMD0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfMT0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfMj1jYXN0PShMUENXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfMz0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfND1jYXN0PShMUFNUUiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfNT0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1pfNj1jYXN0PShMUENTVFIpCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzc9Y2FzdD0oTFBCT09MKQotCi1PU19XaW5kb3dGcm9tREM9Ci1PU19XaW5kb3dGcm9tRENfMD1jYXN0PShIREMpCi0KLU9TX1dpbmRvd0Zyb21Qb2ludD0KLU9TX1dpbmRvd0Zyb21Qb2ludF8wPWZsYWdzPXN0cnVjdAotCi1PU19zdHJsZW49Ci1PU19zdHJsZW5fMD1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX3djc2xlbj0KLU9TX3djc2xlbl8wPWNhc3Q9KGNvbnN0IHdjaGFyX3QgKikKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1NWRVJTSU9OSU5GTz0KLU9TVkVSU0lPTklORk9fZHdPU1ZlcnNpb25JbmZvU2l6ZT0KLU9TVkVSU0lPTklORk9fZHdNYWpvclZlcnNpb249Ci1PU1ZFUlNJT05JTkZPX2R3TWlub3JWZXJzaW9uPQotT1NWRVJTSU9OSU5GT19kd0J1aWxkTnVtYmVyPQotT1NWRVJTSU9OSU5GT19kd1BsYXRmb3JtSWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PU1ZFUlNJT05JTkZPQT0KLU9TVkVSU0lPTklORk9BX3N6Q1NEVmVyc2lvbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9XPQotT1NWRVJTSU9OSU5GT1dfc3pDU0RWZXJzaW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUEFJTlRTVFJVQ1Q9Ci1QQUlOVFNUUlVDVF9oZGM9Y2FzdD0oSERDKQotUEFJTlRTVFJVQ1RfZkVyYXNlPQotUEFJTlRTVFJVQ1RfbGVmdD1hY2Nlc3Nvcj1yY1BhaW50LmxlZnQKLVBBSU5UU1RSVUNUX3RvcD1hY2Nlc3Nvcj1yY1BhaW50LnRvcAotUEFJTlRTVFJVQ1RfcmlnaHQ9YWNjZXNzb3I9cmNQYWludC5yaWdodAotUEFJTlRTVFJVQ1RfYm90dG9tPWFjY2Vzc29yPXJjUGFpbnQuYm90dG9tCi1QQUlOVFNUUlVDVF9mUmVzdG9yZT0KLVBBSU5UU1RSVUNUX2ZJbmNVcGRhdGU9Ci1QQUlOVFNUUlVDVF9yZ2JSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UPQotUE9JTlRfeD0KLVBPSU5UX3k9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QUklOVERMRz0KLVBSSU5URExHX2xTdHJ1Y3RTaXplPQotUFJJTlRETEdfaHduZE93bmVyPWNhc3Q9KEhXTkQpCi1QUklOVERMR19oRGV2TW9kZT1jYXN0PShIR0xPQkFMKQotUFJJTlRETEdfaERldk5hbWVzPWNhc3Q9KEhHTE9CQUwpCi1QUklOVERMR19oREM9Y2FzdD0oSERDKQotUFJJTlRETEdfRmxhZ3M9Ci1QUklOVERMR19uRnJvbVBhZ2U9Ci1QUklOVERMR19uVG9QYWdlPQotUFJJTlRETEdfbk1pblBhZ2U9Ci1QUklOVERMR19uTWF4UGFnZT0KLVBSSU5URExHX25Db3BpZXM9Ci1QUklOVERMR19oSW5zdGFuY2U9Y2FzdD0oSElOU1RBTkNFKQotUFJJTlRETEdfbEN1c3REYXRhPQotUFJJTlRETEdfbHBmblByaW50SG9vaz1jYXN0PShMUFBSSU5USE9PS1BST0MpCi1QUklOVERMR19scGZuU2V0dXBIb29rPWNhc3Q9KExQUFJJTlRIT09LUFJPQykKLVBSSU5URExHX2xwUHJpbnRUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLVBSSU5URExHX2xwU2V0dXBUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLVBSSU5URExHX2hQcmludFRlbXBsYXRlPWNhc3Q9KEhHTE9CQUwpCi1QUklOVERMR19oU2V0dXBUZW1wbGF0ZT1jYXN0PShIR0xPQkFMKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GTz0KLVJFQkFSQkFORElORk9fY2JTaXplPQotUkVCQVJCQU5ESU5GT19mTWFzaz0KLVJFQkFSQkFORElORk9fZlN0eWxlPQotUkVCQVJCQU5ESU5GT19jbHJGb3JlPQotUkVCQVJCQU5ESU5GT19jbHJCYWNrPQotUkVCQVJCQU5ESU5GT19scFRleHQ9Y2FzdD0oTFBUU1RSKQotUkVCQVJCQU5ESU5GT19jY2g9Ci1SRUJBUkJBTkRJTkZPX2lJbWFnZT0KLVJFQkFSQkFORElORk9faHduZENoaWxkPWNhc3Q9KEhXTkQpCi1SRUJBUkJBTkRJTkZPX2N4TWluQ2hpbGQ9Ci1SRUJBUkJBTkRJTkZPX2N5TWluQ2hpbGQ9Ci1SRUJBUkJBTkRJTkZPX2N4PQotUkVCQVJCQU5ESU5GT19oYm1CYWNrPWNhc3Q9KEhCSVRNQVApCi1SRUJBUkJBTkRJTkZPX3dJRD0KLVJFQkFSQkFORElORk9fY3lDaGlsZD0KLVJFQkFSQkFORElORk9fY3lNYXhDaGlsZD0KLVJFQkFSQkFORElORk9fY3lJbnRlZ3JhbD0KLVJFQkFSQkFORElORk9fY3hJZGVhbD0KLVJFQkFSQkFORElORk9fbFBhcmFtPQotUkVCQVJCQU5ESU5GT19jeEhlYWRlcj1mbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVD0KLVJFQ1RfbGVmdD0KLVJFQ1RfdG9wPQotUkVDVF9yaWdodD0KLVJFQ1RfYm90dG9tPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFBTkFMWVNJUz0KLVNDUklQVF9BTkFMWVNJU19lU2NyaXB0PQotU0NSSVBUX0FOQUxZU0lTX2ZSVEw9Ci1TQ1JJUFRfQU5BTFlTSVNfZkxheW91dFJUTD0KLVNDUklQVF9BTkFMWVNJU19mTGlua0JlZm9yZT0KLVNDUklQVF9BTkFMWVNJU19mTGlua0FmdGVyPQotU0NSSVBUX0FOQUxZU0lTX2ZMb2dpY2FsT3JkZXI9Ci1TQ1JJUFRfQU5BTFlTSVNfZk5vR2x5cGhJbmRleD0KLVNDUklQVF9BTkFMWVNJU19zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFDT05UUk9MPQotU0NSSVBUX0NPTlRST0xfdURlZmF1bHRMYW5ndWFnZT0KLVNDUklQVF9DT05UUk9MX2ZDb250ZXh0RGlnaXRzPQotU0NSSVBUX0NPTlRST0xfZkludmVydFByZUJvdW5kRGlyPQotU0NSSVBUX0NPTlRST0xfZkludmVydFBvc3RCb3VuZERpcj0KLVNDUklQVF9DT05UUk9MX2ZMaW5rU3RyaW5nQmVmb3JlPQotU0NSSVBUX0NPTlRST0xfZkxpbmtTdHJpbmdBZnRlcj0KLVNDUklQVF9DT05UUk9MX2ZOZXV0cmFsT3ZlcnJpZGU9Ci1TQ1JJUFRfQ09OVFJPTF9mTnVtZXJpY092ZXJyaWRlPQotU0NSSVBUX0NPTlRST0xfZkxlZ2FjeUJpZGlDbGFzcz0KLVNDUklQVF9DT05UUk9MX2ZSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xRk9OVFBST1BFUlRJRVM9Ci1TQ1JJUFRfRk9OVFBST1BFUlRJRVNfY0J5dGVzPQotU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX3dnQmxhbms9Ci1TQ1JJUFRfRk9OVFBST1BFUlRJRVNfd2dEZWZhdWx0PQotU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX3dnSW52YWxpZD0KLVNDUklQVF9GT05UUFJPUEVSVElFU193Z0thc2hpZGE9Ci1TQ1JJUFRfRk9OVFBST1BFUlRJRVNfaUthc2hpZGFXaWR0aD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xSVRFTT0KLVNDUklQVF9JVEVNX2lDaGFyUG9zPQotU0NSSVBUX0lURU1fYT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xTE9HQVRUUj0KLVNDUklQVF9MT0dBVFRSX2ZTb2Z0QnJlYWs9Ci1TQ1JJUFRfTE9HQVRUUl9mV2hpdGVTcGFjZT0KLVNDUklQVF9MT0dBVFRSX2ZDaGFyU3RvcD0KLVNDUklQVF9MT0dBVFRSX2ZXb3JkU3RvcD0KLVNDUklQVF9MT0dBVFRSX2ZJbnZhbGlkPQotU0NSSVBUX0xPR0FUVFJfZlJlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTPQotU0NSSVBUX1BST1BFUlRJRVNfbGFuZ2lkPQotU0NSSVBUX1BST1BFUlRJRVNfZk51bWVyaWM9Ci1TQ1JJUFRfUFJPUEVSVElFU19mQ29tcGxleD0KLVNDUklQVF9QUk9QRVJUSUVTX2ZOZWVkc1dvcmRCcmVha2luZz0KLVNDUklQVF9QUk9QRVJUSUVTX2ZOZWVkc0NhcmV0SW5mbz0KLVNDUklQVF9QUk9QRVJUSUVTX2JDaGFyU2V0PQotU0NSSVBUX1BST1BFUlRJRVNfZkNvbnRyb2w9Ci1TQ1JJUFRfUFJPUEVSVElFU19mUHJpdmF0ZVVzZUFyZWE9Ci1TQ1JJUFRfUFJPUEVSVElFU19mTmVlZHNDaGFyYWN0ZXJKdXN0aWZ5PQotU0NSSVBUX1BST1BFUlRJRVNfZkludmFsaWRHbHlwaD0KLVNDUklQVF9QUk9QRVJUSUVTX2ZJbnZhbGlkTG9nQXR0cj0KLVNDUklQVF9QUk9QRVJUSUVTX2ZDRE09Ci1TQ1JJUFRfUFJPUEVSVElFU19mQW1iaWd1b3VzQ2hhclNldD0KLVNDUklQVF9QUk9QRVJUSUVTX2ZDbHVzdGVyU2l6ZVZhcmllcz0KLVNDUklQVF9QUk9QRVJUSUVTX2ZSZWplY3RJbnZhbGlkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFTVEFURT0KLVNDUklQVF9TVEFURV91QmlkaUxldmVsPQotU0NSSVBUX1NUQVRFX2ZPdmVycmlkZURpcmVjdGlvbj0KLVNDUklQVF9TVEFURV9mSW5oaWJpdFN5bVN3YXA9Ci1TQ1JJUFRfU1RBVEVfZkNoYXJTaGFwZT0KLVNDUklQVF9TVEFURV9mRGlnaXRTdWJzdGl0dXRlPQotU0NSSVBUX1NUQVRFX2ZJbmhpYml0TGlnYXRlPQotU0NSSVBUX1NUQVRFX2ZEaXNwbGF5WldHPQotU0NSSVBUX1NUQVRFX2ZBcmFiaWNOdW1Db250ZXh0PQotU0NSSVBUX1NUQVRFX2ZHY3BDbHVzdGVycz0KLVNDUklQVF9TVEFURV9mUmVzZXJ2ZWQ9Ci1TQ1JJUFRfU1RBVEVfZkVuZ2luZVJlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NST0xMSU5GTz0KLVNDUk9MTElORk9fY2JTaXplPQotU0NST0xMSU5GT19mTWFzaz0KLVNDUk9MTElORk9fbk1pbj0KLVNDUk9MTElORk9fbk1heD0KLVNDUk9MTElORk9fblBhZ2U9Ci1TQ1JPTExJTkZPX25Qb3M9Ci1TQ1JPTExJTkZPX25UcmFja1Bvcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NIQUNUSVZBVEVJTkZPPQotU0hBQ1RJVkFURUlORk9fY2JTaXplPQotU0hBQ1RJVkFURUlORk9faHduZExhc3RGb2N1cz1jYXN0PShIV05EKQotU0hBQ1RJVkFURUlORk9fZlNpcFVwPQotU0hBQ1RJVkFURUlORk9fZlNpcE9uRGVhY3RpdmF0aW9uPQotU0hBQ1RJVkFURUlORk9fZkFjdGl2ZT0KLVNIQUNUSVZBVEVJTkZPX2ZSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NIRUxMRVhFQ1VURUlORk89Ci1TSEVMTEVYRUNVVEVJTkZPX2NiU2l6ZT0KLVNIRUxMRVhFQ1VURUlORk9fZk1hc2s9Ci1TSEVMTEVYRUNVVEVJTkZPX2h3bmQ9Y2FzdD0oSFdORCkKLVNIRUxMRVhFQ1VURUlORk9fbHBWZXJiPWNhc3Q9KExQQ1RTVFIpCi1TSEVMTEVYRUNVVEVJTkZPX2xwRmlsZT1jYXN0PShMUENUU1RSKQotU0hFTExFWEVDVVRFSU5GT19scFBhcmFtZXRlcnM9Y2FzdD0oTFBDVFNUUikKLVNIRUxMRVhFQ1VURUlORk9fbHBEaXJlY3Rvcnk9Y2FzdD0oTFBDVFNUUikKLVNIRUxMRVhFQ1VURUlORk9fblNob3c9Ci1TSEVMTEVYRUNVVEVJTkZPX2hJbnN0QXBwPWNhc3Q9KEhJTlNUQU5DRSkKLVNIRUxMRVhFQ1VURUlORk9fbHBJRExpc3Q9Y2FzdD0oTFBWT0lEKQotU0hFTExFWEVDVVRFSU5GT19scENsYXNzPWNhc3Q9KExQQ1RTVFIpCi1TSEVMTEVYRUNVVEVJTkZPX2hrZXlDbGFzcz1jYXN0PShIS0VZKQotU0hFTExFWEVDVVRFSU5GT19kd0hvdEtleT0KLVNIRUxMRVhFQ1VURUlORk9faEljb249Y2FzdD0oSEFORExFKQotU0hFTExFWEVDVVRFSU5GT19oUHJvY2Vzcz1jYXN0PShIQU5ETEUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSE1FTlVCQVJJTkZPPQotU0hNRU5VQkFSSU5GT19jYlNpemU9Ci1TSE1FTlVCQVJJTkZPX2h3bmRQYXJlbnQ9Y2FzdD0oSFdORCkKLVNITUVOVUJBUklORk9fZHdGbGFncz0KLVNITUVOVUJBUklORk9fblRvb2xCYXJJZD0KLVNITUVOVUJBUklORk9faEluc3RSZXM9Y2FzdD0oSElOU1RBTkNFKQotU0hNRU5VQkFSSU5GT19uQm1wSWQ9Ci1TSE1FTlVCQVJJTkZPX2NCbXBJbWFnZXM9Ci1TSE1FTlVCQVJJTkZPX2h3bmRNQj1jYXN0PShIV05EKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0hSR0lORk89Ci1TSFJHSU5GT19jYlNpemU9Ci1TSFJHSU5GT19od25kQ2xpZW50PWNhc3Q9KEhXTkQpCi1TSFJHSU5GT19wdERvd25feD1hY2Nlc3Nvcj1wdERvd24ueAotU0hSR0lORk9fcHREb3duX3k9YWNjZXNzb3I9cHREb3duLnkKLVNIUkdJTkZPX2R3RmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVBJTkZPPQotU0lQSU5GT19jYlNpemU9Ci1TSVBJTkZPX2Zkd0ZsYWdzPQotU0lQSU5GT19yY1Zpc2libGVEZXNrdG9wX2xlZnQ9YWNjZXNzb3I9cmNWaXNpYmxlRGVza3RvcC5sZWZ0Ci1TSVBJTkZPX3JjVmlzaWJsZURlc2t0b3BfdG9wPWFjY2Vzc29yPXJjVmlzaWJsZURlc2t0b3AudG9wCi1TSVBJTkZPX3JjVmlzaWJsZURlc2t0b3BfcmlnaHQ9YWNjZXNzb3I9cmNWaXNpYmxlRGVza3RvcC5yaWdodAotU0lQSU5GT19yY1Zpc2libGVEZXNrdG9wX2JvdHRvbT1hY2Nlc3Nvcj1yY1Zpc2libGVEZXNrdG9wLmJvdHRvbQotU0lQSU5GT19yY1NpcFJlY3RfbGVmdD1hY2Nlc3Nvcj1yY1NpcFJlY3QubGVmdAotU0lQSU5GT19yY1NpcFJlY3RfdG9wPWFjY2Vzc29yPXJjU2lwUmVjdC50b3AKLVNJUElORk9fcmNTaXBSZWN0X3JpZ2h0PWFjY2Vzc29yPXJjU2lwUmVjdC5yaWdodAotU0lQSU5GT19yY1NpcFJlY3RfYm90dG9tPWFjY2Vzc29yPXJjU2lwUmVjdC5ib3R0b20KLVNJUElORk9fZHdJbURhdGFTaXplPQotU0lQSU5GT19wdkltRGF0YT1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFPQotU0laRV9jeD0KLVNJWkVfY3k9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTj0KLVRCQlVUVE9OX2lCaXRtYXA9Ci1UQkJVVFRPTl9pZENvbW1hbmQ9Ci1UQkJVVFRPTl9mc1N0YXRlPQotVEJCVVRUT05fZnNTdHlsZT0KLVRCQlVUVE9OX2R3RGF0YT0KLVRCQlVUVE9OX2lTdHJpbmc9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTklORk89Ci1UQkJVVFRPTklORk9fY2JTaXplPQotVEJCVVRUT05JTkZPX2R3TWFzaz0KLVRCQlVUVE9OSU5GT19pZENvbW1hbmQ9Ci1UQkJVVFRPTklORk9faUltYWdlPQotVEJCVVRUT05JTkZPX2ZzU3RhdGU9Ci1UQkJVVFRPTklORk9fZnNTdHlsZT0KLVRCQlVUVE9OSU5GT19jeD0KLVRCQlVUVE9OSU5GT19sUGFyYW09Ci1UQkJVVFRPTklORk9fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1UQkJVVFRPTklORk9fY2NoVGV4dD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSEFSPWZsYWdzPW5vX2dlbgotVENIQVJfY2hhcnM9Ci1UQ0hBUl9ieXRlcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RDSVRFTT0KLVRDSVRFTV9tYXNrPQotVENJVEVNX2R3U3RhdGU9Ci1UQ0lURU1fZHdTdGF0ZU1hc2s9Ci1UQ0lURU1fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1UQ0lURU1fY2NoVGV4dE1heD0KLVRDSVRFTV9pSW1hZ2U9Ci1UQ0lURU1fbFBhcmFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQz0KLVRFWFRNRVRSSUNfdG1IZWlnaHQ9Ci1URVhUTUVUUklDX3RtQXNjZW50PQotVEVYVE1FVFJJQ190bURlc2NlbnQ9Ci1URVhUTUVUUklDX3RtSW50ZXJuYWxMZWFkaW5nPQotVEVYVE1FVFJJQ190bUV4dGVybmFsTGVhZGluZz0KLVRFWFRNRVRSSUNfdG1BdmVDaGFyV2lkdGg9Ci1URVhUTUVUUklDX3RtTWF4Q2hhcldpZHRoPQotVEVYVE1FVFJJQ190bVdlaWdodD0KLVRFWFRNRVRSSUNfdG1PdmVyaGFuZz0KLVRFWFRNRVRSSUNfdG1EaWdpdGl6ZWRBc3BlY3RYPQotVEVYVE1FVFJJQ190bURpZ2l0aXplZEFzcGVjdFk9Ci1URVhUTUVUUklDX3RtSXRhbGljPQotVEVYVE1FVFJJQ190bVVuZGVybGluZWQ9Ci1URVhUTUVUUklDX3RtU3RydWNrT3V0PQotVEVYVE1FVFJJQ190bVBpdGNoQW5kRmFtaWx5PQotVEVYVE1FVFJJQ190bUNoYXJTZXQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDQT0KLVRFWFRNRVRSSUNBX3RtRmlyc3RDaGFyPQotVEVYVE1FVFJJQ0FfdG1MYXN0Q2hhcj0KLVRFWFRNRVRSSUNBX3RtRGVmYXVsdENoYXI9Ci1URVhUTUVUUklDQV90bUJyZWFrQ2hhcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNXPQotVEVYVE1FVFJJQ1dfdG1GaXJzdENoYXI9Ci1URVhUTUVUUklDV190bUxhc3RDaGFyPQotVEVYVE1FVFJJQ1dfdG1EZWZhdWx0Q2hhcj0KLVRFWFRNRVRSSUNXX3RtQnJlYWtDaGFyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk89Ci1UT09MSU5GT19jYlNpemU9Ci1UT09MSU5GT191RmxhZ3M9Ci1UT09MSU5GT19od25kPWNhc3Q9KEhXTkQpCi1UT09MSU5GT191SWQ9Ci1UT09MSU5GT19sZWZ0PWFjY2Vzc29yPXJlY3QubGVmdAotVE9PTElORk9fdG9wPWFjY2Vzc29yPXJlY3QudG9wCi1UT09MSU5GT19yaWdodD1hY2Nlc3Nvcj1yZWN0LnJpZ2h0Ci1UT09MSU5GT19ib3R0b209YWNjZXNzb3I9cmVjdC5ib3R0b20KLVRPT0xJTkZPX2hpbnN0PWNhc3Q9KEhJTlNUQU5DRSkKLVRPT0xJTkZPX2xwc3pUZXh0PWNhc3Q9KExQVFNUUikKLVRPT0xJTkZPX2xQYXJhbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSQUNLTU9VU0VFVkVOVD0KLVRSQUNLTU9VU0VFVkVOVF9jYlNpemU9Ci1UUkFDS01PVVNFRVZFTlRfZHdGbGFncz0KLVRSQUNLTU9VU0VFVkVOVF9od25kVHJhY2s9Y2FzdD0oSFdORCkKLVRSQUNLTU9VU0VFVkVOVF9kd0hvdmVyVGltZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSSVZFUlRFWD0KLVRSSVZFUlRFWF94PQotVFJJVkVSVEVYX3k9Ci1UUklWRVJURVhfUmVkPQotVFJJVkVSVEVYX0dyZWVuPQotVFJJVkVSVEVYX0JsdWU9Ci1UUklWRVJURVhfQWxwaGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPPQotVFZISVRURVNUSU5GT194PWFjY2Vzc29yPXB0LngKLVRWSElUVEVTVElORk9feT1hY2Nlc3Nvcj1wdC55Ci1UVkhJVFRFU1RJTkZPX2ZsYWdzPQotVFZISVRURVNUSU5GT19oSXRlbT1jYXN0PShIVFJFRUlURU0pCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVD0KLVRWSU5TRVJUU1RSVUNUX2hQYXJlbnQ9Y2FzdD0oSFRSRUVJVEVNKQotVFZJTlNFUlRTVFJVQ1RfaEluc2VydEFmdGVyPWNhc3Q9KEhUUkVFSVRFTSkKLVRWSU5TRVJUU1RSVUNUX21hc2s9YWNjZXNzb3I9aXRlbS5tYXNrCi1UVklOU0VSVFNUUlVDVF9oSXRlbT1hY2Nlc3Nvcj1pdGVtLmhJdGVtLGNhc3Q9KEhUUkVFSVRFTSkKLVRWSU5TRVJUU1RSVUNUX3N0YXRlPWFjY2Vzc29yPWl0ZW0uc3RhdGUKLVRWSU5TRVJUU1RSVUNUX3N0YXRlTWFzaz1hY2Nlc3Nvcj1pdGVtLnN0YXRlTWFzawotVFZJTlNFUlRTVFJVQ1RfcHN6VGV4dD1hY2Nlc3Nvcj1pdGVtLnBzelRleHQsY2FzdD0oTFBUU1RSKQotVFZJTlNFUlRTVFJVQ1RfY2NoVGV4dE1heD1hY2Nlc3Nvcj1pdGVtLmNjaFRleHRNYXgKLVRWSU5TRVJUU1RSVUNUX2lJbWFnZT1hY2Nlc3Nvcj1pdGVtLmlJbWFnZQotVFZJTlNFUlRTVFJVQ1RfaVNlbGVjdGVkSW1hZ2U9YWNjZXNzb3I9aXRlbS5pU2VsZWN0ZWRJbWFnZQotVFZJTlNFUlRTVFJVQ1RfY0NoaWxkcmVuPWFjY2Vzc29yPWl0ZW0uY0NoaWxkcmVuCi1UVklOU0VSVFNUUlVDVF9sUGFyYW09YWNjZXNzb3I9aXRlbS5sUGFyYW0KLVRWSU5TRVJUU1RSVUNUX2lJbnRlZ3JhbD1hY2Nlc3Nvcj1pdGVtZXguaUludGVncmFsLGZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU09Ci1UVklURU1fbWFzaz0KLVRWSVRFTV9oSXRlbT1jYXN0PShIVFJFRUlURU0pCi1UVklURU1fc3RhdGU9Ci1UVklURU1fc3RhdGVNYXNrPQotVFZJVEVNX3BzelRleHQ9Y2FzdD0oTFBUU1RSKQotVFZJVEVNX2NjaFRleHRNYXg9Ci1UVklURU1faUltYWdlPQotVFZJVEVNX2lTZWxlY3RlZEltYWdlPQotVFZJVEVNX2NDaGlsZHJlbj0KLVRWSVRFTV9sUGFyYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1FWD0KLVRWSVRFTUVYX2lJbnRlZ3JhbD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUw9Ci1VREFDQ0VMX25TZWM9Ci1VREFDQ0VMX25JbmM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQTEFDRU1FTlQ9Ci1XSU5ET1dQTEFDRU1FTlRfbGVuZ3RoPQotV0lORE9XUExBQ0VNRU5UX2ZsYWdzPQotV0lORE9XUExBQ0VNRU5UX3Nob3dDbWQ9Ci1XSU5ET1dQTEFDRU1FTlRfcHRNaW5Qb3NpdGlvbl94PWFjY2Vzc29yPXB0TWluUG9zaXRpb24ueAotV0lORE9XUExBQ0VNRU5UX3B0TWluUG9zaXRpb25feT1hY2Nlc3Nvcj1wdE1pblBvc2l0aW9uLnkKLVdJTkRPV1BMQUNFTUVOVF9wdE1heFBvc2l0aW9uX3g9YWNjZXNzb3I9cHRNYXhQb3NpdGlvbi54Ci1XSU5ET1dQTEFDRU1FTlRfcHRNYXhQb3NpdGlvbl95PWFjY2Vzc29yPXB0TWF4UG9zaXRpb24ueQotV0lORE9XUExBQ0VNRU5UX2xlZnQ9YWNjZXNzb3I9cmNOb3JtYWxQb3NpdGlvbi5sZWZ0Ci1XSU5ET1dQTEFDRU1FTlRfdG9wPWFjY2Vzc29yPXJjTm9ybWFsUG9zaXRpb24udG9wCi1XSU5ET1dQTEFDRU1FTlRfcmlnaHQ9YWNjZXNzb3I9cmNOb3JtYWxQb3NpdGlvbi5yaWdodAotV0lORE9XUExBQ0VNRU5UX2JvdHRvbT1hY2Nlc3Nvcj1yY05vcm1hbFBvc2l0aW9uLmJvdHRvbQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TPQotV0lORE9XUE9TX2h3bmQ9Y2FzdD0oSFdORCkKLVdJTkRPV1BPU19od25kSW5zZXJ0QWZ0ZXI9Y2FzdD0oSFdORCkKLVdJTkRPV1BPU194PQotV0lORE9XUE9TX3k9Ci1XSU5ET1dQT1NfY3g9Ci1XSU5ET1dQT1NfY3k9Ci1XSU5ET1dQT1NfZmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XTkRDTEFTUz0KLVdORENMQVNTX3N0eWxlPQotV05EQ0xBU1NfbHBmblduZFByb2M9Y2FzdD0oV05EUFJPQykKLVdORENMQVNTX2NiQ2xzRXh0cmE9Ci1XTkRDTEFTU19jYlduZEV4dHJhPQotV05EQ0xBU1NfaEluc3RhbmNlPWNhc3Q9KEhJTlNUQU5DRSkKLVdORENMQVNTX2hJY29uPWNhc3Q9KEhJQ09OKQotV05EQ0xBU1NfaEN1cnNvcj1jYXN0PShIQ1VSU09SKQotV05EQ0xBU1NfaGJyQmFja2dyb3VuZD1jYXN0PShIQlJVU0gpCi1XTkRDTEFTU19scHN6TWVudU5hbWU9Y2FzdD0oTFBDVFNUUikKLVdORENMQVNTX2xwc3pDbGFzc05hbWU9Y2FzdD0oTFBDVFNUUikKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0wucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTI3YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3NzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTD0KLUdMX2dsQWNjdW09Ci1HTF9nbEFjY3VtXzA9Ci1HTF9nbEFjY3VtXzE9Ci0KLUdMX2dsQWxwaGFGdW5jPQotR0xfZ2xBbHBoYUZ1bmNfMD0KLUdMX2dsQWxwaGFGdW5jXzE9Ci0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudD0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudF8wPQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50XzE9Y2FzdD0oY29uc3QgR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnRfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEFycmF5RWxlbWVudD0KLUdMX2dsQXJyYXlFbGVtZW50XzA9Ci0KLUdMX2dsQmVnaW49Ci1HTF9nbEJlZ2luXzA9Ci0KLUdMX2dsQmluZFRleHR1cmU9Ci1HTF9nbEJpbmRUZXh0dXJlXzA9Ci1HTF9nbEJpbmRUZXh0dXJlXzE9Ci0KLUdMX2dsQml0bWFwPQotR0xfZ2xCaXRtYXBfMD0KLUdMX2dsQml0bWFwXzE9Ci1HTF9nbEJpdG1hcF8yPQotR0xfZ2xCaXRtYXBfMz0KLUdMX2dsQml0bWFwXzQ9Ci1HTF9nbEJpdG1hcF81PQotR0xfZ2xCaXRtYXBfNj1jYXN0PShjb25zdCBHTHVieXRlICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQmxlbmRGdW5jPQotR0xfZ2xCbGVuZEZ1bmNfMD0KLUdMX2dsQmxlbmRGdW5jXzE9Ci0KLUdMX2dsQ2FsbExpc3Q9Ci1HTF9nbENhbGxMaXN0XzA9Ci0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQj0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQl8wPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCXzE9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0JfMj0KLQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDXzA9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0NfMT0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQ18yPQotCi1HTF9nbENhbGxMaXN0c19fSUlfM0k9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0lfMD0KLUdMX2dsQ2FsbExpc3RzX19JSV8zSV8xPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJXzI9Ci0KLUdMX2dsQ2xlYXI9Ci1HTF9nbENsZWFyXzA9Ci0KLUdMX2dsQ2xlYXJBY2N1bT0KLUdMX2dsQ2xlYXJBY2N1bV8wPQotR0xfZ2xDbGVhckFjY3VtXzE9Ci1HTF9nbENsZWFyQWNjdW1fMj0KLUdMX2dsQ2xlYXJBY2N1bV8zPQotCi1HTF9nbENsZWFyQ29sb3I9Ci1HTF9nbENsZWFyQ29sb3JfMD0KLUdMX2dsQ2xlYXJDb2xvcl8xPQotR0xfZ2xDbGVhckNvbG9yXzI9Ci1HTF9nbENsZWFyQ29sb3JfMz0KLQotR0xfZ2xDbGVhckRlcHRoPQotR0xfZ2xDbGVhckRlcHRoXzA9Ci0KLUdMX2dsQ2xlYXJJbmRleD0KLUdMX2dsQ2xlYXJJbmRleF8wPQotCi1HTF9nbENsZWFyU3RlbmNpbD0KLUdMX2dsQ2xlYXJTdGVuY2lsXzA9Ci0KLUdMX2dsQ2xpcFBsYW5lPQotR0xfZ2xDbGlwUGxhbmVfMD0KLUdMX2dsQ2xpcFBsYW5lXzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjNiPQotR0xfZ2xDb2xvcjNiXzA9Ci1HTF9nbENvbG9yM2JfMT0KLUdMX2dsQ29sb3IzYl8yPQotCi1HTF9nbENvbG9yM2J2PQotR0xfZ2xDb2xvcjNidl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzZD0KLUdMX2dsQ29sb3IzZF8wPQotR0xfZ2xDb2xvcjNkXzE9Ci1HTF9nbENvbG9yM2RfMj0KLQotR0xfZ2xDb2xvcjNkdj0KLUdMX2dsQ29sb3IzZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM2Y9Ci1HTF9nbENvbG9yM2ZfMD0KLUdMX2dsQ29sb3IzZl8xPQotR0xfZ2xDb2xvcjNmXzI9Ci0KLUdMX2dsQ29sb3IzZnY9Ci1HTF9nbENvbG9yM2Z2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjNpPQotR0xfZ2xDb2xvcjNpXzA9Ci1HTF9nbENvbG9yM2lfMT0KLUdMX2dsQ29sb3IzaV8yPQotCi1HTF9nbENvbG9yM2l2PQotR0xfZ2xDb2xvcjNpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3Izcz0KLUdMX2dsQ29sb3Izc18wPQotR0xfZ2xDb2xvcjNzXzE9Ci1HTF9nbENvbG9yM3NfMj0KLQotR0xfZ2xDb2xvcjNzdj0KLUdMX2dsQ29sb3Izc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM3ViPQotR0xfZ2xDb2xvcjN1Yl8wPQotR0xfZ2xDb2xvcjN1Yl8xPQotR0xfZ2xDb2xvcjN1Yl8yPQotCi1HTF9nbENvbG9yM3Vidj0KLUdMX2dsQ29sb3IzdWJ2XzA9Y2FzdD0oY29uc3QgR0x1Ynl0ZSAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM3VpPQotR0xfZ2xDb2xvcjN1aV8wPQotR0xfZ2xDb2xvcjN1aV8xPQotR0xfZ2xDb2xvcjN1aV8yPQotCi1HTF9nbENvbG9yM3Vpdj0KLUdMX2dsQ29sb3IzdWl2XzA9Y2FzdD0oY29uc3QgR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzdXM9Ci1HTF9nbENvbG9yM3VzXzA9Ci1HTF9nbENvbG9yM3VzXzE9Ci1HTF9nbENvbG9yM3VzXzI9Ci0KLUdMX2dsQ29sb3IzdXN2PQotR0xfZ2xDb2xvcjN1c3ZfMD1jYXN0PShjb25zdCBHTHVzaG9ydCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yNGI9Ci1HTF9nbENvbG9yNGJfMD0KLUdMX2dsQ29sb3I0Yl8xPQotR0xfZ2xDb2xvcjRiXzI9Ci1HTF9nbENvbG9yNGJfMz0KLQotR0xfZ2xDb2xvcjRidj0KLUdMX2dsQ29sb3I0YnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yNGQ9Ci1HTF9nbENvbG9yNGRfMD0KLUdMX2dsQ29sb3I0ZF8xPQotR0xfZ2xDb2xvcjRkXzI9Ci1HTF9nbENvbG9yNGRfMz0KLQotR0xfZ2xDb2xvcjRkdj0KLUdMX2dsQ29sb3I0ZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yNGY9Ci1HTF9nbENvbG9yNGZfMD0KLUdMX2dsQ29sb3I0Zl8xPQotR0xfZ2xDb2xvcjRmXzI9Ci1HTF9nbENvbG9yNGZfMz0KLQotR0xfZ2xDb2xvcjRmdj0KLUdMX2dsQ29sb3I0ZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yNGk9Ci1HTF9nbENvbG9yNGlfMD0KLUdMX2dsQ29sb3I0aV8xPQotR0xfZ2xDb2xvcjRpXzI9Ci1HTF9nbENvbG9yNGlfMz0KLQotR0xfZ2xDb2xvcjRpdj0KLUdMX2dsQ29sb3I0aXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yNHM9Ci1HTF9nbENvbG9yNHNfMD0KLUdMX2dsQ29sb3I0c18xPQotR0xfZ2xDb2xvcjRzXzI9Ci1HTF9nbENvbG9yNHNfMz0KLQotR0xfZ2xDb2xvcjR1Yj0KLUdMX2dsQ29sb3I0dWJfMD0KLUdMX2dsQ29sb3I0dWJfMT0KLUdMX2dsQ29sb3I0dWJfMj0KLUdMX2dsQ29sb3I0dWJfMz0KLQotR0xfZ2xDb2xvcjR1YnY9Ci1HTF9nbENvbG9yNHVidl8wPQotCi1HTF9nbENvbG9yNHVpPQotR0xfZ2xDb2xvcjR1aV8wPQotR0xfZ2xDb2xvcjR1aV8xPQotR0xfZ2xDb2xvcjR1aV8yPQotR0xfZ2xDb2xvcjR1aV8zPQotCi1HTF9nbENvbG9yNHVpdj0KLUdMX2dsQ29sb3I0dWl2XzA9Y2FzdD0oY29uc3QgR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3I0dXM9Ci1HTF9nbENvbG9yNHVzXzA9Ci1HTF9nbENvbG9yNHVzXzE9Ci1HTF9nbENvbG9yNHVzXzI9Ci1HTF9nbENvbG9yNHVzXzM9Ci0KLUdMX2dsQ29sb3I0dXN2PQotR0xfZ2xDb2xvcjR1c3ZfMD1jYXN0PShjb25zdCBHTHVzaG9ydCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yTWFzaz0KLUdMX2dsQ29sb3JNYXNrXzA9Ci1HTF9nbENvbG9yTWFza18xPQotR0xfZ2xDb2xvck1hc2tfMj0KLUdMX2dsQ29sb3JNYXNrXzM9Ci0KLUdMX2dsQ29sb3JNYXRlcmlhbD0KLUdMX2dsQ29sb3JNYXRlcmlhbF8wPQotR0xfZ2xDb2xvck1hdGVyaWFsXzE9Ci0KLUdMX2dsQ29sb3JQb2ludGVyPQotR0xfZ2xDb2xvclBvaW50ZXJfMD0KLUdMX2dsQ29sb3JQb2ludGVyXzE9Ci1HTF9nbENvbG9yUG9pbnRlcl8yPQotR0xfZ2xDb2xvclBvaW50ZXJfMz1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvcHlQaXhlbHM9Ci1HTF9nbENvcHlQaXhlbHNfMD0KLUdMX2dsQ29weVBpeGVsc18xPQotR0xfZ2xDb3B5UGl4ZWxzXzI9Ci1HTF9nbENvcHlQaXhlbHNfMz0KLUdMX2dsQ29weVBpeGVsc180PQotCi1HTF9nbENvcHlUZXhJbWFnZTFEPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8wPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8xPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8yPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8zPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF80PQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF81PQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF82PQotCi1HTF9nbENvcHlUZXhJbWFnZTJEPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8wPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8xPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8yPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8zPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF80PQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF81PQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF82PQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF83PQotCi1HTF9nbENvcHlUZXhTdWJJbWFnZTFEPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8wPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8xPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8yPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8zPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF80PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF81PQotCi1HTF9nbENvcHlUZXhTdWJJbWFnZTJEPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8wPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8xPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8yPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8zPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF80PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF81PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF82PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF83PQotCi1HTF9nbEN1bGxGYWNlPQotR0xfZ2xDdWxsRmFjZV8wPQotCi1HTF9nbERlbGV0ZUxpc3RzPQotR0xfZ2xEZWxldGVMaXN0c18wPQotR0xfZ2xEZWxldGVMaXN0c18xPQotCi1HTF9nbERlbGV0ZVRleHR1cmVzPQotR0xfZ2xEZWxldGVUZXh0dXJlc18wPQotR0xfZ2xEZWxldGVUZXh0dXJlc18xPWNhc3Q9KGNvbnN0IEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbERlcHRoRnVuYz0KLUdMX2dsRGVwdGhGdW5jXzA9Ci0KLUdMX2dsRGVwdGhNYXNrPQotR0xfZ2xEZXB0aE1hc2tfMD0KLQotR0xfZ2xEZXB0aFJhbmdlPQotR0xfZ2xEZXB0aFJhbmdlXzA9Ci1HTF9nbERlcHRoUmFuZ2VfMT0KLQotR0xfZ2xEaXNhYmxlPQotR0xfZ2xEaXNhYmxlXzA9Ci0KLUdMX2dsRGlzYWJsZUNsaWVudFN0YXRlPQotR0xfZ2xEaXNhYmxlQ2xpZW50U3RhdGVfMD0KLQotR0xfZ2xEcmF3QXJyYXlzPQotR0xfZ2xEcmF3QXJyYXlzXzA9Ci1HTF9nbERyYXdBcnJheXNfMT0KLUdMX2dsRHJhd0FycmF5c18yPQotCi1HTF9nbERyYXdCdWZmZXI9Ci1HTF9nbERyYXdCdWZmZXJfMD0KLQotR0xfZ2xEcmF3RWxlbWVudHM9Ci1HTF9nbERyYXdFbGVtZW50c18wPQotR0xfZ2xEcmF3RWxlbWVudHNfMT0KLUdMX2dsRHJhd0VsZW1lbnRzXzI9Ci1HTF9nbERyYXdFbGVtZW50c18zPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRHJhd1BpeGVscz0KLUdMX2dsRHJhd1BpeGVsc18wPQotR0xfZ2xEcmF3UGl4ZWxzXzE9Ci1HTF9nbERyYXdQaXhlbHNfMj0KLUdMX2dsRHJhd1BpeGVsc18zPQotR0xfZ2xEcmF3UGl4ZWxzXzQ9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFZGdlRmxhZz0KLUdMX2dsRWRnZUZsYWdfMD0KLQotR0xfZ2xFZGdlRmxhZ1BvaW50ZXI9Ci1HTF9nbEVkZ2VGbGFnUG9pbnRlcl8wPQotR0xfZ2xFZGdlRmxhZ1BvaW50ZXJfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEVkZ2VGbGFndj0KLUdMX2dsRWRnZUZsYWd2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFbmFibGU9Ci1HTF9nbEVuYWJsZV8wPQotCi1HTF9nbEVuYWJsZUNsaWVudFN0YXRlPQotR0xfZ2xFbmFibGVDbGllbnRTdGF0ZV8wPQotCi1HTF9nbEVuZD0KLQotR0xfZ2xFbmRMaXN0PQotCi1HTF9nbEV2YWxDb29yZDFkPQotR0xfZ2xFdmFsQ29vcmQxZF8wPQotCi1HTF9nbEV2YWxDb29yZDFkdj0KLUdMX2dsRXZhbENvb3JkMWR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFdmFsQ29vcmQxZj0KLUdMX2dsRXZhbENvb3JkMWZfMD0KLQotR0xfZ2xFdmFsQ29vcmQxZnY9Ci1HTF9nbEV2YWxDb29yZDFmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRXZhbENvb3JkMmQ9Ci1HTF9nbEV2YWxDb29yZDJkXzA9Ci1HTF9nbEV2YWxDb29yZDJkXzE9Ci0KLUdMX2dsRXZhbENvb3JkMmR2PQotR0xfZ2xFdmFsQ29vcmQyZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEV2YWxDb29yZDJmPQotR0xfZ2xFdmFsQ29vcmQyZl8wPQotR0xfZ2xFdmFsQ29vcmQyZl8xPQotCi1HTF9nbEV2YWxDb29yZDJmdj0KLUdMX2dsRXZhbENvb3JkMmZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFdmFsTWVzaDE9Ci1HTF9nbEV2YWxNZXNoMV8wPQotR0xfZ2xFdmFsTWVzaDFfMT0KLUdMX2dsRXZhbE1lc2gxXzI9Ci0KLUdMX2dsRXZhbE1lc2gyPQotR0xfZ2xFdmFsTWVzaDJfMD0KLUdMX2dsRXZhbE1lc2gyXzE9Ci1HTF9nbEV2YWxNZXNoMl8yPQotR0xfZ2xFdmFsTWVzaDJfMz0KLUdMX2dsRXZhbE1lc2gyXzQ9Ci0KLUdMX2dsRXZhbFBvaW50MT0KLUdMX2dsRXZhbFBvaW50MV8wPQotCi1HTF9nbEV2YWxQb2ludDI9Ci1HTF9nbEV2YWxQb2ludDJfMD0KLUdMX2dsRXZhbFBvaW50Ml8xPQotCi1HTF9nbEZlZWRiYWNrQnVmZmVyPQotR0xfZ2xGZWVkYmFja0J1ZmZlcl8wPQotR0xfZ2xGZWVkYmFja0J1ZmZlcl8xPQotR0xfZ2xGZWVkYmFja0J1ZmZlcl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRmluaXNoPQotCi1HTF9nbEZsdXNoPQotCi1HTF9nbEZvZ2Y9Ci1HTF9nbEZvZ2ZfMD0KLUdMX2dsRm9nZl8xPQotCi1HTF9nbEZvZ2Z2PQotR0xfZ2xGb2dmdl8wPQotR0xfZ2xGb2dmdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRm9naT0KLUdMX2dsRm9naV8wPQotR0xfZ2xGb2dpXzE9Ci0KLUdMX2dsRm9naXY9Ci1HTF9nbEZvZ2l2XzA9Ci1HTF9nbEZvZ2l2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xGcm9udEZhY2U9Ci1HTF9nbEZyb250RmFjZV8wPQotCi1HTF9nbEZydXN0dW09Ci1HTF9nbEZydXN0dW1fMD0KLUdMX2dsRnJ1c3R1bV8xPQotR0xfZ2xGcnVzdHVtXzI9Ci1HTF9nbEZydXN0dW1fMz0KLUdMX2dsRnJ1c3R1bV80PQotR0xfZ2xGcnVzdHVtXzU9Ci0KLUdMX2dsR2VuTGlzdHM9Ci1HTF9nbEdlbkxpc3RzXzA9Ci0KLUdMX2dsR2VuVGV4dHVyZXM9Ci1HTF9nbEdlblRleHR1cmVzXzA9Ci1HTF9nbEdlblRleHR1cmVzXzE9Y2FzdD0oR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0Qm9vbGVhbnY9Ci1HTF9nbEdldEJvb2xlYW52XzA9Ci1HTF9nbEdldEJvb2xlYW52XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRDbGlwUGxhbmU9Ci1HTF9nbEdldENsaXBQbGFuZV8wPQotR0xfZ2xHZXRDbGlwUGxhbmVfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldERvdWJsZXY9Ci1HTF9nbEdldERvdWJsZXZfMD0KLUdMX2dsR2V0RG91Ymxldl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0RXJyb3I9Ci0KLUdMX2dsR2V0RmxvYXR2PQotR0xfZ2xHZXRGbG9hdHZfMD0KLUdMX2dsR2V0RmxvYXR2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRJbnRlZ2Vydj0KLUdMX2dsR2V0SW50ZWdlcnZfMD0KLUdMX2dsR2V0SW50ZWdlcnZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldExpZ2h0ZnY9Ci1HTF9nbEdldExpZ2h0ZnZfMD0KLUdMX2dsR2V0TGlnaHRmdl8xPQotR0xfZ2xHZXRMaWdodGZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRMaWdodGl2PQotR0xfZ2xHZXRMaWdodGl2XzA9Ci1HTF9nbEdldExpZ2h0aXZfMT0KLUdMX2dsR2V0TGlnaHRpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TWFwZHY9Ci1HTF9nbEdldE1hcGR2XzA9Ci1HTF9nbEdldE1hcGR2XzE9Ci1HTF9nbEdldE1hcGR2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRNYXBmdj0KLUdMX2dsR2V0TWFwZnZfMD0KLUdMX2dsR2V0TWFwZnZfMT0KLUdMX2dsR2V0TWFwZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldE1hcGl2PQotR0xfZ2xHZXRNYXBpdl8wPQotR0xfZ2xHZXRNYXBpdl8xPQotR0xfZ2xHZXRNYXBpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TWF0ZXJpYWxmdj0KLUdMX2dsR2V0TWF0ZXJpYWxmdl8wPQotR0xfZ2xHZXRNYXRlcmlhbGZ2XzE9Ci1HTF9nbEdldE1hdGVyaWFsZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldE1hdGVyaWFsaXY9Ci1HTF9nbEdldE1hdGVyaWFsaXZfMD0KLUdMX2dsR2V0TWF0ZXJpYWxpdl8xPQotR0xfZ2xHZXRNYXRlcmlhbGl2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRQaXhlbE1hcGZ2PQotR0xfZ2xHZXRQaXhlbE1hcGZ2XzA9Ci1HTF9nbEdldFBpeGVsTWFwZnZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFBpeGVsTWFwdWl2PQotR0xfZ2xHZXRQaXhlbE1hcHVpdl8wPQotR0xfZ2xHZXRQaXhlbE1hcHVpdl8xPWNhc3Q9KEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFBpeGVsTWFwdXN2PQotR0xfZ2xHZXRQaXhlbE1hcHVzdl8wPQotR0xfZ2xHZXRQaXhlbE1hcHVzdl8xPWNhc3Q9KEdMdXNob3J0ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0UG9pbnRlcnY9Ci1HTF9nbEdldFBvaW50ZXJ2XzA9Ci1HTF9nbEdldFBvaW50ZXJ2XzE9Y2FzdD0oR0x2b2lkICoqKQotCi1HTF9nbEdldFBvbHlnb25TdGlwcGxlPQotR0xfZ2xHZXRQb2x5Z29uU3RpcHBsZV8wPWNhc3Q9KEdMdWJ5dGUgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRTdHJpbmc9Ci1HTF9nbEdldFN0cmluZ18wPQotCi1HTF9nbEdldFRleEVudmZ2PQotR0xfZ2xHZXRUZXhFbnZmdl8wPQotR0xfZ2xHZXRUZXhFbnZmdl8xPQotR0xfZ2xHZXRUZXhFbnZmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4RW52aXY9Ci1HTF9nbEdldFRleEVudml2XzA9Ci1HTF9nbEdldFRleEVudml2XzE9Ci1HTF9nbEdldFRleEVudml2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhHZW5kdj0KLUdMX2dsR2V0VGV4R2VuZHZfMD0KLUdMX2dsR2V0VGV4R2VuZHZfMT0KLUdMX2dsR2V0VGV4R2VuZHZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleEdlbmZ2PQotR0xfZ2xHZXRUZXhHZW5mdl8wPQotR0xfZ2xHZXRUZXhHZW5mdl8xPQotR0xfZ2xHZXRUZXhHZW5mdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4R2VuaXY9Ci1HTF9nbEdldFRleEdlbml2XzA9Ci1HTF9nbEdldFRleEdlbml2XzE9Ci1HTF9nbEdldFRleEdlbml2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhJbWFnZT0KLUdMX2dsR2V0VGV4SW1hZ2VfMD0KLUdMX2dsR2V0VGV4SW1hZ2VfMT0KLUdMX2dsR2V0VGV4SW1hZ2VfMj0KLUdMX2dsR2V0VGV4SW1hZ2VfMz0KLUdMX2dsR2V0VGV4SW1hZ2VfND1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnY9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMD0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8xPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzI9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMz1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXY9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMD0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8xPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzI9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMz1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleFBhcmFtZXRlcmZ2PQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdl8wPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdl8xPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXY9Ci1HTF9nbEdldFRleFBhcmFtZXRlcml2XzA9Ci1HTF9nbEdldFRleFBhcmFtZXRlcml2XzE9Ci1HTF9nbEdldFRleFBhcmFtZXRlcml2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xIaW50PQotR0xfZ2xIaW50XzA9Ci1HTF9nbEhpbnRfMT0KLQotR0xfZ2xJbmRleE1hc2s9Ci1HTF9nbEluZGV4TWFza18wPQotCi1HTF9nbEluZGV4UG9pbnRlcj0KLUdMX2dsSW5kZXhQb2ludGVyXzA9Ci1HTF9nbEluZGV4UG9pbnRlcl8xPQotR0xfZ2xJbmRleFBvaW50ZXJfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEluZGV4ZD0KLUdMX2dsSW5kZXhkXzA9Ci0KLUdMX2dsSW5kZXhkdj0KLUdMX2dsSW5kZXhkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSW5kZXhmPQotR0xfZ2xJbmRleGZfMD0KLQotR0xfZ2xJbmRleGZ2PQotR0xfZ2xJbmRleGZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xJbmRleGk9Ci1HTF9nbEluZGV4aV8wPQotCi1HTF9nbEluZGV4aXY9Ci1HTF9nbEluZGV4aXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEluZGV4cz0KLUdMX2dsSW5kZXhzXzA9Ci0KLUdMX2dsSW5kZXhzdj0KLUdMX2dsSW5kZXhzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSW5pdE5hbWVzPQotCi1HTF9nbEludGVybGVhdmVkQXJyYXlzPQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5c18wPQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5c18xPQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5c18yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSXNFbmFibGVkPQotR0xfZ2xJc0VuYWJsZWRfMD0KLQotR0xfZ2xJc0xpc3Q9Ci1HTF9nbElzTGlzdF8wPQotCi1HTF9nbElzVGV4dHVyZT0KLUdMX2dsSXNUZXh0dXJlXzA9Ci0KLUdMX2dsTGlnaHRNb2RlbGY9Ci1HTF9nbExpZ2h0TW9kZWxmXzA9Ci1HTF9nbExpZ2h0TW9kZWxmXzE9Ci0KLUdMX2dsTGlnaHRNb2RlbGZ2PQotR0xfZ2xMaWdodE1vZGVsZnZfMD0KLUdMX2dsTGlnaHRNb2RlbGZ2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xMaWdodE1vZGVsaT0KLUdMX2dsTGlnaHRNb2RlbGlfMD0KLUdMX2dsTGlnaHRNb2RlbGlfMT0KLQotR0xfZ2xMaWdodE1vZGVsaXY9Ci1HTF9nbExpZ2h0TW9kZWxpdl8wPQotR0xfZ2xMaWdodE1vZGVsaXZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbExpZ2h0Zj0KLUdMX2dsTGlnaHRmXzA9Ci1HTF9nbExpZ2h0Zl8xPQotR0xfZ2xMaWdodGZfMj0KLQotR0xfZ2xMaWdodGZ2PQotR0xfZ2xMaWdodGZ2XzA9Ci1HTF9nbExpZ2h0ZnZfMT0KLUdMX2dsTGlnaHRmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTGlnaHRpPQotR0xfZ2xMaWdodGlfMD0KLUdMX2dsTGlnaHRpXzE9Ci1HTF9nbExpZ2h0aV8yPQotCi1HTF9nbExpZ2h0aXY9Ci1HTF9nbExpZ2h0aXZfMD0KLUdMX2dsTGlnaHRpdl8xPQotR0xfZ2xMaWdodGl2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xMaW5lU3RpcHBsZT0KLUdMX2dsTGluZVN0aXBwbGVfMD0KLUdMX2dsTGluZVN0aXBwbGVfMT0KLQotR0xfZ2xMaW5lV2lkdGg9Ci1HTF9nbExpbmVXaWR0aF8wPQotCi1HTF9nbExpc3RCYXNlPQotR0xfZ2xMaXN0QmFzZV8wPQotCi1HTF9nbExvYWRJZGVudGl0eT0KLQotR0xfZ2xMb2FkTWF0cml4ZD0KLUdMX2dsTG9hZE1hdHJpeGRfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbExvYWRNYXRyaXhmPQotR0xfZ2xMb2FkTWF0cml4Zl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTG9hZE5hbWU9Ci1HTF9nbExvYWROYW1lXzA9Ci0KLUdMX2dsTG9naWNPcD0KLUdMX2dsTG9naWNPcF8wPQotCi1HTF9nbE1hcDFkPQotR0xfZ2xNYXAxZF8wPQotR0xfZ2xNYXAxZF8xPQotR0xfZ2xNYXAxZF8yPQotR0xfZ2xNYXAxZF8zPQotR0xfZ2xNYXAxZF80PQotR0xfZ2xNYXAxZF81PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTWFwMWY9Ci1HTF9nbE1hcDFmXzA9Ci1HTF9nbE1hcDFmXzE9Ci1HTF9nbE1hcDFmXzI9Ci1HTF9nbE1hcDFmXzM9Ci1HTF9nbE1hcDFmXzQ9Ci1HTF9nbE1hcDFmXzU9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNYXAyZD0KLUdMX2dsTWFwMmRfMD0KLUdMX2dsTWFwMmRfMT0KLUdMX2dsTWFwMmRfMj0KLUdMX2dsTWFwMmRfMz0KLUdMX2dsTWFwMmRfND0KLUdMX2dsTWFwMmRfNT0KLUdMX2dsTWFwMmRfNj0KLUdMX2dsTWFwMmRfNz0KLUdMX2dsTWFwMmRfOD0KLUdMX2dsTWFwMmRfOT1mbGFncz1jcml0aWNhbAotCi1HTF9nbE1hcDJmPQotR0xfZ2xNYXAyZl8wPQotR0xfZ2xNYXAyZl8xPQotR0xfZ2xNYXAyZl8yPQotR0xfZ2xNYXAyZl8zPQotR0xfZ2xNYXAyZl80PQotR0xfZ2xNYXAyZl81PQotR0xfZ2xNYXAyZl82PQotR0xfZ2xNYXAyZl83PQotR0xfZ2xNYXAyZl84PQotR0xfZ2xNYXAyZl85PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTWFwR3JpZDFkPQotR0xfZ2xNYXBHcmlkMWRfMD0KLUdMX2dsTWFwR3JpZDFkXzE9Ci1HTF9nbE1hcEdyaWQxZF8yPQotCi1HTF9nbE1hcEdyaWQxZj0KLUdMX2dsTWFwR3JpZDFmXzA9Ci1HTF9nbE1hcEdyaWQxZl8xPQotR0xfZ2xNYXBHcmlkMWZfMj0KLQotR0xfZ2xNYXBHcmlkMmQ9Ci1HTF9nbE1hcEdyaWQyZF8wPQotR0xfZ2xNYXBHcmlkMmRfMT0KLUdMX2dsTWFwR3JpZDJkXzI9Ci1HTF9nbE1hcEdyaWQyZF8zPQotR0xfZ2xNYXBHcmlkMmRfND0KLUdMX2dsTWFwR3JpZDJkXzU9Ci0KLUdMX2dsTWFwR3JpZDJmPQotR0xfZ2xNYXBHcmlkMmZfMD0KLUdMX2dsTWFwR3JpZDJmXzE9Ci1HTF9nbE1hcEdyaWQyZl8yPQotR0xfZ2xNYXBHcmlkMmZfMz0KLUdMX2dsTWFwR3JpZDJmXzQ9Ci1HTF9nbE1hcEdyaWQyZl81PQotCi1HTF9nbE1hdGVyaWFsZj0KLUdMX2dsTWF0ZXJpYWxmXzA9Ci1HTF9nbE1hdGVyaWFsZl8xPQotR0xfZ2xNYXRlcmlhbGZfMj0KLQotR0xfZ2xNYXRlcmlhbGZ2PQotR0xfZ2xNYXRlcmlhbGZ2XzA9Ci1HTF9nbE1hdGVyaWFsZnZfMT0KLUdMX2dsTWF0ZXJpYWxmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTWF0ZXJpYWxpPQotR0xfZ2xNYXRlcmlhbGlfMD0KLUdMX2dsTWF0ZXJpYWxpXzE9Ci1HTF9nbE1hdGVyaWFsaV8yPQotCi1HTF9nbE1hdGVyaWFsaXY9Ci1HTF9nbE1hdGVyaWFsaXZfMD0KLUdMX2dsTWF0ZXJpYWxpdl8xPQotR0xfZ2xNYXRlcmlhbGl2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNYXRyaXhNb2RlPQotR0xfZ2xNYXRyaXhNb2RlXzA9Ci0KLUdMX2dsTXVsdE1hdHJpeGQ9Ci1HTF9nbE11bHRNYXRyaXhkXzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNdWx0TWF0cml4Zj0KLUdMX2dsTXVsdE1hdHJpeGZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE5ld0xpc3Q9Ci1HTF9nbE5ld0xpc3RfMD0KLUdMX2dsTmV3TGlzdF8xPQotCi1HTF9nbE5vcm1hbDNiPQotR0xfZ2xOb3JtYWwzYl8wPQotR0xfZ2xOb3JtYWwzYl8xPQotR0xfZ2xOb3JtYWwzYl8yPQotCi1HTF9nbE5vcm1hbDNidj0KLUdMX2dsTm9ybWFsM2J2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xOb3JtYWwzZD0KLUdMX2dsTm9ybWFsM2RfMD0KLUdMX2dsTm9ybWFsM2RfMT0KLUdMX2dsTm9ybWFsM2RfMj0KLQotR0xfZ2xOb3JtYWwzZHY9Ci1HTF9nbE5vcm1hbDNkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTm9ybWFsM2Y9Ci1HTF9nbE5vcm1hbDNmXzA9Ci1HTF9nbE5vcm1hbDNmXzE9Ci1HTF9nbE5vcm1hbDNmXzI9Ci0KLUdMX2dsTm9ybWFsM2Z2PQotR0xfZ2xOb3JtYWwzZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE5vcm1hbDNpPQotR0xfZ2xOb3JtYWwzaV8wPQotR0xfZ2xOb3JtYWwzaV8xPQotR0xfZ2xOb3JtYWwzaV8yPQotCi1HTF9nbE5vcm1hbDNpdj0KLUdMX2dsTm9ybWFsM2l2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xOb3JtYWwzcz0KLUdMX2dsTm9ybWFsM3NfMD0KLUdMX2dsTm9ybWFsM3NfMT0KLUdMX2dsTm9ybWFsM3NfMj0KLQotR0xfZ2xOb3JtYWwzc3Y9Ci1HTF9nbE5vcm1hbDNzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTm9ybWFsUG9pbnRlcj0KLUdMX2dsTm9ybWFsUG9pbnRlcl8wPQotR0xfZ2xOb3JtYWxQb2ludGVyXzE9Ci1HTF9nbE5vcm1hbFBvaW50ZXJfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbE9ydGhvPQotR0xfZ2xPcnRob18wPQotR0xfZ2xPcnRob18xPQotR0xfZ2xPcnRob18yPQotR0xfZ2xPcnRob18zPQotR0xfZ2xPcnRob180PQotR0xfZ2xPcnRob181PQotCi1HTF9nbFBhc3NUaHJvdWdoPQotR0xfZ2xQYXNzVGhyb3VnaF8wPQotCi1HTF9nbFBpeGVsTWFwZnY9Ci1HTF9nbFBpeGVsTWFwZnZfMD0KLUdMX2dsUGl4ZWxNYXBmdl8xPQotR0xfZ2xQaXhlbE1hcGZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xQaXhlbE1hcHVpdj0KLUdMX2dsUGl4ZWxNYXB1aXZfMD0KLUdMX2dsUGl4ZWxNYXB1aXZfMT0KLUdMX2dsUGl4ZWxNYXB1aXZfMj1jYXN0PShjb25zdCBHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xQaXhlbE1hcHVzdj0KLUdMX2dsUGl4ZWxNYXB1c3ZfMD0KLUdMX2dsUGl4ZWxNYXB1c3ZfMT0KLUdMX2dsUGl4ZWxNYXB1c3ZfMj1jYXN0PShjb25zdCBHTHVzaG9ydCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbFBpeGVsU3RvcmVmPQotR0xfZ2xQaXhlbFN0b3JlZl8wPQotR0xfZ2xQaXhlbFN0b3JlZl8xPQotCi1HTF9nbFBpeGVsU3RvcmVpPQotR0xfZ2xQaXhlbFN0b3JlaV8wPQotR0xfZ2xQaXhlbFN0b3JlaV8xPQotCi1HTF9nbFBpeGVsVHJhbnNmZXJmPQotR0xfZ2xQaXhlbFRyYW5zZmVyZl8wPQotR0xfZ2xQaXhlbFRyYW5zZmVyZl8xPQotCi1HTF9nbFBpeGVsVHJhbnNmZXJpPQotR0xfZ2xQaXhlbFRyYW5zZmVyaV8wPQotR0xfZ2xQaXhlbFRyYW5zZmVyaV8xPQotCi1HTF9nbFBpeGVsWm9vbT0KLUdMX2dsUGl4ZWxab29tXzA9Ci1HTF9nbFBpeGVsWm9vbV8xPQotCi1HTF9nbFBvaW50U2l6ZT0KLUdMX2dsUG9pbnRTaXplXzA9Ci0KLUdMX2dsUG9seWdvbk1vZGU9Ci1HTF9nbFBvbHlnb25Nb2RlXzA9Ci1HTF9nbFBvbHlnb25Nb2RlXzE9Ci0KLUdMX2dsUG9seWdvbk9mZnNldD0KLUdMX2dsUG9seWdvbk9mZnNldF8wPQotR0xfZ2xQb2x5Z29uT2Zmc2V0XzE9Ci0KLUdMX2dsUG9seWdvblN0aXBwbGU9Ci1HTF9nbFBvbHlnb25TdGlwcGxlXzA9Y2FzdD0oR0x1Ynl0ZSAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbFBvcEF0dHJpYj0KLQotR0xfZ2xQb3BDbGllbnRBdHRyaWI9Ci0KLUdMX2dsUG9wTWF0cml4PQotCi1HTF9nbFBvcE5hbWU9Ci0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzPQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXNfMD0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzXzE9Y2FzdD0oY29uc3QgR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi1HTF9nbFByaW9yaXRpemVUZXh0dXJlc18yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUHVzaEF0dHJpYj0KLUdMX2dsUHVzaEF0dHJpYl8wPQotCi1HTF9nbFB1c2hDbGllbnRBdHRyaWI9Ci1HTF9nbFB1c2hDbGllbnRBdHRyaWJfMD0KLQotR0xfZ2xQdXNoTWF0cml4PQotCi1HTF9nbFB1c2hOYW1lPQotR0xfZ2xQdXNoTmFtZV8wPQotCi1HTF9nbFJhc3RlclBvczJkPQotR0xfZ2xSYXN0ZXJQb3MyZF8wPQotR0xfZ2xSYXN0ZXJQb3MyZF8xPQotCi1HTF9nbFJhc3RlclBvczJkdj0KLUdMX2dsUmFzdGVyUG9zMmR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3MyZj0KLUdMX2dsUmFzdGVyUG9zMmZfMD0KLUdMX2dsUmFzdGVyUG9zMmZfMT0KLQotR0xfZ2xSYXN0ZXJQb3MyZnY9Ci1HTF9nbFJhc3RlclBvczJmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zMmk9Ci1HTF9nbFJhc3RlclBvczJpXzA9Ci1HTF9nbFJhc3RlclBvczJpXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMml2PQotR0xfZ2xSYXN0ZXJQb3MyaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczJzPQotR0xfZ2xSYXN0ZXJQb3Myc18wPQotR0xfZ2xSYXN0ZXJQb3Myc18xPQotCi1HTF9nbFJhc3RlclBvczJzdj0KLUdMX2dsUmFzdGVyUG9zMnN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3MzZD0KLUdMX2dsUmFzdGVyUG9zM2RfMD0KLUdMX2dsUmFzdGVyUG9zM2RfMT0KLUdMX2dsUmFzdGVyUG9zM2RfMj0KLQotR0xfZ2xSYXN0ZXJQb3MzZHY9Ci1HTF9nbFJhc3RlclBvczNkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zM2Y9Ci1HTF9nbFJhc3RlclBvczNmXzA9Ci1HTF9nbFJhc3RlclBvczNmXzE9Ci1HTF9nbFJhc3RlclBvczNmXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM2Z2PQotR0xfZ2xSYXN0ZXJQb3MzZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczNpPQotR0xfZ2xSYXN0ZXJQb3MzaV8wPQotR0xfZ2xSYXN0ZXJQb3MzaV8xPQotR0xfZ2xSYXN0ZXJQb3MzaV8yPQotCi1HTF9nbFJhc3RlclBvczNpdj0KLUdMX2dsUmFzdGVyUG9zM2l2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3Mzcz0KLUdMX2dsUmFzdGVyUG9zM3NfMD0KLUdMX2dsUmFzdGVyUG9zM3NfMT0KLUdMX2dsUmFzdGVyUG9zM3NfMj0KLQotR0xfZ2xSYXN0ZXJQb3Mzc3Y9Ci1HTF9nbFJhc3RlclBvczNzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zNGQ9Ci1HTF9nbFJhc3RlclBvczRkXzA9Ci1HTF9nbFJhc3RlclBvczRkXzE9Ci1HTF9nbFJhc3RlclBvczRkXzI9Ci1HTF9nbFJhc3RlclBvczRkXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNGR2PQotR0xfZ2xSYXN0ZXJQb3M0ZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczRmPQotR0xfZ2xSYXN0ZXJQb3M0Zl8wPQotR0xfZ2xSYXN0ZXJQb3M0Zl8xPQotR0xfZ2xSYXN0ZXJQb3M0Zl8yPQotR0xfZ2xSYXN0ZXJQb3M0Zl8zPQotCi1HTF9nbFJhc3RlclBvczRmdj0KLUdMX2dsUmFzdGVyUG9zNGZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3M0aT0KLUdMX2dsUmFzdGVyUG9zNGlfMD0KLUdMX2dsUmFzdGVyUG9zNGlfMT0KLUdMX2dsUmFzdGVyUG9zNGlfMj0KLUdMX2dsUmFzdGVyUG9zNGlfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0aXY9Ci1HTF9nbFJhc3RlclBvczRpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zNHM9Ci1HTF9nbFJhc3RlclBvczRzXzA9Ci1HTF9nbFJhc3RlclBvczRzXzE9Ci1HTF9nbFJhc3RlclBvczRzXzI9Ci1HTF9nbFJhc3RlclBvczRzXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNHN2PQotR0xfZ2xSYXN0ZXJQb3M0c3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJlYWRCdWZmZXI9Ci1HTF9nbFJlYWRCdWZmZXJfMD0KLQotR0xfZ2xSZWFkUGl4ZWxzPQotR0xfZ2xSZWFkUGl4ZWxzXzA9Ci1HTF9nbFJlYWRQaXhlbHNfMT0KLUdMX2dsUmVhZFBpeGVsc18yPQotR0xfZ2xSZWFkUGl4ZWxzXzM9Ci1HTF9nbFJlYWRQaXhlbHNfND0KLUdMX2dsUmVhZFBpeGVsc181PQotR0xfZ2xSZWFkUGl4ZWxzXzY9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSZWN0ZD0KLUdMX2dsUmVjdGRfMD0KLUdMX2dsUmVjdGRfMT0KLUdMX2dsUmVjdGRfMj0KLUdMX2dsUmVjdGRfMz0KLQotR0xfZ2xSZWN0ZHY9Ci1HTF9nbFJlY3Rkdl8wPWZsYWdzPWNyaXRpY2FsCi1HTF9nbFJlY3Rkdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmVjdGY9Ci1HTF9nbFJlY3RmXzA9Ci1HTF9nbFJlY3RmXzE9Ci1HTF9nbFJlY3RmXzI9Ci1HTF9nbFJlY3RmXzM9Ci0KLUdMX2dsUmVjdGZ2PQotR0xfZ2xSZWN0ZnZfMD1mbGFncz1jcml0aWNhbAotR0xfZ2xSZWN0ZnZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJlY3RpPQotR0xfZ2xSZWN0aV8wPQotR0xfZ2xSZWN0aV8xPQotR0xfZ2xSZWN0aV8yPQotR0xfZ2xSZWN0aV8zPQotCi1HTF9nbFJlY3Rpdj0KLUdMX2dsUmVjdGl2XzA9ZmxhZ3M9Y3JpdGljYWwKLUdMX2dsUmVjdGl2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSZWN0cz0KLUdMX2dsUmVjdHNfMD0KLUdMX2dsUmVjdHNfMT0KLUdMX2dsUmVjdHNfMj0KLUdMX2dsUmVjdHNfMz0KLQotR0xfZ2xSZWN0c3Y9Ci1HTF9nbFJlY3Rzdl8wPWZsYWdzPWNyaXRpY2FsCi1HTF9nbFJlY3Rzdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmVuZGVyTW9kZT0KLUdMX2dsUmVuZGVyTW9kZV8wPQotCi1HTF9nbFJvdGF0ZWQ9Ci1HTF9nbFJvdGF0ZWRfMD0KLUdMX2dsUm90YXRlZF8xPQotR0xfZ2xSb3RhdGVkXzI9Ci1HTF9nbFJvdGF0ZWRfMz0KLQotR0xfZ2xSb3RhdGVmPQotR0xfZ2xSb3RhdGVmXzA9Ci1HTF9nbFJvdGF0ZWZfMT0KLUdMX2dsUm90YXRlZl8yPQotR0xfZ2xSb3RhdGVmXzM9Ci0KLUdMX2dsU2NhbGVkPQotR0xfZ2xTY2FsZWRfMD0KLUdMX2dsU2NhbGVkXzE9Ci1HTF9nbFNjYWxlZF8yPQotCi1HTF9nbFNjYWxlZj0KLUdMX2dsU2NhbGVmXzA9Ci1HTF9nbFNjYWxlZl8xPQotR0xfZ2xTY2FsZWZfMj0KLQotR0xfZ2xTY2lzc29yPQotR0xfZ2xTY2lzc29yXzA9Ci1HTF9nbFNjaXNzb3JfMT0KLUdMX2dsU2Npc3Nvcl8yPQotR0xfZ2xTY2lzc29yXzM9Ci0KLUdMX2dsU2VsZWN0QnVmZmVyPQotR0xfZ2xTZWxlY3RCdWZmZXJfMD0KLUdMX2dsU2VsZWN0QnVmZmVyXzE9Y2FzdD0oR0x1aW50ICopCi0KLUdMX2dsU2hhZGVNb2RlbD0KLUdMX2dsU2hhZGVNb2RlbF8wPQotCi1HTF9nbFN0ZW5jaWxGdW5jPQotR0xfZ2xTdGVuY2lsRnVuY18wPQotR0xfZ2xTdGVuY2lsRnVuY18xPQotR0xfZ2xTdGVuY2lsRnVuY18yPQotCi1HTF9nbFN0ZW5jaWxNYXNrPQotR0xfZ2xTdGVuY2lsTWFza18wPQotCi1HTF9nbFN0ZW5jaWxPcD0KLUdMX2dsU3RlbmNpbE9wXzA9Ci1HTF9nbFN0ZW5jaWxPcF8xPQotR0xfZ2xTdGVuY2lsT3BfMj0KLQotR0xfZ2xUZXhDb29yZDFkPQotR0xfZ2xUZXhDb29yZDFkXzA9Ci0KLUdMX2dsVGV4Q29vcmQxZHY9Ci1HTF9nbFRleENvb3JkMWR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDFmPQotR0xfZ2xUZXhDb29yZDFmXzA9Ci0KLUdMX2dsVGV4Q29vcmQxZnY9Ci1HTF9nbFRleENvb3JkMWZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDFpPQotR0xfZ2xUZXhDb29yZDFpXzA9Ci0KLUdMX2dsVGV4Q29vcmQxaXY9Ci1HTF9nbFRleENvb3JkMWl2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDFzPQotR0xfZ2xUZXhDb29yZDFzXzA9Ci0KLUdMX2dsVGV4Q29vcmQxc3Y9Ci1HTF9nbFRleENvb3JkMXN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDJkPQotR0xfZ2xUZXhDb29yZDJkXzA9Ci1HTF9nbFRleENvb3JkMmRfMT0KLQotR0xfZ2xUZXhDb29yZDJkdj0KLUdMX2dsVGV4Q29vcmQyZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMmY9Ci1HTF9nbFRleENvb3JkMmZfMD0KLUdMX2dsVGV4Q29vcmQyZl8xPQotCi1HTF9nbFRleENvb3JkMmZ2PQotR0xfZ2xUZXhDb29yZDJmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQyaT0KLUdMX2dsVGV4Q29vcmQyaV8wPQotR0xfZ2xUZXhDb29yZDJpXzE9Ci0KLUdMX2dsVGV4Q29vcmQyaXY9Ci1HTF9nbFRleENvb3JkMml2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDJzPQotR0xfZ2xUZXhDb29yZDJzXzA9Ci1HTF9nbFRleENvb3JkMnNfMT0KLQotR0xfZ2xUZXhDb29yZDJzdj0KLUdMX2dsVGV4Q29vcmQyc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkM2Q9Ci1HTF9nbFRleENvb3JkM2RfMD0KLUdMX2dsVGV4Q29vcmQzZF8xPQotR0xfZ2xUZXhDb29yZDNkXzI9Ci0KLUdMX2dsVGV4Q29vcmQzZHY9Ci1HTF9nbFRleENvb3JkM2R2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDNmPQotR0xfZ2xUZXhDb29yZDNmXzA9Ci1HTF9nbFRleENvb3JkM2ZfMT0KLUdMX2dsVGV4Q29vcmQzZl8yPQotCi1HTF9nbFRleENvb3JkM2Z2PQotR0xfZ2xUZXhDb29yZDNmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQzaT0KLUdMX2dsVGV4Q29vcmQzaV8wPQotR0xfZ2xUZXhDb29yZDNpXzE9Ci1HTF9nbFRleENvb3JkM2lfMj0KLQotR0xfZ2xUZXhDb29yZDNpdj0KLUdMX2dsVGV4Q29vcmQzaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkM3M9Ci1HTF9nbFRleENvb3JkM3NfMD0KLUdMX2dsVGV4Q29vcmQzc18xPQotR0xfZ2xUZXhDb29yZDNzXzI9Ci0KLUdMX2dsVGV4Q29vcmQzc3Y9Ci1HTF9nbFRleENvb3JkM3N2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDRkPQotR0xfZ2xUZXhDb29yZDRkXzA9Ci1HTF9nbFRleENvb3JkNGRfMT0KLUdMX2dsVGV4Q29vcmQ0ZF8yPQotR0xfZ2xUZXhDb29yZDRkXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0ZHY9Ci1HTF9nbFRleENvb3JkNGR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDRmPQotR0xfZ2xUZXhDb29yZDRmXzA9Ci1HTF9nbFRleENvb3JkNGZfMT0KLUdMX2dsVGV4Q29vcmQ0Zl8yPQotR0xfZ2xUZXhDb29yZDRmXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0ZnY9Ci1HTF9nbFRleENvb3JkNGZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDRpPQotR0xfZ2xUZXhDb29yZDRpXzA9Ci1HTF9nbFRleENvb3JkNGlfMT0KLUdMX2dsVGV4Q29vcmQ0aV8yPQotR0xfZ2xUZXhDb29yZDRpXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0aXY9Ci1HTF9nbFRleENvb3JkNGl2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDRzPQotR0xfZ2xUZXhDb29yZDRzXzA9Ci1HTF9nbFRleENvb3JkNHNfMT0KLUdMX2dsVGV4Q29vcmQ0c18yPQotR0xfZ2xUZXhDb29yZDRzXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0c3Y9Ci1HTF9nbFRleENvb3JkNHN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZFBvaW50ZXI9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8wPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMT0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzI9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8zPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4RW52Zj0KLUdMX2dsVGV4RW52Zl8wPQotR0xfZ2xUZXhFbnZmXzE9Ci1HTF9nbFRleEVudmZfMj0KLQotR0xfZ2xUZXhFbnZmdj0KLUdMX2dsVGV4RW52ZnZfMD0KLUdMX2dsVGV4RW52ZnZfMT0KLUdMX2dsVGV4RW52ZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEVudmk9Ci1HTF9nbFRleEVudmlfMD0KLUdMX2dsVGV4RW52aV8xPQotR0xfZ2xUZXhFbnZpXzI9Ci0KLUdMX2dsVGV4RW52aXY9Ci1HTF9nbFRleEVudml2XzA9Ci1HTF9nbFRleEVudml2XzE9Ci1HTF9nbFRleEVudml2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhHZW5kPQotR0xfZ2xUZXhHZW5kXzA9Ci1HTF9nbFRleEdlbmRfMT0KLUdMX2dsVGV4R2VuZF8yPQotCi1HTF9nbFRleEdlbmR2PQotR0xfZ2xUZXhHZW5kdl8wPQotR0xfZ2xUZXhHZW5kdl8xPQotR0xfZ2xUZXhHZW5kdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4R2VuZj0KLUdMX2dsVGV4R2VuZl8wPQotR0xfZ2xUZXhHZW5mXzE9Ci1HTF9nbFRleEdlbmZfMj0KLQotR0xfZ2xUZXhHZW5mdj0KLUdMX2dsVGV4R2VuZnZfMD0KLUdMX2dsVGV4R2VuZnZfMT0KLUdMX2dsVGV4R2VuZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEdlbmk9Ci1HTF9nbFRleEdlbmlfMD0KLUdMX2dsVGV4R2VuaV8xPQotR0xfZ2xUZXhHZW5pXzI9Ci0KLUdMX2dsVGV4R2VuaXY9Ci1HTF9nbFRleEdlbml2XzA9Ci1HTF9nbFRleEdlbml2XzE9Ci1HTF9nbFRleEdlbml2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhJbWFnZTFEPQotR0xfZ2xUZXhJbWFnZTFEXzA9Ci1HTF9nbFRleEltYWdlMURfMT0KLUdMX2dsVGV4SW1hZ2UxRF8yPQotR0xfZ2xUZXhJbWFnZTFEXzM9Ci1HTF9nbFRleEltYWdlMURfND0KLUdMX2dsVGV4SW1hZ2UxRF81PQotR0xfZ2xUZXhJbWFnZTFEXzY9Ci1HTF9nbFRleEltYWdlMURfNz1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEltYWdlMkQ9Ci1HTF9nbFRleEltYWdlMkRfMD0KLUdMX2dsVGV4SW1hZ2UyRF8xPQotR0xfZ2xUZXhJbWFnZTJEXzI9Ci1HTF9nbFRleEltYWdlMkRfMz0KLUdMX2dsVGV4SW1hZ2UyRF80PQotR0xfZ2xUZXhJbWFnZTJEXzU9Ci1HTF9nbFRleEltYWdlMkRfNj0KLUdMX2dsVGV4SW1hZ2UyRF83PQotR0xfZ2xUZXhJbWFnZTJEXzg9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhQYXJhbWV0ZXJmPQotR0xfZ2xUZXhQYXJhbWV0ZXJmXzA9Ci1HTF9nbFRleFBhcmFtZXRlcmZfMT0KLUdMX2dsVGV4UGFyYW1ldGVyZl8yPQotCi1HTF9nbFRleFBhcmFtZXRlcmZ2PQotR0xfZ2xUZXhQYXJhbWV0ZXJmdl8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJmdl8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4UGFyYW1ldGVyaT0KLUdMX2dsVGV4UGFyYW1ldGVyaV8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJpXzE9Ci1HTF9nbFRleFBhcmFtZXRlcmlfMj0KLQotR0xfZ2xUZXhQYXJhbWV0ZXJpdj0KLUdMX2dsVGV4UGFyYW1ldGVyaXZfMD0KLUdMX2dsVGV4UGFyYW1ldGVyaXZfMT0KLUdMX2dsVGV4UGFyYW1ldGVyaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleFN1YkltYWdlMUQ9Ci1HTF9nbFRleFN1YkltYWdlMURfMD0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8xPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzI9Ci1HTF9nbFRleFN1YkltYWdlMURfMz0KLUdMX2dsVGV4U3ViSW1hZ2UxRF80PQotR0xfZ2xUZXhTdWJJbWFnZTFEXzU9Ci1HTF9nbFRleFN1YkltYWdlMURfNj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleFN1YkltYWdlMkQ9Ci1HTF9nbFRleFN1YkltYWdlMkRfMD0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8xPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzI9Ci1HTF9nbFRleFN1YkltYWdlMkRfMz0KLUdMX2dsVGV4U3ViSW1hZ2UyRF80PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzU9Ci1HTF9nbFRleFN1YkltYWdlMkRfNj0KLUdMX2dsVGV4U3ViSW1hZ2UyRF83PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzg9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUcmFuc2xhdGVkPQotR0xfZ2xUcmFuc2xhdGVkXzA9Ci1HTF9nbFRyYW5zbGF0ZWRfMT0KLUdMX2dsVHJhbnNsYXRlZF8yPQotCi1HTF9nbFRyYW5zbGF0ZWY9Ci1HTF9nbFRyYW5zbGF0ZWZfMD0KLUdMX2dsVHJhbnNsYXRlZl8xPQotR0xfZ2xUcmFuc2xhdGVmXzI9Ci0KLUdMX2dsVmVydGV4MmQ9Ci1HTF9nbFZlcnRleDJkXzA9Ci1HTF9nbFZlcnRleDJkXzE9Ci0KLUdMX2dsVmVydGV4MmR2PQotR0xfZ2xWZXJ0ZXgyZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDJmPQotR0xfZ2xWZXJ0ZXgyZl8wPQotR0xfZ2xWZXJ0ZXgyZl8xPQotCi1HTF9nbFZlcnRleDJmdj0KLUdMX2dsVmVydGV4MmZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXgyaT0KLUdMX2dsVmVydGV4MmlfMD0KLUdMX2dsVmVydGV4MmlfMT0KLQotR0xfZ2xWZXJ0ZXgyaXY9Ci1HTF9nbFZlcnRleDJpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4MnM9Ci1HTF9nbFZlcnRleDJzXzA9Ci1HTF9nbFZlcnRleDJzXzE9Ci0KLUdMX2dsVmVydGV4MnN2PQotR0xfZ2xWZXJ0ZXgyc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDNkPQotR0xfZ2xWZXJ0ZXgzZF8wPQotR0xfZ2xWZXJ0ZXgzZF8xPQotR0xfZ2xWZXJ0ZXgzZF8yPQotCi1HTF9nbFZlcnRleDNkdl9fST0KLUdMX2dsVmVydGV4M2R2X19JXzA9Y2FzdD0oY29uc3QgR0xkb3VibGUgKikKLQotR0xfZ2xWZXJ0ZXgzZHZfX18zRD0KLUdMX2dsVmVydGV4M2R2X19fM0RfMD0KLQotR0xfZ2xWZXJ0ZXgzZj0KLUdMX2dsVmVydGV4M2ZfMD0KLUdMX2dsVmVydGV4M2ZfMT0KLUdMX2dsVmVydGV4M2ZfMj0KLQotR0xfZ2xWZXJ0ZXgzZnY9Ci1HTF9nbFZlcnRleDNmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4M2k9Ci1HTF9nbFZlcnRleDNpXzA9Ci1HTF9nbFZlcnRleDNpXzE9Ci1HTF9nbFZlcnRleDNpXzI9Ci0KLUdMX2dsVmVydGV4M2l2PQotR0xfZ2xWZXJ0ZXgzaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDNzPQotR0xfZ2xWZXJ0ZXgzc18wPQotR0xfZ2xWZXJ0ZXgzc18xPQotR0xfZ2xWZXJ0ZXgzc18yPQotCi1HTF9nbFZlcnRleDNzdj0KLUdMX2dsVmVydGV4M3N2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXg0ZD0KLUdMX2dsVmVydGV4NGRfMD0KLUdMX2dsVmVydGV4NGRfMT0KLUdMX2dsVmVydGV4NGRfMj0KLUdMX2dsVmVydGV4NGRfMz0KLQotR0xfZ2xWZXJ0ZXg0ZHY9Ci1HTF9nbFZlcnRleDRkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4NGY9Ci1HTF9nbFZlcnRleDRmXzA9Ci1HTF9nbFZlcnRleDRmXzE9Ci1HTF9nbFZlcnRleDRmXzI9Ci1HTF9nbFZlcnRleDRmXzM9Ci0KLUdMX2dsVmVydGV4NGZ2PQotR0xfZ2xWZXJ0ZXg0ZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDRpPQotR0xfZ2xWZXJ0ZXg0aV8wPQotR0xfZ2xWZXJ0ZXg0aV8xPQotR0xfZ2xWZXJ0ZXg0aV8yPQotR0xfZ2xWZXJ0ZXg0aV8zPQotCi1HTF9nbFZlcnRleDRpdj0KLUdMX2dsVmVydGV4NGl2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXg0cz0KLUdMX2dsVmVydGV4NHNfMD0KLUdMX2dsVmVydGV4NHNfMT0KLUdMX2dsVmVydGV4NHNfMj0KLUdMX2dsVmVydGV4NHNfMz0KLQotR0xfZ2xWZXJ0ZXg0c3Y9Ci1HTF9nbFZlcnRleDRzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4UG9pbnRlcj0KLUdMX2dsVmVydGV4UG9pbnRlcl8wPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzE9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMj0KLUdMX2dsVmVydGV4UG9pbnRlcl8zPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmlld3BvcnQ9Ci1HTF9nbFZpZXdwb3J0XzA9Ci1HTF9nbFZpZXdwb3J0XzE9Ci1HTF9nbFZpZXdwb3J0XzI9Ci1HTF9nbFZpZXdwb3J0XzM9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTENvbnRleHQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xEYXRhPWZsYWdzPW5vX2dlbgotR0xEYXRhX2RldmljZT0KLUdMRGF0YV9zdHlsZT0KLUdMRGF0YV9pbWFnZT0KLUdMRGF0YV9kaXNwbGF5PQotR0xEYXRhX2RyYXdhYmxlPQotR0xEYXRhX2ZvcmVncm91bmQ9Ci1HTERhdGFfYmFja2dyb3VuZD0KLUdMRGF0YV9mb250PQotR0xEYXRhX2NvbG9ybWFwPQotR0xEYXRhX2NsaXBSZ249Ci1HTERhdGFfbGluZVN0eWxlPQotR0xEYXRhX3JlbmRlclRhYmxlPQotR0xEYXRhX3N0cmluZz0KLUdMRGF0YV9zdHJpbmdXaWR0aD0KLUdMRGF0YV9zdHJpbmdIZWlnaHQ9Ci1HTERhdGFfeG1TdHJpbmc9Ci1HTERhdGFfdGV4dD0KLUdMRGF0YV90ZXh0V2lkdGg9Ci1HTERhdGFfdGV4dEhlaWdodD0KLUdMRGF0YV94bVRleHQ9Ci1HTERhdGFfeG1NbmVtb25pYz0KLUdMRGF0YV9kcmF3RmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xEcmF3YWJsZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTExpc3RlbmVyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMVT1mbGFncz1ub19nZW4KLUdMVV9nbHVCZWdpbkN1cnZlPQotR0xVX2dsdUJlZ2luQ3VydmVfMD0KLQotR0xVX2dsdUJlZ2luUG9seWdvbj0KLUdMVV9nbHVCZWdpblBvbHlnb25fMD0KLQotR0xVX2dsdUJlZ2luU3VyZmFjZT0KLUdMVV9nbHVCZWdpblN1cmZhY2VfMD0KLQotR0xVX2dsdUJlZ2luVHJpbT0KLUdMVV9nbHVCZWdpblRyaW1fMD0KLQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzA9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMT0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18yPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzM9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfND0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc181PQotCi1HTFVfZ2x1QnVpbGQyRE1pcG1hcHM9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMD0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18xPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzI9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMz0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc180PQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzU9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfNj0KLQotR0xVX2dsdUN5bGluZGVyPQotR0xVX2dsdUN5bGluZGVyXzA9Ci1HTFVfZ2x1Q3lsaW5kZXJfMT0KLUdMVV9nbHVDeWxpbmRlcl8yPQotR0xVX2dsdUN5bGluZGVyXzM9Ci1HTFVfZ2x1Q3lsaW5kZXJfND0KLUdMVV9nbHVDeWxpbmRlcl81PQotCi1HTFVfZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcj0KLUdMVV9nbHVEZWxldGVOdXJic1JlbmRlcmVyXzA9Ci0KLUdMVV9nbHVEZWxldGVRdWFkcmljPQotR0xVX2dsdURlbGV0ZVF1YWRyaWNfMD0KLQotR0xVX2dsdURlbGV0ZVRlc3M9Ci1HTFVfZ2x1RGVsZXRlVGVzc18wPQotCi1HTFVfZ2x1RGlzaz0KLUdMVV9nbHVEaXNrXzA9Ci1HTFVfZ2x1RGlza18xPQotR0xVX2dsdURpc2tfMj0KLUdMVV9nbHVEaXNrXzM9Ci1HTFVfZ2x1RGlza180PQotCi1HTFVfZ2x1RW5kQ3VydmU9Ci1HTFVfZ2x1RW5kQ3VydmVfMD0KLQotR0xVX2dsdUVuZFBvbHlnb249Ci1HTFVfZ2x1RW5kUG9seWdvbl8wPQotCi1HTFVfZ2x1RW5kU3VyZmFjZT0KLUdMVV9nbHVFbmRTdXJmYWNlXzA9Ci0KLUdMVV9nbHVFbmRUcmltPQotR0xVX2dsdUVuZFRyaW1fMD0KLQotR0xVX2dsdUVycm9yU3RyaW5nPQotR0xVX2dsdUVycm9yU3RyaW5nXzA9Ci0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5PQotR0xVX2dsdUdldE51cmJzUHJvcGVydHlfMD0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5XzE9Ci1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eV8yPQotCi1HTFVfZ2x1R2V0U3RyaW5nPQotR0xVX2dsdUdldFN0cmluZ18wPQotCi1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5PQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eV8wPQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eV8xPQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eV8yPQotCi1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXM9Ci1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMD0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18xPQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzI9Ci1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMz0KLQotR0xVX2dsdUxvb2tBdD0KLUdMVV9nbHVMb29rQXRfMD0KLUdMVV9nbHVMb29rQXRfMT0KLUdMVV9nbHVMb29rQXRfMj0KLUdMVV9nbHVMb29rQXRfMz0KLUdMVV9nbHVMb29rQXRfND0KLUdMVV9nbHVMb29rQXRfNT0KLUdMVV9nbHVMb29rQXRfNj0KLUdMVV9nbHVMb29rQXRfNz0KLUdMVV9nbHVMb29rQXRfOD0KLQotR0xVX2dsdU5ld051cmJzUmVuZGVyZXI9Ci0KLUdMVV9nbHVOZXdRdWFkcmljPQotCi1HTFVfZ2x1TmV3VGVzcz0KLQotR0xVX2dsdU5leHRDb250b3VyPQotR0xVX2dsdU5leHRDb250b3VyXzA9Ci1HTFVfZ2x1TmV4dENvbnRvdXJfMT0KLQotR0xVX2dsdU51cmJzQ2FsbGJhY2s9Ci1HTFVfZ2x1TnVyYnNDYWxsYmFja18wPQotR0xVX2dsdU51cmJzQ2FsbGJhY2tfMT0KLUdMVV9nbHVOdXJic0NhbGxiYWNrXzI9Ci0KLUdMVV9nbHVOdXJic0N1cnZlPQotR0xVX2dsdU51cmJzQ3VydmVfMD0KLUdMVV9nbHVOdXJic0N1cnZlXzE9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV8yPQotR0xVX2dsdU51cmJzQ3VydmVfMz0KLUdMVV9nbHVOdXJic0N1cnZlXzQ9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV81PQotR0xVX2dsdU51cmJzQ3VydmVfNj0KLQotR0xVX2dsdU51cmJzUHJvcGVydHk9Ci1HTFVfZ2x1TnVyYnNQcm9wZXJ0eV8wPQotR0xVX2dsdU51cmJzUHJvcGVydHlfMT0KLUdMVV9nbHVOdXJic1Byb3BlcnR5XzI9Ci0KLUdMVV9nbHVOdXJic1N1cmZhY2U9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzA9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzE9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzI9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzM9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzQ9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzU9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzY9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzc9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzg9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzk9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzEwPQotCi1HTFVfZ2x1T3J0aG8yRD0KLUdMVV9nbHVPcnRobzJEXzA9Ci1HTFVfZ2x1T3J0aG8yRF8xPQotR0xVX2dsdU9ydGhvMkRfMj0KLUdMVV9nbHVPcnRobzJEXzM9Ci0KLUdMVV9nbHVQYXJ0aWFsRGlzaz0KLUdMVV9nbHVQYXJ0aWFsRGlza18wPQotR0xVX2dsdVBhcnRpYWxEaXNrXzE9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMj0KLUdMVV9nbHVQYXJ0aWFsRGlza18zPQotR0xVX2dsdVBhcnRpYWxEaXNrXzQ9Ci1HTFVfZ2x1UGFydGlhbERpc2tfNT0KLUdMVV9nbHVQYXJ0aWFsRGlza182PQotCi1HTFVfZ2x1UGVyc3BlY3RpdmU9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMD0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8xPQotR0xVX2dsdVBlcnNwZWN0aXZlXzI9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMz0KLQotR0xVX2dsdVBpY2tNYXRyaXg9Ci1HTFVfZ2x1UGlja01hdHJpeF8wPQotR0xVX2dsdVBpY2tNYXRyaXhfMT0KLUdMVV9nbHVQaWNrTWF0cml4XzI9Ci1HTFVfZ2x1UGlja01hdHJpeF8zPQotR0xVX2dsdVBpY2tNYXRyaXhfND0KLQotR0xVX2dsdVByb2plY3Q9Ci1HTFVfZ2x1UHJvamVjdF8wPQotR0xVX2dsdVByb2plY3RfMT0KLUdMVV9nbHVQcm9qZWN0XzI9Ci1HTFVfZ2x1UHJvamVjdF8zPQotR0xVX2dsdVByb2plY3RfND0KLUdMVV9nbHVQcm9qZWN0XzU9Ci1HTFVfZ2x1UHJvamVjdF82PQotR0xVX2dsdVByb2plY3RfNz0KLUdMVV9nbHVQcm9qZWN0Xzg9Ci0KLUdMVV9nbHVQd2xDdXJ2ZT0KLUdMVV9nbHVQd2xDdXJ2ZV8wPQotR0xVX2dsdVB3bEN1cnZlXzE9Ci1HTFVfZ2x1UHdsQ3VydmVfMj0KLUdMVV9nbHVQd2xDdXJ2ZV8zPQotR0xVX2dsdVB3bEN1cnZlXzQ9Ci0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2s9Ci1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrXzA9Ci1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrXzE9Ci1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrXzI9Ci0KLUdMVV9nbHVRdWFkcmljRHJhd1N0eWxlPQotR0xVX2dsdVF1YWRyaWNEcmF3U3R5bGVfMD0KLUdMVV9nbHVRdWFkcmljRHJhd1N0eWxlXzE9Ci0KLUdMVV9nbHVRdWFkcmljTm9ybWFscz0KLUdMVV9nbHVRdWFkcmljTm9ybWFsc18wPQotR0xVX2dsdVF1YWRyaWNOb3JtYWxzXzE9Ci0KLUdMVV9nbHVRdWFkcmljT3JpZW50YXRpb249Ci1HTFVfZ2x1UXVhZHJpY09yaWVudGF0aW9uXzA9Ci1HTFVfZ2x1UXVhZHJpY09yaWVudGF0aW9uXzE9Ci0KLUdMVV9nbHVRdWFkcmljVGV4dHVyZT0KLUdMVV9nbHVRdWFkcmljVGV4dHVyZV8wPQotR0xVX2dsdVF1YWRyaWNUZXh0dXJlXzE9Ci0KLUdMVV9nbHVTY2FsZUltYWdlPQotR0xVX2dsdVNjYWxlSW1hZ2VfMD0KLUdMVV9nbHVTY2FsZUltYWdlXzE9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8yPQotR0xVX2dsdVNjYWxlSW1hZ2VfMz0KLUdMVV9nbHVTY2FsZUltYWdlXzQ9Ci1HTFVfZ2x1U2NhbGVJbWFnZV81PQotR0xVX2dsdVNjYWxlSW1hZ2VfNj0KLUdMVV9nbHVTY2FsZUltYWdlXzc9Ci1HTFVfZ2x1U2NhbGVJbWFnZV84PQotCi1HTFVfZ2x1U3BoZXJlPQotR0xVX2dsdVNwaGVyZV8wPQotR0xVX2dsdVNwaGVyZV8xPQotR0xVX2dsdVNwaGVyZV8yPQotR0xVX2dsdVNwaGVyZV8zPQotCi1HTFVfZ2x1VGVzc0JlZ2luQ29udG91cj0KLUdMVV9nbHVUZXNzQmVnaW5Db250b3VyXzA9Ci0KLUdMVV9nbHVUZXNzQmVnaW5Qb2x5Z29uPQotR0xVX2dsdVRlc3NCZWdpblBvbHlnb25fMD0KLUdMVV9nbHVUZXNzQmVnaW5Qb2x5Z29uXzE9Ci0KLUdMVV9nbHVUZXNzQ2FsbGJhY2s9Ci1HTFVfZ2x1VGVzc0NhbGxiYWNrXzA9Ci1HTFVfZ2x1VGVzc0NhbGxiYWNrXzE9Ci1HTFVfZ2x1VGVzc0NhbGxiYWNrXzI9Ci0KLUdMVV9nbHVUZXNzRW5kQ29udG91cj0KLUdMVV9nbHVUZXNzRW5kQ29udG91cl8wPQotCi1HTFVfZ2x1VGVzc0VuZFBvbHlnb249Ci1HTFVfZ2x1VGVzc0VuZFBvbHlnb25fMD0KLQotR0xVX2dsdVRlc3NOb3JtYWw9Ci1HTFVfZ2x1VGVzc05vcm1hbF8wPQotR0xVX2dsdVRlc3NOb3JtYWxfMT0KLUdMVV9nbHVUZXNzTm9ybWFsXzI9Ci1HTFVfZ2x1VGVzc05vcm1hbF8zPQotCi1HTFVfZ2x1VGVzc1Byb3BlcnR5PQotR0xVX2dsdVRlc3NQcm9wZXJ0eV8wPQotR0xVX2dsdVRlc3NQcm9wZXJ0eV8xPQotR0xVX2dsdVRlc3NQcm9wZXJ0eV8yPQotCi1HTFVfZ2x1VGVzc1ZlcnRleD0KLUdMVV9nbHVUZXNzVmVydGV4XzA9Ci1HTFVfZ2x1VGVzc1ZlcnRleF8xPQotR0xVX2dsdVRlc3NWZXJ0ZXhfMj0KLQotR0xVX2dsdVVuUHJvamVjdD0KLUdMVV9nbHVVblByb2plY3RfMD0KLUdMVV9nbHVVblByb2plY3RfMT0KLUdMVV9nbHVVblByb2plY3RfMj0KLUdMVV9nbHVVblByb2plY3RfMz0KLUdMVV9nbHVVblByb2plY3RfND0KLUdMVV9nbHVVblByb2plY3RfNT0KLUdMVV9nbHVVblByb2plY3RfNj0KLUdMVV9nbHVVblByb2plY3RfNz0KLUdMVV9nbHVVblByb2plY3RfOD0KLQotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0xpYnJhcnk9ZmxhZ3M9bm9fZ2VuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMVS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xVLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODA3MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xVLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0w9ZmxhZ3M9bm9fZ2VuCi1HTF9nbEFjY3VtPQotR0xfZ2xBY2N1bV8wPQotR0xfZ2xBY2N1bV8xPQotCi1HTF9nbEFscGhhRnVuYz0KLUdMX2dsQWxwaGFGdW5jXzA9Ci1HTF9nbEFscGhhRnVuY18xPQotCi1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnQ9Ci1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnRfMD0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudF8xPQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50XzI9Ci0KLUdMX2dsQXJyYXlFbGVtZW50PQotR0xfZ2xBcnJheUVsZW1lbnRfMD0KLQotR0xfZ2xCZWdpbj0KLUdMX2dsQmVnaW5fMD0KLQotR0xfZ2xCaW5kVGV4dHVyZT0KLUdMX2dsQmluZFRleHR1cmVfMD0KLUdMX2dsQmluZFRleHR1cmVfMT0KLQotR0xfZ2xCaXRtYXA9Ci1HTF9nbEJpdG1hcF8wPQotR0xfZ2xCaXRtYXBfMT0KLUdMX2dsQml0bWFwXzI9Ci1HTF9nbEJpdG1hcF8zPQotR0xfZ2xCaXRtYXBfND0KLUdMX2dsQml0bWFwXzU9Ci1HTF9nbEJpdG1hcF82PQotCi1HTF9nbEJsZW5kRnVuYz0KLUdMX2dsQmxlbmRGdW5jXzA9Ci1HTF9nbEJsZW5kRnVuY18xPQotCi1HTF9nbENhbGxMaXN0PQotR0xfZ2xDYWxsTGlzdF8wPQotCi1HTF9nbENhbGxMaXN0c19fSUlfM0I9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0JfMD0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQl8xPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCXzI9Ci0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQz0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQ18wPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDXzE9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0NfMj0KLQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJXzA9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0lfMT0KLUdMX2dsQ2FsbExpc3RzX19JSV8zSV8yPQotCi1HTF9nbENsZWFyPQotR0xfZ2xDbGVhcl8wPQotCi1HTF9nbENsZWFyQWNjdW09Ci1HTF9nbENsZWFyQWNjdW1fMD0KLUdMX2dsQ2xlYXJBY2N1bV8xPQotR0xfZ2xDbGVhckFjY3VtXzI9Ci1HTF9nbENsZWFyQWNjdW1fMz0KLQotR0xfZ2xDbGVhckNvbG9yPQotR0xfZ2xDbGVhckNvbG9yXzA9Ci1HTF9nbENsZWFyQ29sb3JfMT0KLUdMX2dsQ2xlYXJDb2xvcl8yPQotR0xfZ2xDbGVhckNvbG9yXzM9Ci0KLUdMX2dsQ2xlYXJEZXB0aD0KLUdMX2dsQ2xlYXJEZXB0aF8wPQotCi1HTF9nbENsZWFySW5kZXg9Ci1HTF9nbENsZWFySW5kZXhfMD0KLQotR0xfZ2xDbGVhclN0ZW5jaWw9Ci1HTF9nbENsZWFyU3RlbmNpbF8wPQotCi1HTF9nbENsaXBQbGFuZT0KLUdMX2dsQ2xpcFBsYW5lXzA9Ci1HTF9nbENsaXBQbGFuZV8xPQotCi1HTF9nbENvbG9yM2I9Ci1HTF9nbENvbG9yM2JfMD0KLUdMX2dsQ29sb3IzYl8xPQotR0xfZ2xDb2xvcjNiXzI9Ci0KLUdMX2dsQ29sb3IzYnY9Ci1HTF9nbENvbG9yM2J2XzA9Ci0KLUdMX2dsQ29sb3IzZD0KLUdMX2dsQ29sb3IzZF8wPQotR0xfZ2xDb2xvcjNkXzE9Ci1HTF9nbENvbG9yM2RfMj0KLQotR0xfZ2xDb2xvcjNkdj0KLUdMX2dsQ29sb3IzZHZfMD0KLQotR0xfZ2xDb2xvcjNmPQotR0xfZ2xDb2xvcjNmXzA9Ci1HTF9nbENvbG9yM2ZfMT0KLUdMX2dsQ29sb3IzZl8yPQotCi1HTF9nbENvbG9yM2Z2PQotR0xfZ2xDb2xvcjNmdl8wPQotCi1HTF9nbENvbG9yM2k9Ci1HTF9nbENvbG9yM2lfMD0KLUdMX2dsQ29sb3IzaV8xPQotR0xfZ2xDb2xvcjNpXzI9Ci0KLUdMX2dsQ29sb3IzaXY9Ci1HTF9nbENvbG9yM2l2XzA9Ci0KLUdMX2dsQ29sb3Izcz0KLUdMX2dsQ29sb3Izc18wPQotR0xfZ2xDb2xvcjNzXzE9Ci1HTF9nbENvbG9yM3NfMj0KLQotR0xfZ2xDb2xvcjNzdj0KLUdMX2dsQ29sb3Izc3ZfMD0KLQotR0xfZ2xDb2xvcjN1Yj0KLUdMX2dsQ29sb3IzdWJfMD0KLUdMX2dsQ29sb3IzdWJfMT0KLUdMX2dsQ29sb3IzdWJfMj0KLQotR0xfZ2xDb2xvcjN1YnY9Ci1HTF9nbENvbG9yM3Vidl8wPQotCi1HTF9nbENvbG9yM3VpPQotR0xfZ2xDb2xvcjN1aV8wPQotR0xfZ2xDb2xvcjN1aV8xPQotR0xfZ2xDb2xvcjN1aV8yPQotCi1HTF9nbENvbG9yM3Vpdj0KLUdMX2dsQ29sb3IzdWl2XzA9Ci0KLUdMX2dsQ29sb3IzdXM9Ci1HTF9nbENvbG9yM3VzXzA9Ci1HTF9nbENvbG9yM3VzXzE9Ci1HTF9nbENvbG9yM3VzXzI9Ci0KLUdMX2dsQ29sb3IzdXN2PQotR0xfZ2xDb2xvcjN1c3ZfMD0KLQotR0xfZ2xDb2xvcjRiPQotR0xfZ2xDb2xvcjRiXzA9Ci1HTF9nbENvbG9yNGJfMT0KLUdMX2dsQ29sb3I0Yl8yPQotR0xfZ2xDb2xvcjRiXzM9Ci0KLUdMX2dsQ29sb3I0YnY9Ci1HTF9nbENvbG9yNGJ2XzA9Ci0KLUdMX2dsQ29sb3I0ZD0KLUdMX2dsQ29sb3I0ZF8wPQotR0xfZ2xDb2xvcjRkXzE9Ci1HTF9nbENvbG9yNGRfMj0KLUdMX2dsQ29sb3I0ZF8zPQotCi1HTF9nbENvbG9yNGR2PQotR0xfZ2xDb2xvcjRkdl8wPQotCi1HTF9nbENvbG9yNGY9Ci1HTF9nbENvbG9yNGZfMD0KLUdMX2dsQ29sb3I0Zl8xPQotR0xfZ2xDb2xvcjRmXzI9Ci1HTF9nbENvbG9yNGZfMz0KLQotR0xfZ2xDb2xvcjRmdj0KLUdMX2dsQ29sb3I0ZnZfMD0KLQotR0xfZ2xDb2xvcjRpPQotR0xfZ2xDb2xvcjRpXzA9Ci1HTF9nbENvbG9yNGlfMT0KLUdMX2dsQ29sb3I0aV8yPQotR0xfZ2xDb2xvcjRpXzM9Ci0KLUdMX2dsQ29sb3I0aXY9Ci1HTF9nbENvbG9yNGl2XzA9Ci0KLUdMX2dsQ29sb3I0cz0KLUdMX2dsQ29sb3I0c18wPQotR0xfZ2xDb2xvcjRzXzE9Ci1HTF9nbENvbG9yNHNfMj0KLUdMX2dsQ29sb3I0c18zPQotCi1HTF9nbENvbG9yNHViPQotR0xfZ2xDb2xvcjR1Yl8wPQotR0xfZ2xDb2xvcjR1Yl8xPQotR0xfZ2xDb2xvcjR1Yl8yPQotR0xfZ2xDb2xvcjR1Yl8zPQotCi1HTF9nbENvbG9yNHVidl9fXzNCPQotR0xfZ2xDb2xvcjR1YnZfX18zQl8wPQotCi1HTF9nbENvbG9yNHVidl9fXzNTPQotR0xfZ2xDb2xvcjR1YnZfX18zU18wPQotCi1HTF9nbENvbG9yNHVpPQotR0xfZ2xDb2xvcjR1aV8wPQotR0xfZ2xDb2xvcjR1aV8xPQotR0xfZ2xDb2xvcjR1aV8yPQotR0xfZ2xDb2xvcjR1aV8zPQotCi1HTF9nbENvbG9yNHVpdj0KLUdMX2dsQ29sb3I0dWl2XzA9Ci0KLUdMX2dsQ29sb3I0dXM9Ci1HTF9nbENvbG9yNHVzXzA9Ci1HTF9nbENvbG9yNHVzXzE9Ci1HTF9nbENvbG9yNHVzXzI9Ci1HTF9nbENvbG9yNHVzXzM9Ci0KLUdMX2dsQ29sb3I0dXN2PQotR0xfZ2xDb2xvcjR1c3ZfMD0KLQotR0xfZ2xDb2xvck1hc2s9Ci1HTF9nbENvbG9yTWFza18wPQotR0xfZ2xDb2xvck1hc2tfMT0KLUdMX2dsQ29sb3JNYXNrXzI9Ci1HTF9nbENvbG9yTWFza18zPQotCi1HTF9nbENvbG9yTWF0ZXJpYWw9Ci1HTF9nbENvbG9yTWF0ZXJpYWxfMD0KLUdMX2dsQ29sb3JNYXRlcmlhbF8xPQotCi1HTF9nbENvbG9yUG9pbnRlcj0KLUdMX2dsQ29sb3JQb2ludGVyXzA9Ci1HTF9nbENvbG9yUG9pbnRlcl8xPQotR0xfZ2xDb2xvclBvaW50ZXJfMj0KLUdMX2dsQ29sb3JQb2ludGVyXzM9Ci0KLUdMX2dsQ29weVBpeGVscz0KLUdMX2dsQ29weVBpeGVsc18wPQotR0xfZ2xDb3B5UGl4ZWxzXzE9Ci1HTF9nbENvcHlQaXhlbHNfMj0KLUdMX2dsQ29weVBpeGVsc18zPQotR0xfZ2xDb3B5UGl4ZWxzXzQ9Ci0KLUdMX2dsQ29weVRleEltYWdlMUQ9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzA9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzE9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzI9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzM9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzQ9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzU9Ci1HTF9nbENvcHlUZXhJbWFnZTFEXzY9Ci0KLUdMX2dsQ29weVRleEltYWdlMkQ9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzA9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzE9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzI9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzM9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzQ9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzU9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzY9Ci1HTF9nbENvcHlUZXhJbWFnZTJEXzc9Ci0KLUdMX2dsQ29weVRleFN1YkltYWdlMUQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzA9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzE9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzI9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzM9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTFEXzU9Ci0KLUdMX2dsQ29weVRleFN1YkltYWdlMkQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzA9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzE9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzI9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzM9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzQ9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzU9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzY9Ci1HTF9nbENvcHlUZXhTdWJJbWFnZTJEXzc9Ci0KLUdMX2dsQ3VsbEZhY2U9Ci1HTF9nbEN1bGxGYWNlXzA9Ci0KLUdMX2dsRGVsZXRlTGlzdHM9Ci1HTF9nbERlbGV0ZUxpc3RzXzA9Ci1HTF9nbERlbGV0ZUxpc3RzXzE9Ci0KLUdMX2dsRGVsZXRlVGV4dHVyZXM9Ci1HTF9nbERlbGV0ZVRleHR1cmVzXzA9Ci1HTF9nbERlbGV0ZVRleHR1cmVzXzE9Ci0KLUdMX2dsRGVwdGhGdW5jPQotR0xfZ2xEZXB0aEZ1bmNfMD0KLQotR0xfZ2xEZXB0aE1hc2s9Ci1HTF9nbERlcHRoTWFza18wPQotCi1HTF9nbERlcHRoUmFuZ2U9Ci1HTF9nbERlcHRoUmFuZ2VfMD0KLUdMX2dsRGVwdGhSYW5nZV8xPQotCi1HTF9nbERpc2FibGU9Ci1HTF9nbERpc2FibGVfMD0KLQotR0xfZ2xEaXNhYmxlQ2xpZW50U3RhdGU9Ci1HTF9nbERpc2FibGVDbGllbnRTdGF0ZV8wPQotCi1HTF9nbERyYXdBcnJheXM9Ci1HTF9nbERyYXdBcnJheXNfMD0KLUdMX2dsRHJhd0FycmF5c18xPQotR0xfZ2xEcmF3QXJyYXlzXzI9Ci0KLUdMX2dsRHJhd0J1ZmZlcj0KLUdMX2dsRHJhd0J1ZmZlcl8wPQotCi1HTF9nbERyYXdFbGVtZW50cz0KLUdMX2dsRHJhd0VsZW1lbnRzXzA9Ci1HTF9nbERyYXdFbGVtZW50c18xPQotR0xfZ2xEcmF3RWxlbWVudHNfMj0KLUdMX2dsRHJhd0VsZW1lbnRzXzM9Ci0KLUdMX2dsRHJhd1BpeGVscz0KLUdMX2dsRHJhd1BpeGVsc18wPQotR0xfZ2xEcmF3UGl4ZWxzXzE9Ci1HTF9nbERyYXdQaXhlbHNfMj0KLUdMX2dsRHJhd1BpeGVsc18zPQotR0xfZ2xEcmF3UGl4ZWxzXzQ9Ci0KLUdMX2dsRWRnZUZsYWc9Ci1HTF9nbEVkZ2VGbGFnXzA9Ci0KLUdMX2dsRWRnZUZsYWdQb2ludGVyPQotR0xfZ2xFZGdlRmxhZ1BvaW50ZXJfMD0KLUdMX2dsRWRnZUZsYWdQb2ludGVyXzE9Ci0KLUdMX2dsRWRnZUZsYWd2PQotR0xfZ2xFZGdlRmxhZ3ZfMD0KLQotR0xfZ2xFbmFibGU9Ci1HTF9nbEVuYWJsZV8wPQotCi1HTF9nbEVuYWJsZUNsaWVudFN0YXRlPQotR0xfZ2xFbmFibGVDbGllbnRTdGF0ZV8wPQotCi1HTF9nbEVuZD0KLQotR0xfZ2xFbmRMaXN0PQotCi1HTF9nbEV2YWxDb29yZDFkPQotR0xfZ2xFdmFsQ29vcmQxZF8wPQotCi1HTF9nbEV2YWxDb29yZDFkdj0KLUdMX2dsRXZhbENvb3JkMWR2XzA9Ci0KLUdMX2dsRXZhbENvb3JkMWY9Ci1HTF9nbEV2YWxDb29yZDFmXzA9Ci0KLUdMX2dsRXZhbENvb3JkMWZ2PQotR0xfZ2xFdmFsQ29vcmQxZnZfMD0KLQotR0xfZ2xFdmFsQ29vcmQyZD0KLUdMX2dsRXZhbENvb3JkMmRfMD0KLUdMX2dsRXZhbENvb3JkMmRfMT0KLQotR0xfZ2xFdmFsQ29vcmQyZHY9Ci1HTF9nbEV2YWxDb29yZDJkdl8wPQotCi1HTF9nbEV2YWxDb29yZDJmPQotR0xfZ2xFdmFsQ29vcmQyZl8wPQotR0xfZ2xFdmFsQ29vcmQyZl8xPQotCi1HTF9nbEV2YWxDb29yZDJmdj0KLUdMX2dsRXZhbENvb3JkMmZ2XzA9Ci0KLUdMX2dsRXZhbE1lc2gxPQotR0xfZ2xFdmFsTWVzaDFfMD0KLUdMX2dsRXZhbE1lc2gxXzE9Ci1HTF9nbEV2YWxNZXNoMV8yPQotCi1HTF9nbEV2YWxNZXNoMj0KLUdMX2dsRXZhbE1lc2gyXzA9Ci1HTF9nbEV2YWxNZXNoMl8xPQotR0xfZ2xFdmFsTWVzaDJfMj0KLUdMX2dsRXZhbE1lc2gyXzM9Ci1HTF9nbEV2YWxNZXNoMl80PQotCi1HTF9nbEV2YWxQb2ludDE9Ci1HTF9nbEV2YWxQb2ludDFfMD0KLQotR0xfZ2xFdmFsUG9pbnQyPQotR0xfZ2xFdmFsUG9pbnQyXzA9Ci1HTF9nbEV2YWxQb2ludDJfMT0KLQotR0xfZ2xGZWVkYmFja0J1ZmZlcj0KLUdMX2dsRmVlZGJhY2tCdWZmZXJfMD0KLUdMX2dsRmVlZGJhY2tCdWZmZXJfMT0KLUdMX2dsRmVlZGJhY2tCdWZmZXJfMj0KLQotR0xfZ2xGaW5pc2g9Ci0KLUdMX2dsRmx1c2g9Ci0KLUdMX2dsRm9nZj0KLUdMX2dsRm9nZl8wPQotR0xfZ2xGb2dmXzE9Ci0KLUdMX2dsRm9nZnY9Ci1HTF9nbEZvZ2Z2XzA9Ci1HTF9nbEZvZ2Z2XzE9Ci0KLUdMX2dsRm9naT0KLUdMX2dsRm9naV8wPQotR0xfZ2xGb2dpXzE9Ci0KLUdMX2dsRm9naXY9Ci1HTF9nbEZvZ2l2XzA9Ci1HTF9nbEZvZ2l2XzE9Ci0KLUdMX2dsRnJvbnRGYWNlPQotR0xfZ2xGcm9udEZhY2VfMD0KLQotR0xfZ2xGcnVzdHVtPQotR0xfZ2xGcnVzdHVtXzA9Ci1HTF9nbEZydXN0dW1fMT0KLUdMX2dsRnJ1c3R1bV8yPQotR0xfZ2xGcnVzdHVtXzM9Ci1HTF9nbEZydXN0dW1fND0KLUdMX2dsRnJ1c3R1bV81PQotCi1HTF9nbEdlbkxpc3RzPQotR0xfZ2xHZW5MaXN0c18wPQotCi1HTF9nbEdlblRleHR1cmVzPQotR0xfZ2xHZW5UZXh0dXJlc18wPQotR0xfZ2xHZW5UZXh0dXJlc18xPQotCi1HTF9nbEdldEJvb2xlYW52PQotR0xfZ2xHZXRCb29sZWFudl8wPQotR0xfZ2xHZXRCb29sZWFudl8xPQotCi1HTF9nbEdldENsaXBQbGFuZT0KLUdMX2dsR2V0Q2xpcFBsYW5lXzA9Ci1HTF9nbEdldENsaXBQbGFuZV8xPQotCi1HTF9nbEdldERvdWJsZXY9Ci1HTF9nbEdldERvdWJsZXZfMD0KLUdMX2dsR2V0RG91Ymxldl8xPQotCi1HTF9nbEdldEVycm9yPQotCi1HTF9nbEdldEZsb2F0dj0KLUdMX2dsR2V0RmxvYXR2XzA9Ci1HTF9nbEdldEZsb2F0dl8xPQotCi1HTF9nbEdldEludGVnZXJ2PQotR0xfZ2xHZXRJbnRlZ2Vydl8wPQotR0xfZ2xHZXRJbnRlZ2Vydl8xPQotCi1HTF9nbEdldExpZ2h0ZnY9Ci1HTF9nbEdldExpZ2h0ZnZfMD0KLUdMX2dsR2V0TGlnaHRmdl8xPQotR0xfZ2xHZXRMaWdodGZ2XzI9Ci0KLUdMX2dsR2V0TGlnaHRpdj0KLUdMX2dsR2V0TGlnaHRpdl8wPQotR0xfZ2xHZXRMaWdodGl2XzE9Ci1HTF9nbEdldExpZ2h0aXZfMj0KLQotR0xfZ2xHZXRNYXBkdj0KLUdMX2dsR2V0TWFwZHZfMD0KLUdMX2dsR2V0TWFwZHZfMT0KLUdMX2dsR2V0TWFwZHZfMj0KLQotR0xfZ2xHZXRNYXBmdj0KLUdMX2dsR2V0TWFwZnZfMD0KLUdMX2dsR2V0TWFwZnZfMT0KLUdMX2dsR2V0TWFwZnZfMj0KLQotR0xfZ2xHZXRNYXBpdj0KLUdMX2dsR2V0TWFwaXZfMD0KLUdMX2dsR2V0TWFwaXZfMT0KLUdMX2dsR2V0TWFwaXZfMj0KLQotR0xfZ2xHZXRNYXRlcmlhbGZ2PQotR0xfZ2xHZXRNYXRlcmlhbGZ2XzA9Ci1HTF9nbEdldE1hdGVyaWFsZnZfMT0KLUdMX2dsR2V0TWF0ZXJpYWxmdl8yPQotCi1HTF9nbEdldE1hdGVyaWFsaXY9Ci1HTF9nbEdldE1hdGVyaWFsaXZfMD0KLUdMX2dsR2V0TWF0ZXJpYWxpdl8xPQotR0xfZ2xHZXRNYXRlcmlhbGl2XzI9Ci0KLUdMX2dsR2V0UGl4ZWxNYXBmdj0KLUdMX2dsR2V0UGl4ZWxNYXBmdl8wPQotR0xfZ2xHZXRQaXhlbE1hcGZ2XzE9Ci0KLUdMX2dsR2V0UGl4ZWxNYXB1aXY9Ci1HTF9nbEdldFBpeGVsTWFwdWl2XzA9Ci1HTF9nbEdldFBpeGVsTWFwdWl2XzE9Ci0KLUdMX2dsR2V0UGl4ZWxNYXB1c3Y9Ci1HTF9nbEdldFBpeGVsTWFwdXN2XzA9Ci1HTF9nbEdldFBpeGVsTWFwdXN2XzE9Ci0KLUdMX2dsR2V0UG9pbnRlcnY9Ci1HTF9nbEdldFBvaW50ZXJ2XzA9Ci1HTF9nbEdldFBvaW50ZXJ2XzE9Ci0KLUdMX2dsR2V0UG9seWdvblN0aXBwbGU9Ci1HTF9nbEdldFBvbHlnb25TdGlwcGxlXzA9Ci0KLUdMX2dsR2V0U3RyaW5nPQotR0xfZ2xHZXRTdHJpbmdfMD0KLQotR0xfZ2xHZXRUZXhFbnZmdj0KLUdMX2dsR2V0VGV4RW52ZnZfMD0KLUdMX2dsR2V0VGV4RW52ZnZfMT0KLUdMX2dsR2V0VGV4RW52ZnZfMj0KLQotR0xfZ2xHZXRUZXhFbnZpdj0KLUdMX2dsR2V0VGV4RW52aXZfMD0KLUdMX2dsR2V0VGV4RW52aXZfMT0KLUdMX2dsR2V0VGV4RW52aXZfMj0KLQotR0xfZ2xHZXRUZXhHZW5kdj0KLUdMX2dsR2V0VGV4R2VuZHZfMD0KLUdMX2dsR2V0VGV4R2VuZHZfMT0KLUdMX2dsR2V0VGV4R2VuZHZfMj0KLQotR0xfZ2xHZXRUZXhHZW5mdj0KLUdMX2dsR2V0VGV4R2VuZnZfMD0KLUdMX2dsR2V0VGV4R2VuZnZfMT0KLUdMX2dsR2V0VGV4R2VuZnZfMj0KLQotR0xfZ2xHZXRUZXhHZW5pdj0KLUdMX2dsR2V0VGV4R2VuaXZfMD0KLUdMX2dsR2V0VGV4R2VuaXZfMT0KLUdMX2dsR2V0VGV4R2VuaXZfMj0KLQotR0xfZ2xHZXRUZXhJbWFnZT0KLUdMX2dsR2V0VGV4SW1hZ2VfMD0KLUdMX2dsR2V0VGV4SW1hZ2VfMT0KLUdMX2dsR2V0VGV4SW1hZ2VfMj0KLUdMX2dsR2V0VGV4SW1hZ2VfMz0KLUdMX2dsR2V0VGV4SW1hZ2VfND0KLQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2PQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzA9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMT0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8yPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzM9Ci0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8wPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzE9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8zPQotCi1HTF9nbEdldFRleFBhcmFtZXRlcmZ2PQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdl8wPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdl8xPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdl8yPQotCi1HTF9nbEdldFRleFBhcmFtZXRlcml2PQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdl8wPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdl8xPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdl8yPQotCi1HTF9nbEhpbnQ9Ci1HTF9nbEhpbnRfMD0KLUdMX2dsSGludF8xPQotCi1HTF9nbEluZGV4TWFzaz0KLUdMX2dsSW5kZXhNYXNrXzA9Ci0KLUdMX2dsSW5kZXhQb2ludGVyPQotR0xfZ2xJbmRleFBvaW50ZXJfMD0KLUdMX2dsSW5kZXhQb2ludGVyXzE9Ci1HTF9nbEluZGV4UG9pbnRlcl8yPQotCi1HTF9nbEluZGV4ZD0KLUdMX2dsSW5kZXhkXzA9Ci0KLUdMX2dsSW5kZXhkdj0KLUdMX2dsSW5kZXhkdl8wPQotCi1HTF9nbEluZGV4Zj0KLUdMX2dsSW5kZXhmXzA9Ci0KLUdMX2dsSW5kZXhmdj0KLUdMX2dsSW5kZXhmdl8wPQotCi1HTF9nbEluZGV4aT0KLUdMX2dsSW5kZXhpXzA9Ci0KLUdMX2dsSW5kZXhpdj0KLUdMX2dsSW5kZXhpdl8wPQotCi1HTF9nbEluZGV4cz0KLUdMX2dsSW5kZXhzXzA9Ci0KLUdMX2dsSW5kZXhzdj0KLUdMX2dsSW5kZXhzdl8wPQotCi1HTF9nbEluaXROYW1lcz0KLQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5cz0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXNfMD0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXNfMT0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXNfMj0KLQotR0xfZ2xJc0VuYWJsZWQ9Ci1HTF9nbElzRW5hYmxlZF8wPQotCi1HTF9nbElzTGlzdD0KLUdMX2dsSXNMaXN0XzA9Ci0KLUdMX2dsSXNUZXh0dXJlPQotR0xfZ2xJc1RleHR1cmVfMD0KLQotR0xfZ2xMaWdodE1vZGVsZj0KLUdMX2dsTGlnaHRNb2RlbGZfMD0KLUdMX2dsTGlnaHRNb2RlbGZfMT0KLQotR0xfZ2xMaWdodE1vZGVsZnY9Ci1HTF9nbExpZ2h0TW9kZWxmdl8wPQotR0xfZ2xMaWdodE1vZGVsZnZfMT0KLQotR0xfZ2xMaWdodE1vZGVsaT0KLUdMX2dsTGlnaHRNb2RlbGlfMD0KLUdMX2dsTGlnaHRNb2RlbGlfMT0KLQotR0xfZ2xMaWdodE1vZGVsaXY9Ci1HTF9nbExpZ2h0TW9kZWxpdl8wPQotR0xfZ2xMaWdodE1vZGVsaXZfMT0KLQotR0xfZ2xMaWdodGY9Ci1HTF9nbExpZ2h0Zl8wPQotR0xfZ2xMaWdodGZfMT0KLUdMX2dsTGlnaHRmXzI9Ci0KLUdMX2dsTGlnaHRmdj0KLUdMX2dsTGlnaHRmdl8wPQotR0xfZ2xMaWdodGZ2XzE9Ci1HTF9nbExpZ2h0ZnZfMj0KLQotR0xfZ2xMaWdodGk9Ci1HTF9nbExpZ2h0aV8wPQotR0xfZ2xMaWdodGlfMT0KLUdMX2dsTGlnaHRpXzI9Ci0KLUdMX2dsTGlnaHRpdj0KLUdMX2dsTGlnaHRpdl8wPQotR0xfZ2xMaWdodGl2XzE9Ci1HTF9nbExpZ2h0aXZfMj0KLQotR0xfZ2xMaW5lU3RpcHBsZT0KLUdMX2dsTGluZVN0aXBwbGVfMD0KLUdMX2dsTGluZVN0aXBwbGVfMT0KLQotR0xfZ2xMaW5lV2lkdGg9Ci1HTF9nbExpbmVXaWR0aF8wPQotCi1HTF9nbExpc3RCYXNlPQotR0xfZ2xMaXN0QmFzZV8wPQotCi1HTF9nbExvYWRJZGVudGl0eT0KLQotR0xfZ2xMb2FkTWF0cml4ZD0KLUdMX2dsTG9hZE1hdHJpeGRfMD0KLQotR0xfZ2xMb2FkTWF0cml4Zj0KLUdMX2dsTG9hZE1hdHJpeGZfMD0KLQotR0xfZ2xMb2FkTmFtZT0KLUdMX2dsTG9hZE5hbWVfMD0KLQotR0xfZ2xMb2dpY09wPQotR0xfZ2xMb2dpY09wXzA9Ci0KLUdMX2dsTWFwMWQ9Ci1HTF9nbE1hcDFkXzA9Ci1HTF9nbE1hcDFkXzE9Ci1HTF9nbE1hcDFkXzI9Ci1HTF9nbE1hcDFkXzM9Ci1HTF9nbE1hcDFkXzQ9Ci1HTF9nbE1hcDFkXzU9Ci0KLUdMX2dsTWFwMWY9Ci1HTF9nbE1hcDFmXzA9Ci1HTF9nbE1hcDFmXzE9Ci1HTF9nbE1hcDFmXzI9Ci1HTF9nbE1hcDFmXzM9Ci1HTF9nbE1hcDFmXzQ9Ci1HTF9nbE1hcDFmXzU9Ci0KLUdMX2dsTWFwMmQ9Ci1HTF9nbE1hcDJkXzA9Ci1HTF9nbE1hcDJkXzE9Ci1HTF9nbE1hcDJkXzI9Ci1HTF9nbE1hcDJkXzM9Ci1HTF9nbE1hcDJkXzQ9Ci1HTF9nbE1hcDJkXzU9Ci1HTF9nbE1hcDJkXzY9Ci1HTF9nbE1hcDJkXzc9Ci1HTF9nbE1hcDJkXzg9Ci1HTF9nbE1hcDJkXzk9Ci0KLUdMX2dsTWFwMmY9Ci1HTF9nbE1hcDJmXzA9Ci1HTF9nbE1hcDJmXzE9Ci1HTF9nbE1hcDJmXzI9Ci1HTF9nbE1hcDJmXzM9Ci1HTF9nbE1hcDJmXzQ9Ci1HTF9nbE1hcDJmXzU9Ci1HTF9nbE1hcDJmXzY9Ci1HTF9nbE1hcDJmXzc9Ci1HTF9nbE1hcDJmXzg9Ci1HTF9nbE1hcDJmXzk9Ci0KLUdMX2dsTWFwR3JpZDFkPQotR0xfZ2xNYXBHcmlkMWRfMD0KLUdMX2dsTWFwR3JpZDFkXzE9Ci1HTF9nbE1hcEdyaWQxZF8yPQotCi1HTF9nbE1hcEdyaWQxZj0KLUdMX2dsTWFwR3JpZDFmXzA9Ci1HTF9nbE1hcEdyaWQxZl8xPQotR0xfZ2xNYXBHcmlkMWZfMj0KLQotR0xfZ2xNYXBHcmlkMmQ9Ci1HTF9nbE1hcEdyaWQyZF8wPQotR0xfZ2xNYXBHcmlkMmRfMT0KLUdMX2dsTWFwR3JpZDJkXzI9Ci1HTF9nbE1hcEdyaWQyZF8zPQotR0xfZ2xNYXBHcmlkMmRfND0KLUdMX2dsTWFwR3JpZDJkXzU9Ci0KLUdMX2dsTWFwR3JpZDJmPQotR0xfZ2xNYXBHcmlkMmZfMD0KLUdMX2dsTWFwR3JpZDJmXzE9Ci1HTF9nbE1hcEdyaWQyZl8yPQotR0xfZ2xNYXBHcmlkMmZfMz0KLUdMX2dsTWFwR3JpZDJmXzQ9Ci1HTF9nbE1hcEdyaWQyZl81PQotCi1HTF9nbE1hdGVyaWFsZj0KLUdMX2dsTWF0ZXJpYWxmXzA9Ci1HTF9nbE1hdGVyaWFsZl8xPQotR0xfZ2xNYXRlcmlhbGZfMj0KLQotR0xfZ2xNYXRlcmlhbGZ2PQotR0xfZ2xNYXRlcmlhbGZ2XzA9Ci1HTF9nbE1hdGVyaWFsZnZfMT0KLUdMX2dsTWF0ZXJpYWxmdl8yPQotCi1HTF9nbE1hdGVyaWFsaT0KLUdMX2dsTWF0ZXJpYWxpXzA9Ci1HTF9nbE1hdGVyaWFsaV8xPQotR0xfZ2xNYXRlcmlhbGlfMj0KLQotR0xfZ2xNYXRlcmlhbGl2PQotR0xfZ2xNYXRlcmlhbGl2XzA9Ci1HTF9nbE1hdGVyaWFsaXZfMT0KLUdMX2dsTWF0ZXJpYWxpdl8yPQotCi1HTF9nbE1hdHJpeE1vZGU9Ci1HTF9nbE1hdHJpeE1vZGVfMD0KLQotR0xfZ2xNdWx0TWF0cml4ZD0KLUdMX2dsTXVsdE1hdHJpeGRfMD0KLQotR0xfZ2xNdWx0TWF0cml4Zj0KLUdMX2dsTXVsdE1hdHJpeGZfMD0KLQotR0xfZ2xOZXdMaXN0PQotR0xfZ2xOZXdMaXN0XzA9Ci1HTF9nbE5ld0xpc3RfMT0KLQotR0xfZ2xOb3JtYWwzYj0KLUdMX2dsTm9ybWFsM2JfMD0KLUdMX2dsTm9ybWFsM2JfMT0KLUdMX2dsTm9ybWFsM2JfMj0KLQotR0xfZ2xOb3JtYWwzYnY9Ci1HTF9nbE5vcm1hbDNidl8wPQotCi1HTF9nbE5vcm1hbDNkPQotR0xfZ2xOb3JtYWwzZF8wPQotR0xfZ2xOb3JtYWwzZF8xPQotR0xfZ2xOb3JtYWwzZF8yPQotCi1HTF9nbE5vcm1hbDNkdj0KLUdMX2dsTm9ybWFsM2R2XzA9Ci0KLUdMX2dsTm9ybWFsM2Y9Ci1HTF9nbE5vcm1hbDNmXzA9Ci1HTF9nbE5vcm1hbDNmXzE9Ci1HTF9nbE5vcm1hbDNmXzI9Ci0KLUdMX2dsTm9ybWFsM2Z2PQotR0xfZ2xOb3JtYWwzZnZfMD0KLQotR0xfZ2xOb3JtYWwzaT0KLUdMX2dsTm9ybWFsM2lfMD0KLUdMX2dsTm9ybWFsM2lfMT0KLUdMX2dsTm9ybWFsM2lfMj0KLQotR0xfZ2xOb3JtYWwzaXY9Ci1HTF9nbE5vcm1hbDNpdl8wPQotCi1HTF9nbE5vcm1hbDNzPQotR0xfZ2xOb3JtYWwzc18wPQotR0xfZ2xOb3JtYWwzc18xPQotR0xfZ2xOb3JtYWwzc18yPQotCi1HTF9nbE5vcm1hbDNzdj0KLUdMX2dsTm9ybWFsM3N2XzA9Ci0KLUdMX2dsTm9ybWFsUG9pbnRlcj0KLUdMX2dsTm9ybWFsUG9pbnRlcl8wPQotR0xfZ2xOb3JtYWxQb2ludGVyXzE9Ci1HTF9nbE5vcm1hbFBvaW50ZXJfMj0KLQotR0xfZ2xPcnRobz0KLUdMX2dsT3J0aG9fMD0KLUdMX2dsT3J0aG9fMT0KLUdMX2dsT3J0aG9fMj0KLUdMX2dsT3J0aG9fMz0KLUdMX2dsT3J0aG9fND0KLUdMX2dsT3J0aG9fNT0KLQotR0xfZ2xQYXNzVGhyb3VnaD0KLUdMX2dsUGFzc1Rocm91Z2hfMD0KLQotR0xfZ2xQaXhlbE1hcGZ2PQotR0xfZ2xQaXhlbE1hcGZ2XzA9Ci1HTF9nbFBpeGVsTWFwZnZfMT0KLUdMX2dsUGl4ZWxNYXBmdl8yPQotCi1HTF9nbFBpeGVsTWFwdWl2PQotR0xfZ2xQaXhlbE1hcHVpdl8wPQotR0xfZ2xQaXhlbE1hcHVpdl8xPQotR0xfZ2xQaXhlbE1hcHVpdl8yPQotCi1HTF9nbFBpeGVsTWFwdXN2PQotR0xfZ2xQaXhlbE1hcHVzdl8wPQotR0xfZ2xQaXhlbE1hcHVzdl8xPQotR0xfZ2xQaXhlbE1hcHVzdl8yPQotCi1HTF9nbFBpeGVsU3RvcmVmPQotR0xfZ2xQaXhlbFN0b3JlZl8wPQotR0xfZ2xQaXhlbFN0b3JlZl8xPQotCi1HTF9nbFBpeGVsU3RvcmVpPQotR0xfZ2xQaXhlbFN0b3JlaV8wPQotR0xfZ2xQaXhlbFN0b3JlaV8xPQotCi1HTF9nbFBpeGVsVHJhbnNmZXJmPQotR0xfZ2xQaXhlbFRyYW5zZmVyZl8wPQotR0xfZ2xQaXhlbFRyYW5zZmVyZl8xPQotCi1HTF9nbFBpeGVsVHJhbnNmZXJpPQotR0xfZ2xQaXhlbFRyYW5zZmVyaV8wPQotR0xfZ2xQaXhlbFRyYW5zZmVyaV8xPQotCi1HTF9nbFBpeGVsWm9vbT0KLUdMX2dsUGl4ZWxab29tXzA9Ci1HTF9nbFBpeGVsWm9vbV8xPQotCi1HTF9nbFBvaW50U2l6ZT0KLUdMX2dsUG9pbnRTaXplXzA9Ci0KLUdMX2dsUG9seWdvbk1vZGU9Ci1HTF9nbFBvbHlnb25Nb2RlXzA9Ci1HTF9nbFBvbHlnb25Nb2RlXzE9Ci0KLUdMX2dsUG9seWdvbk9mZnNldD0KLUdMX2dsUG9seWdvbk9mZnNldF8wPQotR0xfZ2xQb2x5Z29uT2Zmc2V0XzE9Ci0KLUdMX2dsUG9seWdvblN0aXBwbGU9Ci1HTF9nbFBvbHlnb25TdGlwcGxlXzA9Ci0KLUdMX2dsUG9wQXR0cmliPQotCi1HTF9nbFBvcENsaWVudEF0dHJpYj0KLQotR0xfZ2xQb3BNYXRyaXg9Ci0KLUdMX2dsUG9wTmFtZT0KLQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXM9Ci1HTF9nbFByaW9yaXRpemVUZXh0dXJlc18wPQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXNfMT0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzXzI9Ci0KLUdMX2dsUHVzaEF0dHJpYj0KLUdMX2dsUHVzaEF0dHJpYl8wPQotCi1HTF9nbFB1c2hDbGllbnRBdHRyaWI9Ci1HTF9nbFB1c2hDbGllbnRBdHRyaWJfMD0KLQotR0xfZ2xQdXNoTWF0cml4PQotCi1HTF9nbFB1c2hOYW1lPQotR0xfZ2xQdXNoTmFtZV8wPQotCi1HTF9nbFJhc3RlclBvczJkPQotR0xfZ2xSYXN0ZXJQb3MyZF8wPQotR0xfZ2xSYXN0ZXJQb3MyZF8xPQotCi1HTF9nbFJhc3RlclBvczJkdj0KLUdMX2dsUmFzdGVyUG9zMmR2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zMmY9Ci1HTF9nbFJhc3RlclBvczJmXzA9Ci1HTF9nbFJhc3RlclBvczJmXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMmZ2PQotR0xfZ2xSYXN0ZXJQb3MyZnZfMD0KLQotR0xfZ2xSYXN0ZXJQb3MyaT0KLUdMX2dsUmFzdGVyUG9zMmlfMD0KLUdMX2dsUmFzdGVyUG9zMmlfMT0KLQotR0xfZ2xSYXN0ZXJQb3MyaXY9Ci1HTF9nbFJhc3RlclBvczJpdl8wPQotCi1HTF9nbFJhc3RlclBvczJzPQotR0xfZ2xSYXN0ZXJQb3Myc18wPQotR0xfZ2xSYXN0ZXJQb3Myc18xPQotCi1HTF9nbFJhc3RlclBvczJzdj0KLUdMX2dsUmFzdGVyUG9zMnN2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zM2Q9Ci1HTF9nbFJhc3RlclBvczNkXzA9Ci1HTF9nbFJhc3RlclBvczNkXzE9Ci1HTF9nbFJhc3RlclBvczNkXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM2R2PQotR0xfZ2xSYXN0ZXJQb3MzZHZfMD0KLQotR0xfZ2xSYXN0ZXJQb3MzZj0KLUdMX2dsUmFzdGVyUG9zM2ZfMD0KLUdMX2dsUmFzdGVyUG9zM2ZfMT0KLUdMX2dsUmFzdGVyUG9zM2ZfMj0KLQotR0xfZ2xSYXN0ZXJQb3MzZnY9Ci1HTF9nbFJhc3RlclBvczNmdl8wPQotCi1HTF9nbFJhc3RlclBvczNpPQotR0xfZ2xSYXN0ZXJQb3MzaV8wPQotR0xfZ2xSYXN0ZXJQb3MzaV8xPQotR0xfZ2xSYXN0ZXJQb3MzaV8yPQotCi1HTF9nbFJhc3RlclBvczNpdj0KLUdMX2dsUmFzdGVyUG9zM2l2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zM3M9Ci1HTF9nbFJhc3RlclBvczNzXzA9Ci1HTF9nbFJhc3RlclBvczNzXzE9Ci1HTF9nbFJhc3RlclBvczNzXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM3N2PQotR0xfZ2xSYXN0ZXJQb3Mzc3ZfMD0KLQotR0xfZ2xSYXN0ZXJQb3M0ZD0KLUdMX2dsUmFzdGVyUG9zNGRfMD0KLUdMX2dsUmFzdGVyUG9zNGRfMT0KLUdMX2dsUmFzdGVyUG9zNGRfMj0KLUdMX2dsUmFzdGVyUG9zNGRfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0ZHY9Ci1HTF9nbFJhc3RlclBvczRkdl8wPQotCi1HTF9nbFJhc3RlclBvczRmPQotR0xfZ2xSYXN0ZXJQb3M0Zl8wPQotR0xfZ2xSYXN0ZXJQb3M0Zl8xPQotR0xfZ2xSYXN0ZXJQb3M0Zl8yPQotR0xfZ2xSYXN0ZXJQb3M0Zl8zPQotCi1HTF9nbFJhc3RlclBvczRmdj0KLUdMX2dsUmFzdGVyUG9zNGZ2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zNGk9Ci1HTF9nbFJhc3RlclBvczRpXzA9Ci1HTF9nbFJhc3RlclBvczRpXzE9Ci1HTF9nbFJhc3RlclBvczRpXzI9Ci1HTF9nbFJhc3RlclBvczRpXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNGl2PQotR0xfZ2xSYXN0ZXJQb3M0aXZfMD0KLQotR0xfZ2xSYXN0ZXJQb3M0cz0KLUdMX2dsUmFzdGVyUG9zNHNfMD0KLUdMX2dsUmFzdGVyUG9zNHNfMT0KLUdMX2dsUmFzdGVyUG9zNHNfMj0KLUdMX2dsUmFzdGVyUG9zNHNfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0c3Y9Ci1HTF9nbFJhc3RlclBvczRzdl8wPQotCi1HTF9nbFJlYWRCdWZmZXI9Ci1HTF9nbFJlYWRCdWZmZXJfMD0KLQotR0xfZ2xSZWFkUGl4ZWxzPQotR0xfZ2xSZWFkUGl4ZWxzXzA9Ci1HTF9nbFJlYWRQaXhlbHNfMT0KLUdMX2dsUmVhZFBpeGVsc18yPQotR0xfZ2xSZWFkUGl4ZWxzXzM9Ci1HTF9nbFJlYWRQaXhlbHNfND0KLUdMX2dsUmVhZFBpeGVsc181PQotR0xfZ2xSZWFkUGl4ZWxzXzY9Ci0KLUdMX2dsUmVjdGQ9Ci1HTF9nbFJlY3RkXzA9Ci1HTF9nbFJlY3RkXzE9Ci1HTF9nbFJlY3RkXzI9Ci1HTF9nbFJlY3RkXzM9Ci0KLUdMX2dsUmVjdGR2PQotR0xfZ2xSZWN0ZHZfMD0KLUdMX2dsUmVjdGR2XzE9Ci0KLUdMX2dsUmVjdGY9Ci1HTF9nbFJlY3RmXzA9Ci1HTF9nbFJlY3RmXzE9Ci1HTF9nbFJlY3RmXzI9Ci1HTF9nbFJlY3RmXzM9Ci0KLUdMX2dsUmVjdGZ2PQotR0xfZ2xSZWN0ZnZfMD0KLUdMX2dsUmVjdGZ2XzE9Ci0KLUdMX2dsUmVjdGk9Ci1HTF9nbFJlY3RpXzA9Ci1HTF9nbFJlY3RpXzE9Ci1HTF9nbFJlY3RpXzI9Ci1HTF9nbFJlY3RpXzM9Ci0KLUdMX2dsUmVjdGl2PQotR0xfZ2xSZWN0aXZfMD0KLUdMX2dsUmVjdGl2XzE9Ci0KLUdMX2dsUmVjdHM9Ci1HTF9nbFJlY3RzXzA9Ci1HTF9nbFJlY3RzXzE9Ci1HTF9nbFJlY3RzXzI9Ci1HTF9nbFJlY3RzXzM9Ci0KLUdMX2dsUmVjdHN2PQotR0xfZ2xSZWN0c3ZfMD0KLUdMX2dsUmVjdHN2XzE9Ci0KLUdMX2dsUmVuZGVyTW9kZT0KLUdMX2dsUmVuZGVyTW9kZV8wPQotCi1HTF9nbFJvdGF0ZWQ9Ci1HTF9nbFJvdGF0ZWRfMD0KLUdMX2dsUm90YXRlZF8xPQotR0xfZ2xSb3RhdGVkXzI9Ci1HTF9nbFJvdGF0ZWRfMz0KLQotR0xfZ2xSb3RhdGVmPQotR0xfZ2xSb3RhdGVmXzA9Ci1HTF9nbFJvdGF0ZWZfMT0KLUdMX2dsUm90YXRlZl8yPQotR0xfZ2xSb3RhdGVmXzM9Ci0KLUdMX2dsU2NhbGVkPQotR0xfZ2xTY2FsZWRfMD0KLUdMX2dsU2NhbGVkXzE9Ci1HTF9nbFNjYWxlZF8yPQotCi1HTF9nbFNjYWxlZj0KLUdMX2dsU2NhbGVmXzA9Ci1HTF9nbFNjYWxlZl8xPQotR0xfZ2xTY2FsZWZfMj0KLQotR0xfZ2xTY2lzc29yPQotR0xfZ2xTY2lzc29yXzA9Ci1HTF9nbFNjaXNzb3JfMT0KLUdMX2dsU2Npc3Nvcl8yPQotR0xfZ2xTY2lzc29yXzM9Ci0KLUdMX2dsU2VsZWN0QnVmZmVyPQotR0xfZ2xTZWxlY3RCdWZmZXJfMD0KLUdMX2dsU2VsZWN0QnVmZmVyXzE9Ci0KLUdMX2dsU2hhZGVNb2RlbD0KLUdMX2dsU2hhZGVNb2RlbF8wPQotCi1HTF9nbFN0ZW5jaWxGdW5jPQotR0xfZ2xTdGVuY2lsRnVuY18wPQotR0xfZ2xTdGVuY2lsRnVuY18xPQotR0xfZ2xTdGVuY2lsRnVuY18yPQotCi1HTF9nbFN0ZW5jaWxNYXNrPQotR0xfZ2xTdGVuY2lsTWFza18wPQotCi1HTF9nbFN0ZW5jaWxPcD0KLUdMX2dsU3RlbmNpbE9wXzA9Ci1HTF9nbFN0ZW5jaWxPcF8xPQotR0xfZ2xTdGVuY2lsT3BfMj0KLQotR0xfZ2xUZXhDb29yZDFkPQotR0xfZ2xUZXhDb29yZDFkXzA9Ci0KLUdMX2dsVGV4Q29vcmQxZHY9Ci1HTF9nbFRleENvb3JkMWR2XzA9Ci0KLUdMX2dsVGV4Q29vcmQxZj0KLUdMX2dsVGV4Q29vcmQxZl8wPQotCi1HTF9nbFRleENvb3JkMWZ2PQotR0xfZ2xUZXhDb29yZDFmdl8wPQotCi1HTF9nbFRleENvb3JkMWk9Ci1HTF9nbFRleENvb3JkMWlfMD0KLQotR0xfZ2xUZXhDb29yZDFpdj0KLUdMX2dsVGV4Q29vcmQxaXZfMD0KLQotR0xfZ2xUZXhDb29yZDFzPQotR0xfZ2xUZXhDb29yZDFzXzA9Ci0KLUdMX2dsVGV4Q29vcmQxc3Y9Ci1HTF9nbFRleENvb3JkMXN2XzA9Ci0KLUdMX2dsVGV4Q29vcmQyZD0KLUdMX2dsVGV4Q29vcmQyZF8wPQotR0xfZ2xUZXhDb29yZDJkXzE9Ci0KLUdMX2dsVGV4Q29vcmQyZHY9Ci1HTF9nbFRleENvb3JkMmR2XzA9Ci0KLUdMX2dsVGV4Q29vcmQyZj0KLUdMX2dsVGV4Q29vcmQyZl8wPQotR0xfZ2xUZXhDb29yZDJmXzE9Ci0KLUdMX2dsVGV4Q29vcmQyZnY9Ci1HTF9nbFRleENvb3JkMmZ2XzA9Ci0KLUdMX2dsVGV4Q29vcmQyaT0KLUdMX2dsVGV4Q29vcmQyaV8wPQotR0xfZ2xUZXhDb29yZDJpXzE9Ci0KLUdMX2dsVGV4Q29vcmQyaXY9Ci1HTF9nbFRleENvb3JkMml2XzA9Ci0KLUdMX2dsVGV4Q29vcmQycz0KLUdMX2dsVGV4Q29vcmQyc18wPQotR0xfZ2xUZXhDb29yZDJzXzE9Ci0KLUdMX2dsVGV4Q29vcmQyc3Y9Ci1HTF9nbFRleENvb3JkMnN2XzA9Ci0KLUdMX2dsVGV4Q29vcmQzZD0KLUdMX2dsVGV4Q29vcmQzZF8wPQotR0xfZ2xUZXhDb29yZDNkXzE9Ci1HTF9nbFRleENvb3JkM2RfMj0KLQotR0xfZ2xUZXhDb29yZDNkdj0KLUdMX2dsVGV4Q29vcmQzZHZfMD0KLQotR0xfZ2xUZXhDb29yZDNmPQotR0xfZ2xUZXhDb29yZDNmXzA9Ci1HTF9nbFRleENvb3JkM2ZfMT0KLUdMX2dsVGV4Q29vcmQzZl8yPQotCi1HTF9nbFRleENvb3JkM2Z2PQotR0xfZ2xUZXhDb29yZDNmdl8wPQotCi1HTF9nbFRleENvb3JkM2k9Ci1HTF9nbFRleENvb3JkM2lfMD0KLUdMX2dsVGV4Q29vcmQzaV8xPQotR0xfZ2xUZXhDb29yZDNpXzI9Ci0KLUdMX2dsVGV4Q29vcmQzaXY9Ci1HTF9nbFRleENvb3JkM2l2XzA9Ci0KLUdMX2dsVGV4Q29vcmQzcz0KLUdMX2dsVGV4Q29vcmQzc18wPQotR0xfZ2xUZXhDb29yZDNzXzE9Ci1HTF9nbFRleENvb3JkM3NfMj0KLQotR0xfZ2xUZXhDb29yZDNzdj0KLUdMX2dsVGV4Q29vcmQzc3ZfMD0KLQotR0xfZ2xUZXhDb29yZDRkPQotR0xfZ2xUZXhDb29yZDRkXzA9Ci1HTF9nbFRleENvb3JkNGRfMT0KLUdMX2dsVGV4Q29vcmQ0ZF8yPQotR0xfZ2xUZXhDb29yZDRkXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0ZHY9Ci1HTF9nbFRleENvb3JkNGR2XzA9Ci0KLUdMX2dsVGV4Q29vcmQ0Zj0KLUdMX2dsVGV4Q29vcmQ0Zl8wPQotR0xfZ2xUZXhDb29yZDRmXzE9Ci1HTF9nbFRleENvb3JkNGZfMj0KLUdMX2dsVGV4Q29vcmQ0Zl8zPQotCi1HTF9nbFRleENvb3JkNGZ2PQotR0xfZ2xUZXhDb29yZDRmdl8wPQotCi1HTF9nbFRleENvb3JkNGk9Ci1HTF9nbFRleENvb3JkNGlfMD0KLUdMX2dsVGV4Q29vcmQ0aV8xPQotR0xfZ2xUZXhDb29yZDRpXzI9Ci1HTF9nbFRleENvb3JkNGlfMz0KLQotR0xfZ2xUZXhDb29yZDRpdj0KLUdMX2dsVGV4Q29vcmQ0aXZfMD0KLQotR0xfZ2xUZXhDb29yZDRzPQotR0xfZ2xUZXhDb29yZDRzXzA9Ci1HTF9nbFRleENvb3JkNHNfMT0KLUdMX2dsVGV4Q29vcmQ0c18yPQotR0xfZ2xUZXhDb29yZDRzXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0c3Y9Ci1HTF9nbFRleENvb3JkNHN2XzA9Ci0KLUdMX2dsVGV4Q29vcmRQb2ludGVyPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMD0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzE9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8yPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMz0KLQotR0xfZ2xUZXhFbnZmPQotR0xfZ2xUZXhFbnZmXzA9Ci1HTF9nbFRleEVudmZfMT0KLUdMX2dsVGV4RW52Zl8yPQotCi1HTF9nbFRleEVudmZ2PQotR0xfZ2xUZXhFbnZmdl8wPQotR0xfZ2xUZXhFbnZmdl8xPQotR0xfZ2xUZXhFbnZmdl8yPQotCi1HTF9nbFRleEVudmk9Ci1HTF9nbFRleEVudmlfMD0KLUdMX2dsVGV4RW52aV8xPQotR0xfZ2xUZXhFbnZpXzI9Ci0KLUdMX2dsVGV4RW52aXY9Ci1HTF9nbFRleEVudml2XzA9Ci1HTF9nbFRleEVudml2XzE9Ci1HTF9nbFRleEVudml2XzI9Ci0KLUdMX2dsVGV4R2VuZD0KLUdMX2dsVGV4R2VuZF8wPQotR0xfZ2xUZXhHZW5kXzE9Ci1HTF9nbFRleEdlbmRfMj0KLQotR0xfZ2xUZXhHZW5kdj0KLUdMX2dsVGV4R2VuZHZfMD0KLUdMX2dsVGV4R2VuZHZfMT0KLUdMX2dsVGV4R2VuZHZfMj0KLQotR0xfZ2xUZXhHZW5mPQotR0xfZ2xUZXhHZW5mXzA9Ci1HTF9nbFRleEdlbmZfMT0KLUdMX2dsVGV4R2VuZl8yPQotCi1HTF9nbFRleEdlbmZ2PQotR0xfZ2xUZXhHZW5mdl8wPQotR0xfZ2xUZXhHZW5mdl8xPQotR0xfZ2xUZXhHZW5mdl8yPQotCi1HTF9nbFRleEdlbmk9Ci1HTF9nbFRleEdlbmlfMD0KLUdMX2dsVGV4R2VuaV8xPQotR0xfZ2xUZXhHZW5pXzI9Ci0KLUdMX2dsVGV4R2VuaXY9Ci1HTF9nbFRleEdlbml2XzA9Ci1HTF9nbFRleEdlbml2XzE9Ci1HTF9nbFRleEdlbml2XzI9Ci0KLUdMX2dsVGV4SW1hZ2UxRD0KLUdMX2dsVGV4SW1hZ2UxRF8wPQotR0xfZ2xUZXhJbWFnZTFEXzE9Ci1HTF9nbFRleEltYWdlMURfMj0KLUdMX2dsVGV4SW1hZ2UxRF8zPQotR0xfZ2xUZXhJbWFnZTFEXzQ9Ci1HTF9nbFRleEltYWdlMURfNT0KLUdMX2dsVGV4SW1hZ2UxRF82PQotR0xfZ2xUZXhJbWFnZTFEXzc9Ci0KLUdMX2dsVGV4SW1hZ2UyRD0KLUdMX2dsVGV4SW1hZ2UyRF8wPQotR0xfZ2xUZXhJbWFnZTJEXzE9Ci1HTF9nbFRleEltYWdlMkRfMj0KLUdMX2dsVGV4SW1hZ2UyRF8zPQotR0xfZ2xUZXhJbWFnZTJEXzQ9Ci1HTF9nbFRleEltYWdlMkRfNT0KLUdMX2dsVGV4SW1hZ2UyRF82PQotR0xfZ2xUZXhJbWFnZTJEXzc9Ci1HTF9nbFRleEltYWdlMkRfOD0KLQotR0xfZ2xUZXhQYXJhbWV0ZXJmPQotR0xfZ2xUZXhQYXJhbWV0ZXJmXzA9Ci1HTF9nbFRleFBhcmFtZXRlcmZfMT0KLUdMX2dsVGV4UGFyYW1ldGVyZl8yPQotCi1HTF9nbFRleFBhcmFtZXRlcmZ2PQotR0xfZ2xUZXhQYXJhbWV0ZXJmdl8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJmdl8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJmdl8yPQotCi1HTF9nbFRleFBhcmFtZXRlcmk9Ci1HTF9nbFRleFBhcmFtZXRlcmlfMD0KLUdMX2dsVGV4UGFyYW1ldGVyaV8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJpXzI9Ci0KLUdMX2dsVGV4UGFyYW1ldGVyaXY9Ci1HTF9nbFRleFBhcmFtZXRlcml2XzA9Ci1HTF9nbFRleFBhcmFtZXRlcml2XzE9Ci1HTF9nbFRleFBhcmFtZXRlcml2XzI9Ci0KLUdMX2dsVGV4U3ViSW1hZ2UxRD0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8wPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzE9Ci1HTF9nbFRleFN1YkltYWdlMURfMj0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8zPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzQ9Ci1HTF9nbFRleFN1YkltYWdlMURfNT0KLUdMX2dsVGV4U3ViSW1hZ2UxRF82PQotCi1HTF9nbFRleFN1YkltYWdlMkQ9Ci1HTF9nbFRleFN1YkltYWdlMkRfMD0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8xPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzI9Ci1HTF9nbFRleFN1YkltYWdlMkRfMz0KLUdMX2dsVGV4U3ViSW1hZ2UyRF80PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzU9Ci1HTF9nbFRleFN1YkltYWdlMkRfNj0KLUdMX2dsVGV4U3ViSW1hZ2UyRF83PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzg9Ci0KLUdMX2dsVHJhbnNsYXRlZD0KLUdMX2dsVHJhbnNsYXRlZF8wPQotR0xfZ2xUcmFuc2xhdGVkXzE9Ci1HTF9nbFRyYW5zbGF0ZWRfMj0KLQotR0xfZ2xUcmFuc2xhdGVmPQotR0xfZ2xUcmFuc2xhdGVmXzA9Ci1HTF9nbFRyYW5zbGF0ZWZfMT0KLUdMX2dsVHJhbnNsYXRlZl8yPQotCi1HTF9nbFZlcnRleDJkPQotR0xfZ2xWZXJ0ZXgyZF8wPQotR0xfZ2xWZXJ0ZXgyZF8xPQotCi1HTF9nbFZlcnRleDJkdj0KLUdMX2dsVmVydGV4MmR2XzA9Ci0KLUdMX2dsVmVydGV4MmY9Ci1HTF9nbFZlcnRleDJmXzA9Ci1HTF9nbFZlcnRleDJmXzE9Ci0KLUdMX2dsVmVydGV4MmZ2PQotR0xfZ2xWZXJ0ZXgyZnZfMD0KLQotR0xfZ2xWZXJ0ZXgyaT0KLUdMX2dsVmVydGV4MmlfMD0KLUdMX2dsVmVydGV4MmlfMT0KLQotR0xfZ2xWZXJ0ZXgyaXY9Ci1HTF9nbFZlcnRleDJpdl8wPQotCi1HTF9nbFZlcnRleDJzPQotR0xfZ2xWZXJ0ZXgyc18wPQotR0xfZ2xWZXJ0ZXgyc18xPQotCi1HTF9nbFZlcnRleDJzdj0KLUdMX2dsVmVydGV4MnN2XzA9Ci0KLUdMX2dsVmVydGV4M2Q9Ci1HTF9nbFZlcnRleDNkXzA9Ci1HTF9nbFZlcnRleDNkXzE9Ci1HTF9nbFZlcnRleDNkXzI9Ci0KLUdMX2dsVmVydGV4M2R2X19JPQotR0xfZ2xWZXJ0ZXgzZHZfX0lfMD0KLQotR0xfZ2xWZXJ0ZXgzZHZfX18zRD0KLUdMX2dsVmVydGV4M2R2X19fM0RfMD0KLQotR0xfZ2xWZXJ0ZXgzZj0KLUdMX2dsVmVydGV4M2ZfMD0KLUdMX2dsVmVydGV4M2ZfMT0KLUdMX2dsVmVydGV4M2ZfMj0KLQotR0xfZ2xWZXJ0ZXgzZnY9Ci1HTF9nbFZlcnRleDNmdl8wPQotCi1HTF9nbFZlcnRleDNpPQotR0xfZ2xWZXJ0ZXgzaV8wPQotR0xfZ2xWZXJ0ZXgzaV8xPQotR0xfZ2xWZXJ0ZXgzaV8yPQotCi1HTF9nbFZlcnRleDNpdj0KLUdMX2dsVmVydGV4M2l2XzA9Ci0KLUdMX2dsVmVydGV4M3M9Ci1HTF9nbFZlcnRleDNzXzA9Ci1HTF9nbFZlcnRleDNzXzE9Ci1HTF9nbFZlcnRleDNzXzI9Ci0KLUdMX2dsVmVydGV4M3N2PQotR0xfZ2xWZXJ0ZXgzc3ZfMD0KLQotR0xfZ2xWZXJ0ZXg0ZD0KLUdMX2dsVmVydGV4NGRfMD0KLUdMX2dsVmVydGV4NGRfMT0KLUdMX2dsVmVydGV4NGRfMj0KLUdMX2dsVmVydGV4NGRfMz0KLQotR0xfZ2xWZXJ0ZXg0ZHY9Ci1HTF9nbFZlcnRleDRkdl8wPQotCi1HTF9nbFZlcnRleDRmPQotR0xfZ2xWZXJ0ZXg0Zl8wPQotR0xfZ2xWZXJ0ZXg0Zl8xPQotR0xfZ2xWZXJ0ZXg0Zl8yPQotR0xfZ2xWZXJ0ZXg0Zl8zPQotCi1HTF9nbFZlcnRleDRmdj0KLUdMX2dsVmVydGV4NGZ2XzA9Ci0KLUdMX2dsVmVydGV4NGk9Ci1HTF9nbFZlcnRleDRpXzA9Ci1HTF9nbFZlcnRleDRpXzE9Ci1HTF9nbFZlcnRleDRpXzI9Ci1HTF9nbFZlcnRleDRpXzM9Ci0KLUdMX2dsVmVydGV4NGl2PQotR0xfZ2xWZXJ0ZXg0aXZfMD0KLQotR0xfZ2xWZXJ0ZXg0cz0KLUdMX2dsVmVydGV4NHNfMD0KLUdMX2dsVmVydGV4NHNfMT0KLUdMX2dsVmVydGV4NHNfMj0KLUdMX2dsVmVydGV4NHNfMz0KLQotR0xfZ2xWZXJ0ZXg0c3Y9Ci1HTF9nbFZlcnRleDRzdl8wPQotCi1HTF9nbFZlcnRleFBvaW50ZXI9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMD0KLUdMX2dsVmVydGV4UG9pbnRlcl8xPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzI9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMz0KLQotR0xfZ2xWaWV3cG9ydD0KLUdMX2dsVmlld3BvcnRfMD0KLUdMX2dsVmlld3BvcnRfMT0KLUdMX2dsVmlld3BvcnRfMj0KLUdMX2dsVmlld3BvcnRfMz0KLQotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMQ29udGV4dD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTERhdGE9ZmxhZ3M9bm9fZ2VuCi1HTERhdGFfZGV2aWNlPQotR0xEYXRhX3N0eWxlPQotR0xEYXRhX2ltYWdlPQotR0xEYXRhX2Rpc3BsYXk9Ci1HTERhdGFfZHJhd2FibGU9Ci1HTERhdGFfZm9yZWdyb3VuZD0KLUdMRGF0YV9iYWNrZ3JvdW5kPQotR0xEYXRhX2ZvbnQ9Ci1HTERhdGFfY29sb3JtYXA9Ci1HTERhdGFfY2xpcFJnbj0KLUdMRGF0YV9saW5lU3R5bGU9Ci1HTERhdGFfcmVuZGVyVGFibGU9Ci1HTERhdGFfc3RyaW5nPQotR0xEYXRhX3N0cmluZ1dpZHRoPQotR0xEYXRhX3N0cmluZ0hlaWdodD0KLUdMRGF0YV94bVN0cmluZz0KLUdMRGF0YV90ZXh0PQotR0xEYXRhX3RleHRXaWR0aD0KLUdMRGF0YV90ZXh0SGVpZ2h0PQotR0xEYXRhX3htVGV4dD0KLUdMRGF0YV94bU1uZW1vbmljPQotR0xEYXRhX2RyYXdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTERyYXdhYmxlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMTGlzdGVuZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xVPQotR0xVX2dsdUJlZ2luQ3VydmU9Ci1HTFVfZ2x1QmVnaW5DdXJ2ZV8wPWNhc3Q9KEdMVW51cmJzICopCi0KLUdMVV9nbHVCZWdpblBvbHlnb249Ci1HTFVfZ2x1QmVnaW5Qb2x5Z29uXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciopCi0KLUdMVV9nbHVCZWdpblN1cmZhY2U9Ci1HTFVfZ2x1QmVnaW5TdXJmYWNlXzA9Y2FzdD0oR0xVbnVyYnMgKikKLQotR0xVX2dsdUJlZ2luVHJpbT0KLUdMVV9nbHVCZWdpblRyaW1fMD1jYXN0PShHTFVudXJicyAqKQotCi1HTFVfZ2x1QnVpbGQxRE1pcG1hcHM9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMD0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18xPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzI9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMz0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc180PQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzU9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1HTFVfZ2x1QnVpbGQyRE1pcG1hcHM9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMD0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18xPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzI9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMz0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc180PQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzU9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfNj1mbGFncz1jcml0aWNhbAotCi1HTFVfZ2x1Q3lsaW5kZXI9Ci1HTFVfZ2x1Q3lsaW5kZXJfMD1jYXN0PShHTFVxdWFkcmljICopCi1HTFVfZ2x1Q3lsaW5kZXJfMT0KLUdMVV9nbHVDeWxpbmRlcl8yPQotR0xVX2dsdUN5bGluZGVyXzM9Ci1HTFVfZ2x1Q3lsaW5kZXJfND0KLUdMVV9nbHVDeWxpbmRlcl81PQotCi1HTFVfZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcj0KLUdMVV9nbHVEZWxldGVOdXJic1JlbmRlcmVyXzA9Y2FzdD0oR0xVbnVyYnMgKikKLQotR0xVX2dsdURlbGV0ZVF1YWRyaWM9Ci1HTFVfZ2x1RGVsZXRlUXVhZHJpY18wPWNhc3Q9KEdMVXF1YWRyaWMgKikKLQotR0xVX2dsdURlbGV0ZVRlc3M9Ci1HTFVfZ2x1RGVsZXRlVGVzc18wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLQotR0xVX2dsdURpc2s9Ci1HTFVfZ2x1RGlza18wPWNhc3Q9KEdMVXF1YWRyaWNPYmogKikKLUdMVV9nbHVEaXNrXzE9Ci1HTFVfZ2x1RGlza18yPQotR0xVX2dsdURpc2tfMz0KLUdMVV9nbHVEaXNrXzQ9Ci0KLUdMVV9nbHVFbmRDdXJ2ZT0KLUdMVV9nbHVFbmRDdXJ2ZV8wPWNhc3Q9KEdMVW51cmJzT2JqICopCi0KLUdMVV9nbHVFbmRQb2x5Z29uPQotR0xVX2dsdUVuZFBvbHlnb25fMD1jYXN0PShHTFV0cmlhbmd1bGF0b3JPYmogKikKLQotR0xVX2dsdUVuZFN1cmZhY2U9Ci1HTFVfZ2x1RW5kU3VyZmFjZV8wPWNhc3Q9KEdMVW51cmJzT2JqICopCi0KLUdMVV9nbHVFbmRUcmltPQotR0xVX2dsdUVuZFRyaW1fMD1jYXN0PShHTFVudXJic09iaiAqKQotCi1HTFVfZ2x1RXJyb3JTdHJpbmc9Ci1HTFVfZ2x1RXJyb3JTdHJpbmdfMD0KLQotR0xVX2dsdUdldE51cmJzUHJvcGVydHk9Ci1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eV8wPWNhc3Q9KEdMVW51cmJzICopCi1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eV8xPQotR0xVX2dsdUdldE51cmJzUHJvcGVydHlfMj1mbGFncz1jcml0aWNhbAotCi1HTFVfZ2x1R2V0U3RyaW5nPQotR0xVX2dsdUdldFN0cmluZ18wPQotCi1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5PQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eV8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVHZXRUZXNzUHJvcGVydHlfMT0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHlfMj1mbGFncz1jcml0aWNhbAotCi1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXM9Ci1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMD1jYXN0PShHTFVudXJicyAqKQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzE9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18yPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMz1mbGFncz1jcml0aWNhbAotCi1HTFVfZ2x1TG9va0F0PQotR0xVX2dsdUxvb2tBdF8wPQotR0xVX2dsdUxvb2tBdF8xPQotR0xVX2dsdUxvb2tBdF8yPQotR0xVX2dsdUxvb2tBdF8zPQotR0xVX2dsdUxvb2tBdF80PQotR0xVX2dsdUxvb2tBdF81PQotR0xVX2dsdUxvb2tBdF82PQotR0xVX2dsdUxvb2tBdF83PQotR0xVX2dsdUxvb2tBdF84PQotCi1HTFVfZ2x1TmV3TnVyYnNSZW5kZXJlcj0KLQotR0xVX2dsdU5ld1F1YWRyaWM9Ci0KLUdMVV9nbHVOZXdUZXNzPQotCi1HTFVfZ2x1TmV4dENvbnRvdXI9Ci1HTFVfZ2x1TmV4dENvbnRvdXJfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1TmV4dENvbnRvdXJfMT0KLQotR0xVX2dsdU51cmJzQ2FsbGJhY2s9Ci1HTFVfZ2x1TnVyYnNDYWxsYmFja18wPWNhc3Q9KEdMVW51cmJzICopCi1HTFVfZ2x1TnVyYnNDYWxsYmFja18xPQotR0xVX2dsdU51cmJzQ2FsbGJhY2tfMj1jYXN0PShHTHZvaWQoKikpCi0KLUdMVV9nbHVOdXJic0N1cnZlPQotR0xVX2dsdU51cmJzQ3VydmVfMD1jYXN0PShHTFVudXJicyAqKQotR0xVX2dsdU51cmJzQ3VydmVfMT0KLUdMVV9nbHVOdXJic0N1cnZlXzI9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVOdXJic0N1cnZlXzM9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV80PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TnVyYnNDdXJ2ZV81PQotR0xVX2dsdU51cmJzQ3VydmVfNj0KLQotR0xVX2dsdU51cmJzUHJvcGVydHk9Ci1HTFVfZ2x1TnVyYnNQcm9wZXJ0eV8wPWNhc3Q9KEdMVW51cmJzICopCi1HTFVfZ2x1TnVyYnNQcm9wZXJ0eV8xPQotR0xVX2dsdU51cmJzUHJvcGVydHlfMj0KLQotR0xVX2dsdU51cmJzU3VyZmFjZT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMD1jYXN0PShHTFVudXJic09iaiAqKQotR0xVX2dsdU51cmJzU3VyZmFjZV8xPQotR0xVX2dsdU51cmJzU3VyZmFjZV8yPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TnVyYnNTdXJmYWNlXzM9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzQ9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVOdXJic1N1cmZhY2VfNT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfNj0KLUdMVV9nbHVOdXJic1N1cmZhY2VfNz1mbGFncz1jcml0aWNhbAotR0xVX2dsdU51cmJzU3VyZmFjZV84PQotR0xVX2dsdU51cmJzU3VyZmFjZV85PQotR0xVX2dsdU51cmJzU3VyZmFjZV8xMD0KLQotR0xVX2dsdU9ydGhvMkQ9Ci1HTFVfZ2x1T3J0aG8yRF8wPQotR0xVX2dsdU9ydGhvMkRfMT0KLUdMVV9nbHVPcnRobzJEXzI9Ci1HTFVfZ2x1T3J0aG8yRF8zPQotCi1HTFVfZ2x1UGFydGlhbERpc2s9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMD1jYXN0PShHTFVxdWFkcmljICopCi1HTFVfZ2x1UGFydGlhbERpc2tfMT0KLUdMVV9nbHVQYXJ0aWFsRGlza18yPQotR0xVX2dsdVBhcnRpYWxEaXNrXzM9Ci1HTFVfZ2x1UGFydGlhbERpc2tfND0KLUdMVV9nbHVQYXJ0aWFsRGlza181PQotR0xVX2dsdVBhcnRpYWxEaXNrXzY9Ci0KLUdMVV9nbHVQZXJzcGVjdGl2ZT0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8wPQotR0xVX2dsdVBlcnNwZWN0aXZlXzE9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMj0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8zPQotCi1HTFVfZ2x1UGlja01hdHJpeD0KLUdMVV9nbHVQaWNrTWF0cml4XzA9Ci1HTFVfZ2x1UGlja01hdHJpeF8xPQotR0xVX2dsdVBpY2tNYXRyaXhfMj0KLUdMVV9nbHVQaWNrTWF0cml4XzM9Ci1HTFVfZ2x1UGlja01hdHJpeF80PWZsYWdzPWNyaXRpY2FsCi0KLUdMVV9nbHVQcm9qZWN0PQotR0xVX2dsdVByb2plY3RfMD0KLUdMVV9nbHVQcm9qZWN0XzE9Ci1HTFVfZ2x1UHJvamVjdF8yPQotR0xVX2dsdVByb2plY3RfMz1mbGFncz1jcml0aWNhbAotR0xVX2dsdVByb2plY3RfND1mbGFncz1jcml0aWNhbAotR0xVX2dsdVByb2plY3RfNT1mbGFncz1jcml0aWNhbAotR0xVX2dsdVByb2plY3RfNj1mbGFncz1jcml0aWNhbAotR0xVX2dsdVByb2plY3RfNz1mbGFncz1jcml0aWNhbAotR0xVX2dsdVByb2plY3RfOD1mbGFncz1jcml0aWNhbAotCi1HTFVfZ2x1UHdsQ3VydmU9Ci1HTFVfZ2x1UHdsQ3VydmVfMD1jYXN0PShHTFVudXJicyAqKQotR0xVX2dsdVB3bEN1cnZlXzE9Ci1HTFVfZ2x1UHdsQ3VydmVfMj1mbGFncz1jcml0aWNhbAotR0xVX2dsdVB3bEN1cnZlXzM9Ci1HTFVfZ2x1UHdsQ3VydmVfND0KLQotR0xVX2dsdVF1YWRyaWNDYWxsYmFjaz0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2tfMD1jYXN0PShHTFVxdWFkcmljT2JqICopCi1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrXzE9Ci1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrXzI9Y2FzdD0oR0x2b2lkKCopKQotCi1HTFVfZ2x1UXVhZHJpY0RyYXdTdHlsZT0KLUdMVV9nbHVRdWFkcmljRHJhd1N0eWxlXzA9Y2FzdD0oR0xVcXVhZHJpY09iaiAqKQotR0xVX2dsdVF1YWRyaWNEcmF3U3R5bGVfMT0KLQotR0xVX2dsdVF1YWRyaWNOb3JtYWxzPQotR0xVX2dsdVF1YWRyaWNOb3JtYWxzXzA9Y2FzdD0oR0xVcXVhZHJpY09iaiAqKQotR0xVX2dsdVF1YWRyaWNOb3JtYWxzXzE9Ci0KLUdMVV9nbHVRdWFkcmljT3JpZW50YXRpb249Ci1HTFVfZ2x1UXVhZHJpY09yaWVudGF0aW9uXzA9Y2FzdD0oR0xVcXVhZHJpYyAqKQotR0xVX2dsdVF1YWRyaWNPcmllbnRhdGlvbl8xPQotCi1HTFVfZ2x1UXVhZHJpY1RleHR1cmU9Ci1HTFVfZ2x1UXVhZHJpY1RleHR1cmVfMD1jYXN0PShHTFVxdWFkcmljICopCi1HTFVfZ2x1UXVhZHJpY1RleHR1cmVfMT0KLQotR0xVX2dsdVNjYWxlSW1hZ2U9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8wPQotR0xVX2dsdVNjYWxlSW1hZ2VfMT0KLUdMVV9nbHVTY2FsZUltYWdlXzI9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8zPQotR0xVX2dsdVNjYWxlSW1hZ2VfND1jYXN0PShjb25zdCB2b2lkICopCi1HTFVfZ2x1U2NhbGVJbWFnZV81PQotR0xVX2dsdVNjYWxlSW1hZ2VfNj0KLUdMVV9nbHVTY2FsZUltYWdlXzc9Ci1HTFVfZ2x1U2NhbGVJbWFnZV84PWNhc3Q9KHZvaWQgKikKLQotR0xVX2dsdVNwaGVyZT0KLUdMVV9nbHVTcGhlcmVfMD1jYXN0PShHTFVxdWFkcmljICopCi1HTFVfZ2x1U3BoZXJlXzE9Ci1HTFVfZ2x1U3BoZXJlXzI9Ci1HTFVfZ2x1U3BoZXJlXzM9Ci0KLUdMVV9nbHVUZXNzQmVnaW5Db250b3VyPQotR0xVX2dsdVRlc3NCZWdpbkNvbnRvdXJfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi0KLUdMVV9nbHVUZXNzQmVnaW5Qb2x5Z29uPQotR0xVX2dsdVRlc3NCZWdpblBvbHlnb25fMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1VGVzc0JlZ2luUG9seWdvbl8xPWNhc3Q9KEdMdm9pZCAqKQotCi1HTFVfZ2x1VGVzc0NhbGxiYWNrPQotR0xVX2dsdVRlc3NDYWxsYmFja18wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVUZXNzQ2FsbGJhY2tfMT0KLUdMVV9nbHVUZXNzQ2FsbGJhY2tfMj1jYXN0PShHTHZvaWQoKikpCi0KLUdMVV9nbHVUZXNzRW5kQ29udG91cj0KLUdMVV9nbHVUZXNzRW5kQ29udG91cl8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLQotR0xVX2dsdVRlc3NFbmRQb2x5Z29uPQotR0xVX2dsdVRlc3NFbmRQb2x5Z29uXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotCi1HTFVfZ2x1VGVzc05vcm1hbD0KLUdMVV9nbHVUZXNzTm9ybWFsXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdVRlc3NOb3JtYWxfMT0KLUdMVV9nbHVUZXNzTm9ybWFsXzI9Ci1HTFVfZ2x1VGVzc05vcm1hbF8zPQotCi1HTFVfZ2x1VGVzc1Byb3BlcnR5PQotR0xVX2dsdVRlc3NQcm9wZXJ0eV8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVUZXNzUHJvcGVydHlfMT0KLUdMVV9nbHVUZXNzUHJvcGVydHlfMj0KLQotR0xVX2dsdVRlc3NWZXJ0ZXg9Ci1HTFVfZ2x1VGVzc1ZlcnRleF8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVUZXNzVmVydGV4XzE9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVUZXNzVmVydGV4XzI9Y2FzdD0oR0x2b2lkICopCi0KLUdMVV9nbHVVblByb2plY3Q9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzA9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzE9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzI9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzM9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVVblByb2plY3RfND1mbGFncz1jcml0aWNhbAotR0xVX2dsdVVuUHJvamVjdF81PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1VW5Qcm9qZWN0XzY9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVVblByb2plY3RfNz1mbGFncz1jcml0aWNhbAotR0xVX2dsdVVuUHJvamVjdF84PWZsYWdzPWNyaXRpY2FsCi0KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9MaWJyYXJ5PWZsYWdzPW5vX2dlbgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9Nb3ppbGxhIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01vemlsbGFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01vemlsbGEgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTW96aWxsYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjY1ZmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01vemlsbGEgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTW96aWxsYUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKiBQcm9kdWNlcyB0aGUgamF2YSBjbGFzc2VzIG1hcHBpbmcgdG8gWFBDT00gTW96aWxsYSBvYmplY3RzICovCi1wdWJsaWMgY2xhc3MgTW96aWxsYUdlbmVyYXRvciB7Ci0JRmlsZVJlYWRlciByID0gbnVsbDsKLQlGaWxlV3JpdGVyIHcgPSBudWxsOwotCWludCBtYXhMaW5lcyA9IDEwMDA7Ci0JaW50IGNudExpbmVzID0gMDsKLQlpbnQgbiA9IDA7Ci0JU3RyaW5nW10gYiA9IG51bGw7Ci0JU3RyaW5nIGJvZHkgPSBudWxsOwotCWludCBuTWV0aG9kcyA9IDA7Ci0JU3RyaW5nIHV1aWROYW1lOwotCVN0cmluZyB1dWlkVmFsdWU7Ci0JU3RyaW5nIGNsYXNzTmFtZTsKLQlTdHJpbmcgcGFyZW50TmFtZTsKLQlTdHJpbmdbXSBjb25zdGFudE5hbWVzOwotCVN0cmluZ1tdIGNvbnN0YW50VmFsdWVzOwotCVN0cmluZ1tdIG1ldGhvZE5hbWVzOwotCVN0cmluZ1tdW10gYXJnVHlwZXM7Ci0JU3RyaW5nW11bXSBhcmdOYW1lczsKLQlTdHJpbmcgYm9keU9yZGVyOwotCUhhc2h0YWJsZSB2dGJsczsKLQotCXN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQkvLyBDb250YWlucyB0aGUgY2hhcmFjdGVycyBmb3VuZCBiZWZvcmUgYSBtZXRob2QgbmFtZQotCS8vIFVzZWZ1bCB0byBleHRyYWN0IHRoZSBtZXRob2QgbmFtZS4gZS5nLgotCS8vICBOU19JTUVUSE9EIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IG5zSUlEICYgdXVpZCwgdm9pZCAqICpyZXN1bHQpID0gMDsKLQkvLyAgTlNfSU1FVEhPRF8obnNyZWZjbnQpIEFkZFJlZih2b2lkKSA9IDA7Ci0JLy8gbWV0aG9kIG5hbWUgZm9sbG93czogUXVlcnlJbnRlcmZhY2UsIEFkZFJlZiBldGMuCi0Jc3RhdGljIFN0cmluZ1tdIEJFRk9SRV9NRVRIT0RfTkFNRSA9IHsKLQkJIiAgTlNfSU1FVEhPRCAiLAotCQkiICBOU19JTUVUSE9EXyhuc3JlZmNudCkgIiwKLQkJIiAgTlNfSU1FVEhPRF8odm9pZCAqKSAiLAotCQkiICBOU19JTUVUSE9EXyh2b2lkKSAiCi0JfTsKLQlzdGF0aWMgU3RyaW5nIE5PX1NVUEVSX0NMQVNTID0gIlNXVF9OT19TVVBFUl9DTEFTUyI7Ci0JCi0Jc3RhdGljIFN0cmluZ1tdW10gVFlQRVNfQzJKQVZBID0geyAKLQkJeyAiUFJCb29sICoiLCAiYm9vbGVhbltdIiB9LAotCQl7ICJuc0lJRCAmIiwgIm5zSUQiIH0sCi0JCXsgIm5zQ0lEICYiLCAibnNJRCIgfSwKLQkJeyAibnNDSUQgKiAqIiwgImludCAvKmxvbmcqLyIgfSwgLy8gbnNJRFtdIG5vdCBzdXBwb3J0ZWQgYnkgam5pZ2VuCi0JCXsgIiogKiIsICJpbnQgLypsb25nKi9bXSIgfSwKLQkJeyAiKioiLCAiaW50IC8qbG9uZyovW10iIH0sCi0JCXsgIiogJiIsICJpbnQgLypsb25nKi9bXSIgfSwKLQkJeyAiUFJVaW50MzIgKiIsICJpbnRbXSIgfSwgCi0JCXsgIlBSSW50MzIgKiIsICJpbnRbXSIgfSwKLQkJeyAiUFJJbnQ2NCAqIiwgImxvbmdbXSIgfSwKLQkJeyAiUFJVbmljaGFyICoiLCAiY2hhcltdIiB9LAotCQl7ICJjaGFyICoiLCAiYnl0ZVtdIiB9LAotCQl7ICJmbG9hdCAqIiwgImZsb2F0W10iIH0sCi0JCXsgIlBSVWludDE2ICoiLCAic2hvcnRbXSIgfSwKLQkJeyAibmF0aXZlV2luZG93ICoiLCAiaW50IC8qbG9uZyovW10iIH0sCi0JCXsgIm5zV3JpdGVTZWdtZW50RnVuIiwgImludCAvKmxvbmcqLyIgfSwKLQkJeyAibmF0aXZlV2luZG93IiwgImludCAvKmxvbmcqLyIgfSwKLQotCQl7ICIqIiwgImludCAvKmxvbmcqLyIgfSwgLy8gYyB0eXBlIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgKiAoYW5kIGFueSBvdGhlciBjaGFyYWN0ZXIsIGFuZCBkaWQgbm90IG1hdGNoIHByZXZpb3VzIHBhdHRlcm5zKSBpcyBhIHNpbXBsZSBwb2ludGVyCi0JCXsgIiYiLCAiaW50IC8qbG9uZyovIiB9LCAKLQotCQl7ICJQUlVpbnQzMiIsICJpbnQiIH0sCi0JCXsgIlBSSW50MzIiLCAiaW50IiB9LCAKLQkJeyAiUFJJbnQ2NCIsICJsb25nIiB9LCAKLQkJeyAibnNyZXN1bHQiLCAiaW50IiB9LAotCQl7ICJQUkJvb2wiLCAiYm9vbGVhbiIgfSwKLQkJeyAiZmxvYXQiLCAiZmxvYXQiIH0sCi0JCXsgIlBSVWludDE2IiwgInNob3J0IiB9LAotCQl7ICJzaXplX3QiLCAiaW50IiB9LAotCQl9OwotCi0Jc3RhdGljIFN0cmluZyBHRUNLTyA9ICIvbW96aWxsYS9tb3ppbGxhLzEuNC9saW51eF9ndGsyL21vemlsbGEvZGlzdC9pbmNsdWRlLyI7Ci0Jc3RhdGljIFN0cmluZyBUQVJHRVRfRk9MREVSID0gIi9ibHVlYmlyZC90ZWFtc3d0L2NocmlzeC9hbWQ2NC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE1vemlsbGEvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9tb3ppbGxhLyI7Ci0Jc3RhdGljIFN0cmluZ1tdIFhQQ09NX0hFQURFUlMgPSB7IAotCQkicHJvZmlsZS9uc0lQcm9maWxlLmgiLAotCQkid2lkZ2V0L25zSUFwcFNoZWxsLmgiLAotCQkid2lkZ2V0L25zSUJhc2VXaW5kb3cuaCIsIAotCQkieHBjb20vbnNJQ29tcG9uZW50TWFuYWdlci5oIiwKLQkJInhwY29tL25zSUNvbXBvbmVudFJlZ2lzdHJhci5oIiwKLQkJIndlYmJyd3NyL25zSUNvbnRleHRNZW51TGlzdGVuZXIuaCIsIAotCQkiZG9jc2hlbGwvbnNJRG9jU2hlbGwuaCIsCi0JCSJkb20vbnNJRE9NRXZlbnQuaCIsIAotCQkiZG9tL25zSURPTU1vdXNlRXZlbnQuaCIsCi0JCSJkb20vbnNJRE9NVUlFdmVudC5oIiwgCi0JCSJkb20vbnNJRE9NV2luZG93LmgiLAotCQkidXJpbG9hZGVyL25zSURvd25sb2FkLmgiLCAKLQkJIndlYmJyd3NyL25zSUVtYmVkZGluZ1NpdGVXaW5kb3cuaCIsCi0JCSJ4cGNvbS9uc0lGYWN0b3J5LmgiLCAKLQkJInhwY29tL25zSUZpbGUuaCIsCi0JCSJoZWxwZXJBcHBEbGcvbnNJSGVscGVyQXBwTGF1bmNoZXJEaWFsb2cuaCIsCi0JCSJleHRoYW5kbGVyL25zSUV4dGVybmFsSGVscGVyQXBwU2VydmljZS5oIiwgLy8gY29udGFpbnMgbnNJSGVscGVyQXBwTGF1bmNoZXIKLQkJInhwY29tL25zSUlucHV0U3RyZWFtLmgiLCAKLQkJInhwY29tL25zSUludGVyZmFjZVJlcXVlc3Rvci5oIiwKLQkJIm5lY2tvL25zSUlPU2VydmljZS5oIiwgCi0JCSJ4cGNvbS9uc0lMb2NhbEZpbGUuaCIsIAotCQkieHBjb20vbnNJTWVtb3J5LmgiLAotCQkicHJvZ3Jlc3NEbGcvbnNJUHJvZ3Jlc3NEaWFsb2cuaCIsCi0JCSJ3aW5kb3d3YXRjaGVyL25zSVByb21wdFNlcnZpY2UuaCIsIAotCQkieHBjb20vbnNJU2VydmljZU1hbmFnZXIuaCIsCi0JCSJ4cGNvbS9uc0lTdXBwb3J0cy5oIiwgCi0JCSJ3ZWJicndzci9uc0lUb29sdGlwTGlzdGVuZXIuaCIsIAotCQkibmVja28vbnNJVVJJLmgiLAotCQkidXJpbG9hZGVyL25zSVVSSUNvbnRlbnRMaXN0ZW5lci5oIiwgCi0JCSJ4cGNvbS9uc0lXZWFrUmVmZXJlbmNlLmgiLAotCQkid2ViYnJ3c3IvbnNJV2ViQnJvd3Nlci5oIiwgCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyQ2hyb21lLmgiLAotCQkid2ViYnJ3c3IvbnNJV2ViQnJvd3NlckNocm9tZUZvY3VzLmgiLAotCQkid2ViYnJ3c3IvbnNJV2ViQnJvd3NlckZvY3VzLmgiLCAKLQkJImRvY3NoZWxsL25zSVdlYk5hdmlnYXRpb24uaCIsCi0JCSJ1cmlsb2FkZXIvbnNJV2ViUHJvZ3Jlc3MuaCIsIAotCQkidXJpbG9hZGVyL25zSVdlYlByb2dyZXNzTGlzdGVuZXIuaCIsCi0JCSJlbWJlZF9iYXNlL25zSVdpbmRvd0NyZWF0b3IuaCIsIAotCQkid2luZG93d2F0Y2hlci9uc0lXaW5kb3dXYXRjaGVyLmgiIH07Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCU1vemlsbGFHZW5lcmF0b3IgeCA9IG5ldyBNb3ppbGxhR2VuZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgWFBDT01fSEVBREVSUy5sZW5ndGg7IGkrKykKLQkJCXgucGFyc2UoR0VDS08gKyBYUENPTV9IRUFERVJTW2ldLCBUQVJHRVRfRk9MREVSKTsKLQkJeC5vdXRwdXRWdGJsQ2FsbCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTsKLQl9Ci0KLQlwdWJsaWMgTW96aWxsYUdlbmVyYXRvcigpIHsKLQkJdnRibHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqIFdyaXRlIGNhbGxiYWNrcyAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludChkYXRhKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJdy53cml0ZShkYXRhKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlTGluZSgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZSgiXHJcbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlTGluZShTdHJpbmcgZGF0YSkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRhKTsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZShkYXRhICsgIlxyXG4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUNvcHlyaWdodHMoKSB7Ci0JCXdyaXRlTGluZShDT1BZUklHSFRTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZVBhY2thZ2VEZWNsYXJhdGlvbigpIHsKLQkJd3JpdGVMaW5lKFBBQ0tBR0VfREVDTEFSQVRJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NEZWNsYXJhdGlvbihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGFyZW50TmFtZSkgewotCQlTdHJpbmcgbGluZSA9ICJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZTsKLQkJaWYgKCFwYXJlbnROYW1lLmVxdWFscyhOT19TVVBFUl9DTEFTUykpIGxpbmUgKz0gIiBleHRlbmRzICIgKyBwYXJlbnROYW1lOwotCQlsaW5lICs9ICIgeyI7Ci0JCXdyaXRlTGluZShsaW5lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUxhc3RNZXRob2RJZChTdHJpbmcgcGFyZW50TmFtZSwgaW50IG5NZXRob2RzKSB7Ci0JCVN0cmluZyBsaW5lID0gIlx0c3RhdGljIGZpbmFsIGludCBMQVNUX01FVEhPRF9JRCA9ICI7Ci0JCWlmICghcGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSBsaW5lICs9IHBhcmVudE5hbWUgKyAiLkxBU1RfTUVUSE9EX0lEICsgIiArIG5NZXRob2RzICsgIjsiOwotCQllbHNlIGxpbmUgKz0gIiIgKyAobk1ldGhvZHMgLSAxKSsgIjsiOyAvLyB6ZXJvIGluZGV4ZWQKLQkJd3JpdGVMaW5lKGxpbmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlSUlEKFN0cmluZyB1dWlkTmFtZSwgU3RyaW5nIHV1aWRWYWx1ZSkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIiArIHV1aWROYW1lICsgIiA9Iik7Ci0JCXdyaXRlTGluZSgiXHRcdFwiIiArIHV1aWRWYWx1ZSArICJcIjsiKTsKLQkJd3JpdGVMaW5lKCk7Ci0JCVN0cmluZyBpaWQgPSB1dWlkTmFtZS5zdWJzdHJpbmcoMCwgdXVpZE5hbWUuaW5kZXhPZigiX1NUUiIpKTsKLQkJd3JpdGVMaW5lKCJcdHB1YmxpYyBzdGF0aWMgZmluYWwgbnNJRCAiICsgaWlkICsgIiA9Iik7Ci0JCXdyaXRlTGluZSgiXHRcdG5ldyBuc0lEKCIgKyB1dWlkTmFtZSArICIpOyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQWRkcmVzc0ZpZWxkKCkgewotCQl3cml0ZUxpbmUoIlx0aW50IC8qbG9uZyovIGFkZHJlc3M7Iik7Ci0JfQotCXB1YmxpYyB2b2lkIHdyaXRlQ29uc3RydWN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBhcmVudE5hbWUpIHsKLQkJd3JpdGVMaW5lKCJcdHB1YmxpYyAiICsgY2xhc3NOYW1lICsgIihpbnQgLypsb25nKi8gYWRkcmVzcykgeyIpOwotCQlpZiAoIXBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgewotCQkJd3JpdGVMaW5lKCJcdFx0c3VwZXIoYWRkcmVzcyk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZUxpbmUoIlx0XHR0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOyIpOwotCQl9Ci0JCXdyaXRlTGluZSgiXHR9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVBZGRyZXNzR2V0dGVyKCkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljIGludCAvKmxvbmcqLyBnZXRBZGRyZXNzKCkgeyIpOwotCQl3cml0ZUxpbmUoIlx0XHRyZXR1cm4gdGhpcy5hZGRyZXNzOyIpOwotCQl3cml0ZUxpbmUoIlx0fSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB3cml0ZUNvbnN0YW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJd3JpdGVMaW5lKCJcdHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICIgKyBuYW1lICsgIiA9ICIgKyB2YWx1ZSArICI7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBpbnQgbWV0aG9kSW5kZXgsIFN0cmluZ1tdIGFyZ1R5cGVzLCBTdHJpbmdbXSBhcmdOYW1lcykgewotCQl3cml0ZSgiXHRwdWJsaWMgaW50ICIgKyBuYW1lICsgIigiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGUoYXJnVHlwZXNbaV0gKyAiICIgKyBhcmdOYW1lc1tpXSk7Ci0JCQlpZiAoaSA8IGFyZ1R5cGVzLmxlbmd0aCAtIDEpCi0JCQkJd3JpdGUoIiwgIik7Ci0JCX0KLQkJd3JpdGUoIikgeyIpOwotCQl3cml0ZUxpbmUoKTsKLQkJU3RyaW5nIGxpbmUgPSAiXHRcdHJldHVybiBYUENPTS5WdGJsQ2FsbCgiOwotCQlpZiAoIXBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgbGluZSArPSBwYXJlbnROYW1lICsgIi5MQVNUX01FVEhPRF9JRCArICIgKyAobWV0aG9kSW5kZXggKyAxKSArICIsIGdldEFkZHJlc3MoKSI7Ci0JCWVsc2UgbGluZSArPSBtZXRob2RJbmRleCArICIsIGdldEFkZHJlc3MoKSI7IC8vIHplcm8gaW5kZXhlZAotCQl3cml0ZShsaW5lKTsKLQkJaWYgKGFyZ1R5cGVzLmxlbmd0aCA+IDApCi0JCQl3cml0ZSgiLCAiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGUoYXJnTmFtZXNbaV0pOwotCQkJaWYgKGkgPCBhcmdUeXBlcy5sZW5ndGggLSAxKQotCQkJCXdyaXRlKCIsICIpOwotCQl9Ci0JCXdyaXRlTGluZSgiKTsiKTsKLQkJd3JpdGVMaW5lKCJcdH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUNsYXNzRW5kKCkgewotCQl3cml0ZSgifSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1Z0YmxDYWxsKFN0cmluZ1tdIGFyZ1R5cGVzKSB7Ci0JCVN0cmluZyB2dGJsID0gInN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFZ0YmxDYWxsKGludCBmbk51bWJlciwgaW50IC8qbG9uZyovIHBwVnRibCI7Ci0JCWlmIChhcmdUeXBlcy5sZW5ndGggPiAwKQotCQkJdnRibCArPSAiLCAiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2dGJsICs9IGFyZ1R5cGVzW2ldICsgIiBhcmciICsgaTsKLQkJCWlmIChpIDwgYXJnVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQl2dGJsICs9ICIsICI7Ci0JCX0KLQkJdnRibCArPSAiKTsiOwotCQlJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKGFyZ1R5cGVzLmxlbmd0aCk7Ci0JCVZlY3RvciBsaXN0ID0gKFZlY3RvcikgdnRibHMuZ2V0KGtleSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQl2dGJscy5wdXQoa2V5LCBsaXN0KTsKLQkJfQotCQlib29sZWFuIGR1cGxpY2F0ZSA9IGZhbHNlOwotCQlFbnVtZXJhdGlvbiBlID0gbGlzdC5lbGVtZW50cygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodnRibC5lcXVhbHMocykpIHsKLQkJCQlkdXBsaWNhdGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZHVwbGljYXRlKQotCQkJbGlzdC5hZGQodnRibCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0VnRibENhbGwoKSB7Ci0JCUVudW1lcmF0aW9uIGUgPSB2dGJscy5rZXlzKCk7Ci0JCWludCBuID0gMDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWUubmV4dEVsZW1lbnQoKTsKLQkJCW4rKzsKLQkJfQotCQlJbnRlZ2VyW10ga2V5cyA9IG5ldyBJbnRlZ2VyW25dOwotCQllID0gdnRibHMua2V5cygpOwotCQluID0gMDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWtleXNbbl0gPSAoSW50ZWdlcikgZS5uZXh0RWxlbWVudCgpOwotCQkJbisrOwotCQl9Ci0JCUFycmF5cy5zb3J0KGtleXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVZlY3RvciBsaXN0ID0gKFZlY3RvcikgdnRibHMuZ2V0KGtleXNbaV0pOwotCQkJT2JqZWN0W10gZWx0cyA9IChPYmplY3RbXSkgbGlzdC50b0FycmF5KCk7Ci0JCQlBcnJheXMuc29ydChlbHRzKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWx0cy5sZW5ndGg7IGorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlbHRzW2pdKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqIFBhcnNpbmcgaW52b2tpbmcgd3JpdGUgY2FsbGJhY2tzICovCi0KLQkvKgotCSAqIENvbnZlcnQgYSBDIGhlYWRlciBmaWxlIGludG8gYSBKYXZhIHNvdXJjZSBmaWxlIG1hdGNoaW5nIFNXVCBNb3ppbGxhCi0JIGJpbmRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3RQYXRoKSB7Ci0JCWlmIChERUJVRykgd3JpdGVMaW5lKCIqKiogUEFSU0lORyA8IitzcmMrIj4gdG8gZm9sZGVyICIrZGVzdFBhdGgpOwotCQliID0gbmV3IFN0cmluZ1ttYXhMaW5lc107Ci0JCWNudExpbmVzID0gMDsKLQkJdHJ5IHsKLQkJCXIgPSBuZXcgRmlsZVJlYWRlcihzcmMpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocik7Ci0JCQl3aGlsZSAoKGJbY250TGluZXNdID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWNudExpbmVzKys7Ci0JCQl9Ci0JCQlici5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCW4gPSAwOwotCQlib29sZWFuIGxvb2tGb3JDbGFzc2VzID0gdHJ1ZTsKLQkJd2hpbGUgKGxvb2tGb3JDbGFzc2VzKSB7CQotCQkJLyogcGFyc2luZyAqLwotCQkJbG9va0ZvckNsYXNzZXMgPSBwYXJzZSgpOwotCQotCQkJU3RyaW5nIGRlc3RGaWxlID0gZGVzdFBhdGggKyBjbGFzc05hbWUgKyAiLmphdmEiOwotCQkJdHJ5IHsKLQkJCQl3ID0gbmV3IEZpbGVXcml0ZXIoZGVzdEZpbGUpOwotCQkJCWlmIChERUJVRykgd3JpdGVMaW5lKCIqKiBDUkVBVEVEIEpBVkEgRklMRSA8IitkZXN0RmlsZSsiPiIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQkJLyogd3JpdGluZyAqLwotCQkJd3JpdGVDb3B5cmlnaHRzKCk7Ci0JCQl3cml0ZVBhY2thZ2VEZWNsYXJhdGlvbigpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQl3cml0ZUNsYXNzRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBwYXJlbnROYW1lKTsKLQkJCXdyaXRlTGluZSgpOwotCQkJd3JpdGVMYXN0TWV0aG9kSWQocGFyZW50TmFtZSwgbk1ldGhvZHMpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQl3cml0ZUlJRCh1dWlkTmFtZSwgdXVpZFZhbHVlKTsKLQkJCXdyaXRlTGluZSgpOwotCQkJaWYgKHBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgewotCQkJCXdyaXRlQWRkcmVzc0ZpZWxkKCk7Ci0JCQkJd3JpdGVMaW5lKCk7Ci0JCQl9Ci0JCQl3cml0ZUNvbnN0cnVjdG9yKGNsYXNzTmFtZSwgcGFyZW50TmFtZSk7Ci0JCQl3cml0ZUxpbmUoKTsKLQkJCQotCQkJaWYgKHBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgewotCQkJCXdyaXRlQWRkcmVzc0dldHRlcigpOwotCQkJCXdyaXRlTGluZSgpOwotCQkJfQotCQotCQkJaW50IGNvbnN0YW50SW5kZXggPSAwLCBtZXRob2RJbmRleCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJvZHlPcmRlci5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGJvZHlPcmRlci5jaGFyQXQoaSkgPT0gJ0MnKSB7Ci0JCQkJCXdyaXRlQ29uc3RhbnQoY29uc3RhbnROYW1lc1tjb25zdGFudEluZGV4XSwKLQkJCQkJCQljb25zdGFudFZhbHVlc1tjb25zdGFudEluZGV4XSk7Ci0JCQkJCWlmIChpIDwgYm9keU9yZGVyLmxlbmd0aCgpIC0gMSkgd3JpdGVMaW5lKCk7Ci0JCQkJCWNvbnN0YW50SW5kZXgrKzsKLQkJCQl9IGVsc2UgaWYgKGJvZHlPcmRlci5jaGFyQXQoaSkgPT0gJ00nKSB7Ci0JCQkJCXdyaXRlTWV0aG9kKG1ldGhvZE5hbWVzW21ldGhvZEluZGV4XSwgcGFyZW50TmFtZSwgbWV0aG9kSW5kZXgsCi0JCQkJCQkJYXJnVHlwZXNbbWV0aG9kSW5kZXhdLCBhcmdOYW1lc1ttZXRob2RJbmRleF0pOwotCQkJCQlpZiAoaSA8IGJvZHlPcmRlci5sZW5ndGgoKSAtIDEpIHdyaXRlTGluZSgpOwotCQkJCQltZXRob2RJbmRleCsrOwotCQkJCX0KLQkJCX0KLQkKLQkJCXdyaXRlQ2xhc3NFbmQoKTsKLQkKLQkJCXRyeSB7Ci0JCQkJdy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VzKCkgewotCQlyZXR1cm4gInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGE7IjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwYXJzZSgpIHsKLQkJaWYgKCFqdW1wVG9VdWlkRGVjbGFyYXRpb24oKSkgcmV0dXJuIGZhbHNlOwotCQl1dWlkTmFtZSA9IGdldFV1aWROYW1lKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVVSUQgbmFtZTogPCIgKyB1dWlkTmFtZSArICI+Iik7Ci0JCXV1aWRWYWx1ZSA9IGdldFV1aWRWYWx1ZShiW25dKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVVUlEIHZhbHVlOiA8IiArIHV1aWRWYWx1ZSArICI+Iik7Ci0JCWp1bXBUb0ludGVyZmFjZURlY2xhcmF0aW9uKCk7Ci0JCWNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShiW25dKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2UgbmFtZTogPCIgKyBjbGFzc05hbWUgKyAiPiIpOwotCQlwYXJlbnROYW1lID0gZ2V0UGFyZW50TmFtZShiW25dKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnROYW1lOiA8IiArIHBhcmVudE5hbWUgKyAiPiIpOwotCQlwYXJzZUJvZHkoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JYm9vbGVhbiBqdW1wVG9VdWlkRGVjbGFyYXRpb24oKSB7Ci0JCS8vIGp1bXAgdG8gbGluZSBtYXRjaGluZzogIiNkZWZpbmUgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUiAiYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjIiIKLQkJd2hpbGUgKCEoYltuXS5zdGFydHNXaXRoKCIjZGVmaW5lICIpICYmIGJbbl0uaW5kZXhPZigiX0lJRF9TVFIgXCIiKSAhPSAtMSkpIHsKLQkJCW4rKzsKLQkJCWlmIChuID49IGNudExpbmVzKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy9hc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogIiNkZWZpbmUgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUiAiYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjIiIKLQkvL3JldHVybnMgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUgotCVN0cmluZyBnZXRVdWlkTmFtZShTdHJpbmcgZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLnN1YnN0cmluZyhkZWNsYXJhdGlvbi5pbmRleE9mKCIjZGVmaW5lICIpCi0JCQkJKyAiI2RlZmluZSAiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5pbmRleE9mKCIgXCIiKSk7Ci0JfQotCi0JLy9hc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogIiNkZWZpbmUgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUiAiYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjIiIKLQkvL3JldHVybnMgYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjCi0JU3RyaW5nIGdldFV1aWRWYWx1ZShTdHJpbmcgZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLnN1YnN0cmluZyhkZWNsYXJhdGlvbi5pbmRleE9mKCJfSUlEX1NUUiBcIiIpCi0JCQkJKyAiX0lJRF9TVFIgXCIiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignIicpKTsKLQl9Ci0KLQl2b2lkIGp1bXBUb0ludGVyZmFjZURlY2xhcmF0aW9uKCkgewotCQkvLyBqdW1wIHRvIGxpbmUgbWF0Y2hpbmc6ICJjbGFzcyBOU19OT19WVEFCTEUgbnNJV2ViQnJvd3NlckNocm9tZSA6IHB1YmxpYyBuc0lTdXBwb3J0cyB7IgotCQl3aGlsZSAoIShiW25dLnN0YXJ0c1dpdGgoImNsYXNzIE5TX05PX1ZUQUJMRSAiKSkpIHsKLQkJCW4rKzsKLQkJfQotCX0KLQotCS8vIGFzc3VtZSBhIGRlY2xhcmF0aW9uIG1hdGNoaW5nOiAiY2xhc3MgTlNfTk9fVlRBQkxFIG5zSVdlYkJyb3dzZXJDaHJvbWUgOiBwdWJsaWMgbnNJU3VwcG9ydHMgeyIKLQkvLyByZXR1cm5zIG5zSVdlYkJyb3dzZXJDaHJvbWUKLQkvLyBzcGVjaWFsIGNhc2UgZm9yIG5zSVN1cHBvcnRzIHRoYXQgaGFzIG5vIHN1cGVyIGNsYXNzOiBjbGFzcyBOU19OT19WVEFCTEUgbnNJU3VwcG9ydHMgewotCVN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIGRlY2xhcmF0aW9uKSB7Ci0JCWludCBlbmRJbmRleCA9IGRlY2xhcmF0aW9uLmluZGV4T2YoIiA6Iik7Ci0JCS8vIG5zSVN1cHBvcnRzIHNwZWNpYWwgY2FzZSAobm8gc3VwZXIgY2xhc3MpCi0JCWlmIChlbmRJbmRleCA9PSAtMSkgZW5kSW5kZXggPSBkZWNsYXJhdGlvbi5pbmRleE9mKCIgeyIpOwotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKGRlY2xhcmF0aW9uLmluZGV4T2YoImNsYXNzIE5TX05PX1ZUQUJMRSAiKQotCQkJCSsgImNsYXNzIE5TX05PX1ZUQUJMRSAiLmxlbmd0aCgpLCBlbmRJbmRleCk7Ci0JfQotCi0JLy8gYXNzdW1lIGEgZGVjbGFyYXRpb24gbWF0Y2hpbmc6ICJjbGFzcyBOU19OT19WVEFCTEUgbnNJV2ViQnJvd3NlckNocm9tZSA6IHB1YmxpYyBuc0lTdXBwb3J0cyB7IgotCS8vIHJldHVybnMgbnNJU3VwcG9ydHMKLQkvLyBzcGVjaWFsIGNhc2UgZm9yIG5zSVN1cHBvcnRzIHRoYXQgaGFzIG5vIHN1cGVyIGNsYXNzOiBjbGFzcyBOU19OT19WVEFCTEUgbnNJU3VwcG9ydHMgewotCVN0cmluZyBnZXRQYXJlbnROYW1lKFN0cmluZyBkZWNsYXJhdGlvbikgewotCQlpZiAoZGVjbGFyYXRpb24uaW5kZXhPZigiIDoiKSA9PSAtMSkgcmV0dXJuIE5PX1NVUEVSX0NMQVNTOwotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKGRlY2xhcmF0aW9uLmluZGV4T2YoIjogcHVibGljICIpCi0JCQkJKyAiOiBwdWJsaWMgIi5sZW5ndGgoKSwgZGVjbGFyYXRpb24uaW5kZXhPZigiIHsiKSk7Ci0JfQotCi0JLy8gcGFyc2UgbWV0aG9kcyBhbmQgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBzdGFydGluZyBhdCB0aGUgY3VycmVudCBpbmRleAotCS8vIG91dDoKLQkvLyAuU3RyaW5nIGJvZHkgLSBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBqYXZhIGNvbnRlbnQKLQkvLyAubiAtIHNldCB0byB0aGUgZW5kIG9mIHRoZSBpbnRlcmZhY2UgYm9keSBkZWNsYXJhdGlvbiAoIGxpbmUgd2l0aCB0aGUgZW5jbG9zaW5nICJ9OyIgKQotCS8vIC5uTWV0aG9kcyAgICAtIHNldCB0byB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgcGFyc2VkCi0Jdm9pZCBwYXJzZUJvZHkoKSB7Ci0JCWJvZHkgPSAiIjsKLQkJYm9keU9yZGVyID0gIiI7Ci0JCWludCBuQ29uc3RhbnRzID0gMDsKLQkJbk1ldGhvZHMgPSAwOwotCi0JCWludCB0bXBfbiA9IG47Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpbnQgdHlwZSA9IGp1bXBUb05leHRDb25zdGFudE9yTWV0aG9kKCk7Ci0JCQlpZiAodHlwZSA9PSBDT05TVEFOVCkKLQkJCQluQ29uc3RhbnRzKys7Ci0JCQlpZiAodHlwZSA9PSBNRVRIT0QpCi0JCQkJbk1ldGhvZHMrKzsKLQkJCWlmICh0eXBlID09IEVORF9CT0RZKQotCQkJCWJyZWFrOwotCQkJbisrOwotCQl9Ci0JCW4gPSB0bXBfbjsKLQkJY29uc3RhbnROYW1lcyA9IG5ldyBTdHJpbmdbbkNvbnN0YW50c107Ci0JCWNvbnN0YW50VmFsdWVzID0gbmV3IFN0cmluZ1tuQ29uc3RhbnRzXTsKLQkJbWV0aG9kTmFtZXMgPSBuZXcgU3RyaW5nW25NZXRob2RzXTsKLQkJYXJnVHlwZXMgPSBuZXcgU3RyaW5nW25NZXRob2RzXVtdOwotCQlhcmdOYW1lcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdW107Ci0JCWludCBjb25zdGFudEluZGV4ID0gMCwgbWV0aG9kSW5kZXggPSAwOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaW50IHR5cGUgPSBqdW1wVG9OZXh0Q29uc3RhbnRPck1ldGhvZCgpOwotCQkJaWYgKHR5cGUgPT0gQ09OU1RBTlQpIHsKLQkJCQlwYXJzZUNvbnN0YW50KGJbbl0sIGNvbnN0YW50SW5kZXgpOwotCQkJCWJvZHlPcmRlciArPSAiQyI7Ci0JCQkJY29uc3RhbnRJbmRleCsrOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gTUVUSE9EKSB7Ci0JCQkJcGFyc2VNZXRob2QoYltuXSwgbWV0aG9kSW5kZXgpOwotCQkJCWxvZ1Z0YmxDYWxsKGFyZ1R5cGVzW21ldGhvZEluZGV4XSk7Ci0JCQkJYm9keU9yZGVyICs9ICJNIjsKLQkJCQltZXRob2RJbmRleCsrOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gRU5EX0JPRFkpCi0JCQkJcmV0dXJuOwotCQkJbisrOwotCQl9Ci0JfQotCi0Jc3RhdGljIGludCBDT05TVEFOVCA9IDA7Ci0KLQlzdGF0aWMgaW50IE1FVEhPRCA9IDE7Ci0KLQlzdGF0aWMgaW50IEVORF9CT0RZID0gMjsKLQotCWJvb2xlYW4gaXNFbmRPZkludGVyZmFjZUJvZHkoKSB7Ci0JCXJldHVybiBiW25dLnN0YXJ0c1dpdGgoIn07Iik7Ci0JfQotCi0JaW50IGp1bXBUb05leHRDb25zdGFudE9yTWV0aG9kKCkgewotCQl3aGlsZSAoIWlzRW5kT2ZJbnRlcmZhY2VCb2R5KCkpIHsKLQkJCWlmIChiW25dLnN0YXJ0c1dpdGgoIiAgZW51bSB7ICIpKSB7Ci0JCQkJcmV0dXJuIENPTlNUQU5UOwotCQkJfQotCQkJaWYgKG1ldGhvZE5hbWVTdGFydEluZGV4T2YoYltuXSkgIT0gLTEpIHsKLQkJCQlyZXR1cm4gTUVUSE9EOwotCQkJfQotCQkJbisrOwotCQl9Ci0JCXJldHVybiBFTkRfQk9EWTsKLQl9Ci0KLQl2b2lkIHBhcnNlQ29uc3RhbnQoU3RyaW5nIGNvbnN0YW50LCBpbnQgY29uc3RhbnRJbmRleCkgewotCQlTdHJpbmcgY29uc3RhbnROYW1lID0gY29uc3RhbnQuc3Vic3RyaW5nKGNvbnN0YW50LmluZGV4T2YoIiBlbnVtIHsgIikKLQkJCQkrICIgZW51bSB7ICIubGVuZ3RoKCksIGNvbnN0YW50LmluZGV4T2YoIiA9IikpOwotCQlpZiAoREVCVUcpCi0JCQl3cml0ZUxpbmUoImNvbnN0YW50TmFtZSA8IiArIGNvbnN0YW50TmFtZSArICI+Iik7Ci0JCWNvbnN0YW50TmFtZXNbY29uc3RhbnRJbmRleF0gPSBjb25zdGFudE5hbWU7Ci0JCQotCQkvLyBtb3N0IGNvbnN0YW50cyB2YWx1ZXMgaGF2ZSBhIHRyYWlsaW5nIFUKLQkJLy8gZW51bSB7IEFQUF9UWVBFX1VOS05PV04gPSAwVSB9OwotCQlpbnQgZW5kSW5kZXggPSBjb25zdGFudC5pbmRleE9mKCJVIH07Iik7Ci0JCS8vIGEgZmV3IG90aGVycyBkb24ndAotCQkvLyBlbnVtIHsgRU5VTUVSQVRFX0ZPUldBUkRTID0gMCB9OwkJCi0JCWlmIChlbmRJbmRleCA9PSAtMSkgZW5kSW5kZXggPSBjb25zdGFudC5pbmRleE9mKCIgfTsiKTsKLQkJU3RyaW5nIGNvbnN0YW50VmFsdWUgPSBjb25zdGFudC5zdWJzdHJpbmcoY29uc3RhbnQuaW5kZXhPZigiID0gIikKLQkJCQkrICIgPSAiLmxlbmd0aCgpLCBlbmRJbmRleCk7Ci0JCWlmIChERUJVRykKLQkJCXdyaXRlTGluZSgiY29uc3RhbnRWYWx1ZSA8IiArIGNvbnN0YW50VmFsdWUgKyAiPiIpOwotCQljb25zdGFudFZhbHVlc1tjb25zdGFudEluZGV4XSA9IGNvbnN0YW50VmFsdWU7Ci0JfQotCi0JLy8gTlNfSU1FVEhPRCBTZXRTdGF0dXMoUFJVaW50MzIgc3RhdHVzVHlwZSwgY29uc3QgUFJVbmljaGFyICpzdGF0dXMpID0gMDsKLQkvLyBpZGVudGlmeToKLQkvLyBtZXRob2QgbmFtZTogPFNldFN0YXR1cz4KLQkvLyBOYnIgb2YgYXJndW1lbnRzOiAyCi0JLy8gVHlwZSBvZiBhcmd1bWVudCAwOiBQUlVpbnQzMgotCS8vIE5hbWUgb2YgYXJndW1lbnQgMDogc3RhdHVzVHlwZQotCS8vIFR5cGUgb2YgYXJndW1lbnQgMTogY29uc3QgUFJVbmljaGFyICoKLQkvLyBOYW1lIG9mIGFyZ3VtZW50IDE6IHN0YXR1cwotCXZvaWQgcGFyc2VNZXRob2QoU3RyaW5nIGxpbmUsIGludCBtZXRob2RJbmRleCkgewotCQlpbnQgc3RhcnQgPSBtZXRob2ROYW1lU3RhcnRJbmRleE9mKGxpbmUpOwotCQlpbnQgZW5kID0gbWV0aG9kTmFtZUVuZEluZGV4T2YobGluZSk7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gbGluZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCWlmIChERUJVRykKLQkJCXdyaXRlTGluZSgibWV0aG9kIG5hbWU6IDwiICsgbWV0aG9kTmFtZSArICI+Iik7Ci0JCW1ldGhvZE5hbWVzW21ldGhvZEluZGV4XSA9IG1ldGhvZE5hbWU7Ci0JCWludCBhcmdTdGFydCA9IGVuZCsiKCIubGVuZ3RoKCk7Ci0JCWludCBhcmdFbmQgPSBsaW5lLmluZGV4T2YoIikiLCBhcmdTdGFydCk7Ci0JCXBhcnNlQXJncyhsaW5lLnN1YnN0cmluZyhhcmdTdGFydCwgYXJnRW5kKSwgbWV0aG9kSW5kZXgpOwotCX0KLQotCS8vIEdpdmVuIGEgbGluZSwgcmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIG1ldGhvZCBuYW1lIG9yIC0xCi0JLy8gaWYgdGhlIGxpbmUgZG9lcyBub3QgY29udGFpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbi4KLQlpbnQgbWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihTdHJpbmcgbGluZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IEJFRk9SRV9NRVRIT0RfTkFNRS5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gbGluZS5pbmRleE9mKEJFRk9SRV9NRVRIT0RfTkFNRVtpXSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHJldHVybiBpbmRleCArIEJFRk9SRV9NRVRIT0RfTkFNRVtpXS5sZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCWludCBtZXRob2ROYW1lRW5kSW5kZXhPZihTdHJpbmcgbGluZSkgewotCQlpbnQgc3RhcnRJbmRleCA9IG1ldGhvZE5hbWVTdGFydEluZGV4T2YobGluZSk7Ci0JCXJldHVybiBsaW5lLmluZGV4T2YoIigiLCBzdGFydEluZGV4KTsKLQl9Ci0Jdm9pZCBwYXJzZUFyZ3MoU3RyaW5nIGFyZ3MsIGludCBtZXRob2RJbmRleCkgewotCQlpbnQgbkFyZ3MgPSAtMTsKLQkJLy8gbWV0aG9kcyB3aXRoIG5vIGFyZ3MgbG9vayBsaWtlOiAoKSBvciAodm9pZCkKLQkJU3RyaW5nW10gbm9BcmdzID0gbmV3IFN0cmluZ1tdIHsgIiIsICJ2b2lkIiB9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vQXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3MuZXF1YWxzKG5vQXJnc1tpXSkpIHsKLQkJCQluQXJncyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5BcmdzID09IC0xKQotCQkJbkFyZ3MgPSBjb3VudChhcmdzLCAiLCAiKSArIDE7Ci0JCVN0cmluZ1tdIGFyZ1R5cGVzID0gbmV3IFN0cmluZ1tuQXJnc107Ci0JCXRoaXMuYXJnVHlwZXNbbWV0aG9kSW5kZXhdID0gYXJnVHlwZXM7Ci0JCVN0cmluZ1tdIGFyZ05hbWVzID0gbmV3IFN0cmluZ1tuQXJnc107Ci0JCXRoaXMuYXJnTmFtZXNbbWV0aG9kSW5kZXhdID0gYXJnTmFtZXM7Ci0JCWludCB0eXBlU3RhcnQgPSAwOwotCi0JCS8vIG5hbWUgaXMgc2VwYXJhdGVkIGZyb20gaXRzIHR5cGUgYnkgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgKHNvcnRlZCBieSBkZWNyZWFzaW5nIHNpemUgdG8gZmluZCB0aGUgbW9zdCBjb21wbGV0ZSBwYXR0ZXJuICovCi0JCVN0cmluZ1tdIHR5cGVOYW1lU2VwID0gbmV3IFN0cmluZ1tdIHsgIiAqICoiLCAiICoqIiwgIiAqICYgIiwgIiAqICIsICIgKiIsCi0JCQkJIiAmICIsICIgIiB9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BcmdzOyBpKyspIHsKLQkJCS8qIGdldCB0aGUgdHlwZSAqLwotCQkJaW50IG5leHRUeXBlU3RhcnQgPSBpIDwgbkFyZ3MgLSAxID8gYXJncy5pbmRleE9mKCIsICIsIHR5cGVTdGFydCkKLQkJCQkJKyAiLCAiLmxlbmd0aCgpIDogYXJncy5sZW5ndGgoKTsKLQkJCWludCB0eXBlTmFtZVNlcEluZGV4ID0gMDsKLQkJCWludCBzZXBhcmF0b3JJbmRleCA9IDA7Ci0JCQlmb3IgKDsgdHlwZU5hbWVTZXBJbmRleCA8IHR5cGVOYW1lU2VwLmxlbmd0aDsgdHlwZU5hbWVTZXBJbmRleCsrKSB7Ci0JCQkJc2VwYXJhdG9ySW5kZXggPSBhcmdzLmluZGV4T2YodHlwZU5hbWVTZXBbdHlwZU5hbWVTZXBJbmRleF0sCi0JCQkJCQl0eXBlU3RhcnQpOwotCQkJCWlmIChzZXBhcmF0b3JJbmRleCAhPSAtMSAmJiBzZXBhcmF0b3JJbmRleCA8IG5leHRUeXBlU3RhcnQpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJU3RyaW5nIHNlcGFyYXRvciA9IHR5cGVOYW1lU2VwW3R5cGVOYW1lU2VwSW5kZXhdOwotCQkJYXJnVHlwZXNbaV0gPSBnZXRDMkphdmFUeXBlKGFyZ3Muc3Vic3RyaW5nKHR5cGVTdGFydCwKLQkJCQkJc2VwYXJhdG9ySW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKCkpKTsKLQkJCWlmIChERUJVRykKLQkJCQl3cml0ZUxpbmUoImFyZyB0eXBlIiArIGkgKyAiOiA8IiArIGFyZ1R5cGVzW2ldICsgIj4iKTsKLQkJCS8qIGdldCB0aGUgbmFtZSAqLwotCQkJaW50IG5hbWVTdGFydCA9IHNlcGFyYXRvckluZGV4ICsgc2VwYXJhdG9yLmxlbmd0aCgpOwotCQkJaW50IG5hbWVFbmQgPSBpIDwgbkFyZ3MgLSAxID8gYXJncy5pbmRleE9mKCIsICIsIG5hbWVTdGFydCkgOiBhcmdzCi0JCQkJCS5sZW5ndGgoKTsKLQkJCWFyZ05hbWVzW2ldID0gYXJncy5zdWJzdHJpbmcobmFtZVN0YXJ0LCBuYW1lRW5kKTsKLQkJCWlmIChERUJVRykKLQkJCQl3cml0ZUxpbmUoImFyZyBuYW1lIiArIGkgKyAiOiA8IiArIGFyZ05hbWVzW2ldICsgIj4iKTsKLQotCQkJdHlwZVN0YXJ0ID0gbmV4dFR5cGVTdGFydDsKLQkJfQotCX0KLQotCVN0cmluZyBnZXRDMkphdmFUeXBlKFN0cmluZyBjVHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFRZUEVTX0MySkFWQS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNUeXBlLmluZGV4T2YoVFlQRVNfQzJKQVZBW2ldWzBdKSAhPSAtMSkKLQkJCQlyZXR1cm4gVFlQRVNfQzJKQVZBW2ldWzFdOwotCQl9Ci0JCXJldHVybiAiIUVSUk9SIFVOS05PV04gQyBUWVBFIDwiICsgY1R5cGUgKyAiPiEiOwotCX0KLQotCS8vIGhvdyBtYW55IHRpbWVzIHBhcnQgY2FuIGJlIGZvdW5kIGluIHMKLQlzdGF0aWMgaW50IGNvdW50KFN0cmluZyBzLCBTdHJpbmcgcGFydCkgewotCQlpbnQgaW5kZXggPSAtMSwgY250ID0gMDsKLQkJd2hpbGUgKChpbmRleCA9IHMuaW5kZXhPZihwYXJ0LCBpbmRleCArIDEpKSAhPSAtMSkKLQkJCWNudCsrOwotCQlyZXR1cm4gY250OwotCX0KLQotCXN0YXRpYyBTdHJpbmcgQ09QWVJJR0hUUyA9Ci0JCSIvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqXHJcbiIKLQkJKyAiICogVmVyc2lvbjogTVBMIDEuMVxyXG4iCi0JCSsgIiAqXHJcbiIKLQkJKyAiICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uXHJcbiIKLQkJKyAiICogMS4xICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcclxuIgotCQkrICIgKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiIKLQkJKyAiICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXHJcbiIKLQkJKyAiICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlXHJcbiIKLQkJKyAiICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGVcclxuIgotCQkrICIgKiBMaWNlbnNlLlxyXG4iCi0JCSsgIiAqXHJcbiIKLQkJKyAiICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUsIHJlbGVhc2VkIE1hcmNoIDMxLCAxOTk4LlxyXG4iCi0JCSsgIiAqXHJcbiIKLQkJKyAiICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzXHJcbiIKLQkJKyAiICogTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uXHJcbiIKLQkJKyAiICogUG9ydGlvbnMgY3JlYXRlZCBieSBOZXRzY2FwZSBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTlcclxuIgotCQkrICIgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiIKLQkJKyAiICpcclxuIiAKLQkJKyAiICogQ29udHJpYnV0b3Iocyk6XHJcbiIgCi0JCSsgIiAqXHJcbiIgCi0JCSsgIiAqIElCTVxyXG4iCi0JCSsgIiAqIC0gIEJpbmRpbmcgdG8gcGVybWl0IGludGVyZmFjaW5nIGJldHdlZW4gTW96aWxsYSBhbmQgU1dUXHJcbiIKLQkJKyAiICogLSAgQ29weXJpZ2h0IChDKSAyMDAzIElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuIgotCQkrICIgKlxyXG4iICsgIiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovIjsKLQotCXN0YXRpYyBTdHJpbmcgUEFDS0FHRV9ERUNMQVJBVElPTiA9ICJwYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhOyI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL05hdGl2ZVN0YXRzL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVTdGF0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTmF0aXZlU3RhdHMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZVN0YXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWI2N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTmF0aXZlU3RhdHMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZVN0YXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogSW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byB1c2UgdGhlIE5hdGl2ZVN0YXRzIHRvb2wgd2l0aCBhIHN0YW5kbGFvbmUgU1dUIGV4YW1wbGU6Ci0gKiAKLSAqIDEpIENvbXBpbGUgdGhlIFNXVCBuYXRpdmUgbGlicmFyaWVzIGRlZmluaW5nIHRoZSBOQVRJVkVfU1RBVFMgZmxhZyAoaS5lLiB1bmNvbW1lbnQgbGluZSBpbiBtYWtlZmlsZSkuCi0gKiAyKSBBZGQgdGhlIGZvbGxvd2luZyBjb2RlIGFyb3VuZCB0aGUgc2VjdGlvbnMgb2YgaW50ZXJlc3QgdG8gZHVtcCB0aGUKLSAqIG5hdGl2ZSBjYWxscyBkb25lIGluIHRoYXQgc2VjdGlvbi4KLSAqIAotICogCQlOYXRpdmVTdGF0cyBzdGF0cyA9IG5ldyBOYXRpdmVTdGF0cygpOwotICogCQkuLi4KLSAqIAkJPGNvZGUgc2VjdGlvbj4KLSAqIAkJLi4uCi0gKiAJCXN0YXRzLmR1bXBEaWZmKFN5c3RlbS5vdXQpOwotICogCi0gKiAzKSBPciBhZGQgdGhlIGZvbGxvd2luZyBjb2RlIGF0IGEgZ2l2ZW4gcG9pbnQgdG8gZHVtcCBhIHNuYXBzaG90IG9mCi0gKiB0aGUgbmF0aXZlIGNhbGxzIGRvbmUgdW50aWwgdGhhdCBwb2ludC4KLSAqIAotICogCQluZXcgTmF0aXZlU3RhdHMoKS5kdW1wU25hcHNob3QoU3lzdGVtLm91dCk7IAotICovCi1wdWJsaWMgY2xhc3MgTmF0aXZlU3RhdHMgewotCQotCUhhc2h0YWJsZSBzbmFwc2hvdDsKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nW10gY2xhc3NlcyA9IG5ldyBTdHJpbmdbXXsiT1MiLCAiQVRLIiwgIkNERSIsICJHTk9NRSIsICJHVEsiLCAiWFBDT00iLCAiQ09NIn07Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hdGl2ZUZ1bmN0aW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JCVN0cmluZyBuYW1lOwotCQlpbnQgY2FsbENvdW50OwotCQkKLQlwdWJsaWMgTmF0aXZlRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBjYWxsQ291bnQpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jYWxsQ291bnQgPSBjYWxsQ291bnQ7Ci0JfQotCi0Jdm9pZCBzdWJ0cmFjdChOYXRpdmVGdW5jdGlvbiBmdW5jKSB7Ci0JCXRoaXMuY2FsbENvdW50IC09IGZ1bmMuY2FsbENvdW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2FsbENvdW50KCkgewotCQlyZXR1cm4gY2FsbENvdW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBmdW5jKSB7Ci0JCXJldHVybiAoKE5hdGl2ZUZ1bmN0aW9uKWZ1bmMpLmNhbGxDb3VudCAtIGNhbGxDb3VudDsKLQl9Ci0JfQotCQotcHVibGljIE5hdGl2ZVN0YXRzKCkgewotCXNuYXBzaG90ID0gc25hcHNob3QoKTsKLX0KLQkKLXB1YmxpYyBIYXNodGFibGUgZGlmZigpIHsKLQlIYXNodGFibGUgbmV3U25hcHNob3QgPSBzbmFwc2hvdCgpOwotCUVudW1lcmF0aW9uIGtleXMgPSBuZXdTbmFwc2hvdC5rZXlzKCk7Ci0Jd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotCQlOYXRpdmVGdW5jdGlvbltdIG5ld0Z1bmNzID0gKE5hdGl2ZUZ1bmN0aW9uW10pbmV3U25hcHNob3QuZ2V0KGNsYXNzTmFtZSk7Ci0JCU5hdGl2ZUZ1bmN0aW9uW10gZnVuY3MgPSAoTmF0aXZlRnVuY3Rpb25bXSlzbmFwc2hvdC5nZXQoY2xhc3NOYW1lKTsKLQkJaWYgKGZ1bmNzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3RnVuY3MubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdGdW5jc1tpXS5zdWJ0cmFjdChmdW5jc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIG5ld1NuYXBzaG90OwotfQotCi1wdWJsaWMgdm9pZCBkdW1wRGlmZihQcmludFN0cmVhbSBwcykgewotCWR1bXAoZGlmZigpLCBwcyk7Ci19Ci0KLXB1YmxpYyB2b2lkIGR1bXBTbmFwc2hvdChQcmludFN0cmVhbSBwcykgewotCWR1bXAoc25hcHNob3QoKSwgcHMpOwotfQotCi1wdWJsaWMgdm9pZCBkdW1wU25hcHNob3QoU3RyaW5nIGNsYXNzTmFtZSwgUHJpbnRTdHJlYW0gcHMpIHsKLQlIYXNodGFibGUgc25hcHNob3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0Jc25hcHNob3QoY2xhc3NOYW1lLCBzbmFwc2hvdCk7Ci0JZHVtcChjbGFzc05hbWUsIChOYXRpdmVGdW5jdGlvbltdKXNuYXBzaG90LmdldChjbGFzc05hbWUpLCBwcyk7Ci19Ci0KLXB1YmxpYyB2b2lkIGR1bXAoSGFzaHRhYmxlIHNuYXBzaG90LCBQcmludFN0cmVhbSBwcykgewotCUVudW1lcmF0aW9uIGtleXMgPSBzbmFwc2hvdC5rZXlzKCk7Ci0Jd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotCQlkdW1wKGNsYXNzTmFtZSwgKE5hdGl2ZUZ1bmN0aW9uW10pc25hcHNob3QuZ2V0KGNsYXNzTmFtZSksIHBzKTsKLQl9Ci19Ci0JCi12b2lkIGR1bXAoU3RyaW5nIGNsYXNzTmFtZSwgTmF0aXZlRnVuY3Rpb25bXSBmdW5jcywgUHJpbnRTdHJlYW0gcHMpIHsKLQlpZiAoZnVuY3MgPT0gbnVsbCkgcmV0dXJuOwotCUFycmF5cy5zb3J0KGZ1bmNzKTsKLQlpbnQgdG90YWwgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3MubGVuZ3RoOyBpKyspIHsKLQkJTmF0aXZlRnVuY3Rpb24gZnVuYyA9IGZ1bmNzW2ldOwotCQl0b3RhbCArPSBmdW5jLmdldENhbGxDb3VudCgpOwotCX0KLQlwcy5wcmludChjbGFzc05hbWUpOwotCXBzLnByaW50KCI9Iik7Ci0JcHMucHJpbnQodG90YWwpOwotCXBzLnByaW50bG4oKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgaSsrKSB7Ci0JCU5hdGl2ZUZ1bmN0aW9uIGZ1bmMgPSBmdW5jc1tpXTsKLQkJaWYgKGZ1bmMuZ2V0Q2FsbENvdW50KCkgPiAwKSB7Ci0JCQlwcy5wcmludCgiXHQiKTsKLQkJCXBzLnByaW50KGZ1bmMuZ2V0TmFtZSgpKTsKLQkJCXBzLnByaW50KCI9Iik7Ci0JCQlwcy5wcmludChmdW5jLmdldENhbGxDb3VudCgpKTsKLQkJCXBzLnByaW50bG4oKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0Jc25hcHNob3QgPSBzbmFwc2hvdCgpOyAKLX0KLQotcHVibGljIEhhc2h0YWJsZSBzbmFwc2hvdCgpIHsKLQlIYXNodGFibGUgc25hcHNob3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBjbGFzc2VzW2ldOwotCQlzbmFwc2hvdChjbGFzc05hbWUsIHNuYXBzaG90KTsKLQl9Ci0JcmV0dXJuIHNuYXBzaG90OwotfQotCi1wdWJsaWMgSGFzaHRhYmxlIHNuYXBzaG90KFN0cmluZyBjbGFzc05hbWUsIEhhc2h0YWJsZSBzbmFwc2hvdCkgewotCXRyeSB7Ci0JCUNsYXNzIGNsYXp6ID0gZ2V0Q2xhc3MoKTsKLQkJTWV0aG9kIGZ1bmN0aW9uQ291bnQgPSBjbGF6ei5nZXRNZXRob2QoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbkNvdW50IiwgbmV3IENsYXNzWzBdKTsKLQkJTWV0aG9kIGZ1bmN0aW9uQ2FsbENvdW50ID0gY2xhenouZ2V0TWV0aG9kKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25DYWxsQ291bnQiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3N9KTsKLQkJTWV0aG9kIGZ1bmN0aW9uTmFtZSA9IGNsYXp6LmdldE1ldGhvZChjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uTmFtZSIsIG5ldyBDbGFzc1tde2ludC5jbGFzc30pOwotCQlpbnQgY291bnQgPSAoKEludGVnZXIpZnVuY3Rpb25Db3VudC5pbnZva2UoY2xhenosIG5ldyBPYmplY3RbMF0pKS5pbnRWYWx1ZSgpOwotCQlOYXRpdmVGdW5jdGlvbltdIGZ1bmNzID0gbmV3IE5hdGl2ZUZ1bmN0aW9uW2NvdW50XTsKLQkJT2JqZWN0W10gaW5kZXggPSBuZXcgT2JqZWN0WzFdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWluZGV4WzBdID0gbmV3IEludGVnZXIoaSk7Ci0JCQlpbnQgY2FsbENvdW50ID0gKChJbnRlZ2VyKWZ1bmN0aW9uQ2FsbENvdW50Lmludm9rZShjbGF6eiwgaW5kZXgpKS5pbnRWYWx1ZSgpOwotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWZ1bmN0aW9uTmFtZS5pbnZva2UoY2xhenosIGluZGV4KTsKLQkJCWZ1bmNzW2ldID0gbmV3IE5hdGl2ZUZ1bmN0aW9uKG5hbWUsIGNhbGxDb3VudCk7Ci0JCX0KLQkJc25hcHNob3QucHV0KGNsYXNzTmFtZSwgZnVuY3MpOwotCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0vLwkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCXJldHVybiBzbmFwc2hvdDsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBPU19HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgT1NfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgT1NfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEFUS19HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgQVRLX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEFUS19HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ0RFX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDREVfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ0RFX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHTk9NRV9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgR05PTUVfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR05PTUVfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdUS19HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgR1RLX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdUS19HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgWFBDT01fR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIFhQQ09NX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFhQQ09NX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDT01fR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIENPTV9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDT01fR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvU2xlYWsvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1NsZWFrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9TbGVhay9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2xlYWsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjMzVkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9TbGVhay9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2xlYWsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogSW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byB1c2UgdGhlIFNsZWFrIHRvb2wgd2l0aCBhIHN0YW5kbGFvbmUgU1dUIGV4YW1wbGU6Ci0gKiAKLSAqIE1vZGlmeSB0aGUgbWFpbiBtZXRob2QgYmVsb3cgdG8gbGF1bmNoIHlvdXIgYXBwbGljYXRpb24uCi0gKiBSdW4gU2xlYWsuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNsZWFrIHsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JTGlzdCBsaXN0OwotCUNhbnZhcyBjYW52YXM7Ci0JQnV0dG9uIHN0YXJ0LCBzdG9wLCBjaGVjazsKLQlUZXh0IHRleHQ7Ci0JTGFiZWwgbGFiZWw7Ci0JCi0JT2JqZWN0IFtdIG9sZE9iamVjdHMgPSBuZXcgT2JqZWN0IFswXTsKLQlFcnJvciBbXSBvbGRFcnJvcnMgPSBuZXcgRXJyb3IgWzBdOwotCU9iamVjdCBbXSBvYmplY3RzID0gbmV3IE9iamVjdCBbMF07Ci0JRXJyb3IgW10gZXJyb3JzID0gbmV3IEVycm9yIFswXTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGV2aWNlRGF0YSBkYXRhID0gbmV3IERldmljZURhdGEoKTsKLQlkYXRhLnRyYWNraW5nID0gdHJ1ZTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoZGF0YSk7Ci0JU2xlYWsgc2xlYWsgPSBuZXcgU2xlYWsgKCk7Ci0Jc2xlYWsub3BlbiAoKTsKLQkKLQkvLyBMYXVuY2ggeW91IGFwcGxpY2F0aW9uIGhlcmUKLQkvLyBlLmcuCQkKLS8vCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotLy8JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0vLwlidXR0b24xLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgNTApOwotLy8JYnV0dG9uMS5zZXRUZXh0KCJIZWxsbyBXb3JsZCIpOwotLy8JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMjAsIDIwKTsKLS8vCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotLy8JYnV0dG9uMi5zZXRCb3VuZHMoMTAsIDcwLCAxMDAsIDUwKTsKLS8vCWJ1dHRvbjIuc2V0SW1hZ2UoaW1hZ2UpOwotLy8Jc2hlbGwub3BlbigpOwotCQotCXdoaWxlICghc2xlYWsuc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0JCi12b2lkIG9wZW4gKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQgKCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJTLUxlYWsiKTsKLQlsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXJlZnJlc2hPYmplY3QgKCk7Ci0JCX0KLQl9KTsKLQl0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcGFpbnRDYW52YXMgKGV2ZW50KTsKLQkJfQotCX0pOwotCWNoZWNrID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JY2hlY2suc2V0VGV4dCAoIlN0YWNrIik7Ci0JY2hlY2suYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQl0b2dnbGVTdGFja1RyYWNlICgpOwotCQl9Ci0JfSk7Ci0Jc3RhcnQgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXN0YXJ0LnNldFRleHQgKCJTbmFwIik7Ci0Jc3RhcnQuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVmcmVzaEFsbCAoKTsKLQkJfQotCX0pOwotCXN0b3AgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXN0b3Auc2V0VGV4dCAoIkRpZmYiKTsKLQlzdG9wLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXJlZnJlc2hEaWZmZXJlbmNlICgpOwotCQl9Ci0JfSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRUZXh0ICgiMCBvYmplY3QocykiKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWxheW91dCAoKTsKLQkJfQotCX0pOwotCWNoZWNrLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCXRleHQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplICgpOwotCXNoZWxsLnNldFNpemUgKHNpemUueCAvIDIsIHNpemUueSAvIDIpOwotCXNoZWxsLm9wZW4gKCk7Ci19Ci0KLXZvaWQgcmVmcmVzaExhYmVsICgpIHsKLQlpbnQgY29sb3JzID0gMCwgY3Vyc29ycyA9IDAsIGZvbnRzID0gMCwgZ2NzID0gMCwgaW1hZ2VzID0gMCwgcmVnaW9ucyA9IDA7Ci0JZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJT2JqZWN0IG9iamVjdCA9IG9iamVjdHMgW2ldOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sb3IpIGNvbG9ycysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3Vyc29yKSBjdXJzb3JzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBGb250KSBmb250cysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgR0MpIGdjcysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW1hZ2UpIGltYWdlcysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVnaW9uKSByZWdpb25zKys7Ci0JfQotCVN0cmluZyBzdHJpbmcgPSAiIjsKLQlpZiAoY29sb3JzICE9IDApIHN0cmluZyArPSBjb2xvcnMgKyAiIENvbG9yKHMpXG4iOwotCWlmIChjdXJzb3JzICE9IDApIHN0cmluZyArPSBjdXJzb3JzICsgIiBDdXJzb3IocylcbiI7Ci0JaWYgKGZvbnRzICE9IDApIHN0cmluZyArPSBmb250cyArICIgRm9udChzKVxuIjsKLQlpZiAoZ2NzICE9IDApIHN0cmluZyArPSBnY3MgKyAiIEdDKHMpXG4iOwotCWlmIChpbWFnZXMgIT0gMCkgc3RyaW5nICs9IGltYWdlcyArICIgSW1hZ2UocylcbiI7Ci0JaWYgKHJlZ2lvbnMgIT0gMCkgc3RyaW5nICs9IHJlZ2lvbnMgKyAiIFJlZ2lvbihzKVxuIjsKLQlpZiAoc3RyaW5nLmxlbmd0aCAoKSAhPSAwKSB7Ci0JCXN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcgKDAsIHN0cmluZy5sZW5ndGggKCkgLSAxKTsKLQl9Ci0JbGFiZWwuc2V0VGV4dCAoc3RyaW5nKTsKLX0KLQotdm9pZCByZWZyZXNoRGlmZmVyZW5jZSAoKSB7Ci0JRGV2aWNlRGF0YSBpbmZvID0gZGlzcGxheS5nZXREZXZpY2VEYXRhICgpOwotCWlmICghaW5mby50cmFja2luZykgewotCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0JCWRpYWxvZy5zZXRUZXh0IChzaGVsbC5nZXRUZXh0ICgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UgKCJXYXJuaW5nOiBEZXZpY2UgaXMgbm90IHRyYWNraW5nIHJlc291cmNlIGFsbG9jYXRpb24iKTsKLQkJZGlhbG9nLm9wZW4gKCk7Ci0JfQotCU9iamVjdCBbXSBuZXdPYmplY3RzID0gaW5mby5vYmplY3RzOwotCUVycm9yIFtdIG5ld0Vycm9ycyA9IGluZm8uZXJyb3JzOwotCU9iamVjdCBbXSBkaWZmT2JqZWN0cyA9IG5ldyBPYmplY3QgW25ld09iamVjdHMubGVuZ3RoXTsKLQlFcnJvciBbXSBkaWZmRXJyb3JzID0gbmV3IEVycm9yIFtuZXdFcnJvcnMubGVuZ3RoXTsKLQlpbnQgY291bnQgPSAwOwotCWZvciAoaW50IGk9MDsgaTxuZXdPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChpbmRleCA8IG9sZE9iamVjdHMubGVuZ3RoKSB7Ci0JCQlpZiAobmV3T2JqZWN0cyBbaV0gPT0gb2xkT2JqZWN0cyBbaW5kZXhdKSBicmVhazsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYgKGluZGV4ID09IG9sZE9iamVjdHMubGVuZ3RoKSB7Ci0JCQlkaWZmT2JqZWN0cyBbY291bnRdID0gbmV3T2JqZWN0cyBbaV07Ci0JCQlkaWZmRXJyb3JzIFtjb3VudF0gPSBuZXdFcnJvcnMgW2ldOwotCQkJY291bnQrKzsKLQkJfQotCX0KLQlvYmplY3RzID0gbmV3IE9iamVjdCBbY291bnRdOwotCWVycm9ycyA9IG5ldyBFcnJvciBbY291bnRdOwotCVN5c3RlbS5hcnJheWNvcHkgKGRpZmZPYmplY3RzLCAwLCBvYmplY3RzLCAwLCBjb3VudCk7Ci0JU3lzdGVtLmFycmF5Y29weSAoZGlmZkVycm9ycywgMCwgZXJyb3JzLCAwLCBjb3VudCk7Ci0JbGlzdC5yZW1vdmVBbGwgKCk7Ci0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JY2FudmFzLnJlZHJhdyAoKTsKLQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQlsaXN0LmFkZCAob2JqZWN0TmFtZSAob2JqZWN0cyBbaV0pKTsKLQl9Ci0JcmVmcmVzaExhYmVsICgpOwotCWxheW91dCAoKTsKLX0KLQotU3RyaW5nIG9iamVjdE5hbWUgKE9iamVjdCBvYmplY3QpIHsKLQlTdHJpbmcgc3RyaW5nID0gb2JqZWN0LnRvU3RyaW5nICgpOwotCWludCBpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZiAoJy4nKTsKLQlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBzdHJpbmc7Ci0JcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcgKGluZGV4ICsgMSwgc3RyaW5nLmxlbmd0aCAoKSk7Ci19Ci0KLXZvaWQgdG9nZ2xlU3RhY2tUcmFjZSAoKSB7Ci0JcmVmcmVzaE9iamVjdCAoKTsKLQlsYXlvdXQgKCk7Ci19Ci0KLXZvaWQgcGFpbnRDYW52YXMgKEV2ZW50IGV2ZW50KSB7Ci0JY2FudmFzLnNldEN1cnNvciAobnVsbCk7Ci0JaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQlHQyBnYyA9IGV2ZW50LmdjOwotCU9iamVjdCBvYmplY3QgPSBvYmplY3RzIFtpbmRleF07Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbG9yKSB7Ci0JCWlmICgoKENvbG9yKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQlnYy5zZXRCYWNrZ3JvdW5kICgoQ29sb3IpIG9iamVjdCk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUgKGNhbnZhcy5nZXRDbGllbnRBcmVhKCkpOwotCQlyZXR1cm47Ci0JfQotCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXJzb3IpIHsKLQkJaWYgKCgoQ3Vyc29yKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQljYW52YXMuc2V0Q3Vyc29yICgoQ3Vyc29yKSBvYmplY3QpOwotCQlyZXR1cm47Ci0JfQotCWlmIChvYmplY3QgaW5zdGFuY2VvZiBGb250KSB7Ci0JCWlmICgoKEZvbnQpb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWdjLnNldEZvbnQgKChGb250KSBvYmplY3QpOwotCQlGb250RGF0YSBbXSBhcnJheSA9IGdjLmdldEZvbnQgKCkuZ2V0Rm9udERhdGEgKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJU3RyaW5nIGxmID0gdGV4dC5nZXRMaW5lRGVsaW1pdGVyICgpOwotCQlmb3IgKGludCBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCUZvbnREYXRhIGRhdGEgPSBhcnJheSBbaV07Ci0JCQlTdHJpbmcgc3R5bGUgPSAiTk9STUFMIjsKLQkJCWludCBiaXRzID0gZGF0YS5nZXRTdHlsZSAoKTsKLQkJCWlmIChiaXRzICE9IDApIHsKLQkJCQlpZiAoKGJpdHMgJiBTV1QuQk9MRCkgIT0gMCkgc3R5bGUgPSAiQk9MRCAiOwotCQkJCWlmICgoYml0cyAmIFNXVC5JVEFMSUMpICE9IDApIHN0eWxlICs9ICJJVEFMSUMiOwotCQkJfQotCQkJc3RyaW5nICs9IGRhdGEuZ2V0TmFtZSAoKSArICIgIiArIGRhdGEuZ2V0SGVpZ2h0ICgpICsgIiAiICsgc3R5bGUgKyBsZjsKLQkJfQotCQlnYy5kcmF3U3RyaW5nIChzdHJpbmcsIDAsIDApOwotCQlyZXR1cm47Ci0JfQotCS8vTk9USElORyBUTyBEUkFXIEZPUiBHQwotLy8JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdDKSB7Ci0vLwkJcmV0dXJuOwotLy8JfQotCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJbWFnZSkgewotCQlpZiAoKChJbWFnZSlvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJZ2MuZHJhd0ltYWdlICgoSW1hZ2UpIG9iamVjdCwgMCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlZ2lvbikgewotCQlpZiAoKChSZWdpb24pb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCVN0cmluZyBzdHJpbmcgPSAoKFJlZ2lvbilvYmplY3QpLmdldEJvdW5kcygpLnRvU3RyaW5nKCk7Ci0JCWdjLmRyYXdTdHJpbmcgKHN0cmluZywgMCwgMCk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXZvaWQgcmVmcmVzaE9iamVjdCAoKSB7Ci0JaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQlpZiAoY2hlY2suZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtICgpOwotCQlQcmludFN0cmVhbSBzID0gbmV3IFByaW50U3RyZWFtIChzdHJlYW0pOwotCQllcnJvcnMgW2luZGV4XS5wcmludFN0YWNrVHJhY2UgKHMpOwotCQl0ZXh0LnNldFRleHQgKHN0cmVhbS50b1N0cmluZyAoKSk7Ci0JCXRleHQuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCWNhbnZhcy5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JfSBlbHNlIHsKLQkJY2FudmFzLnNldFZpc2libGUgKHRydWUpOwotCQl0ZXh0LnNldFZpc2libGUgKGZhbHNlKTsKLQkJY2FudmFzLnJlZHJhdyAoKTsKLQl9Ci19Ci0KLXZvaWQgcmVmcmVzaEFsbCAoKSB7Ci0Jb2xkT2JqZWN0cyA9IG5ldyBPYmplY3QgWzBdOwotCW9sZEVycm9ycyA9IG5ldyBFcnJvciBbMF07Ci0JcmVmcmVzaERpZmZlcmVuY2UgKCk7Ci0Jb2xkT2JqZWN0cyA9IG9iamVjdHM7Ci0Jb2xkRXJyb3JzID0gZXJyb3JzOwotfQotCi12b2lkIGxheW91dCAoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCWludCB3aWR0aCA9IDA7Ci0JU3RyaW5nIFtdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLQlHQyBnYyA9IG5ldyBHQyAobGlzdCk7Ci0JZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJd2lkdGggPSBNYXRoLm1heCAod2lkdGgsIGdjLnN0cmluZ0V4dGVudCAoaXRlbXMgW2ldKS54KTsKLQl9Ci0JZ2MuZGlzcG9zZSAoKTsKLQlQb2ludCBzaXplMSA9IHN0YXJ0LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IHNpemUyID0gc3RvcC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlQb2ludCBzaXplMyA9IGNoZWNrLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IHNpemU0ID0gbGFiZWwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0Jd2lkdGggPSBNYXRoLm1heCAoc2l6ZTEueCwgTWF0aC5tYXggKHNpemUyLngsIE1hdGgubWF4IChzaXplMy54LCB3aWR0aCkpKTsKLQl3aWR0aCA9IE1hdGgubWF4ICg2NCwgTWF0aC5tYXggKHNpemU0LngsIGxpc3QuY29tcHV0ZVNpemUgKHdpZHRoLCBTV1QuREVGQVVMVCkueCkpOwotCXN0YXJ0LnNldEJvdW5kcyAoMCwgMCwgd2lkdGgsIHNpemUxLnkpOwotCXN0b3Auc2V0Qm91bmRzICgwLCBzaXplMS55LCB3aWR0aCwgc2l6ZTIueSk7Ci0JY2hlY2suc2V0Qm91bmRzICgwLCBzaXplMS55ICsgc2l6ZTIueSwgd2lkdGgsIHNpemUzLnkpOwotCWxhYmVsLnNldEJvdW5kcyAoMCwgcmVjdC5oZWlnaHQgLSBzaXplNC55LCB3aWR0aCwgc2l6ZTQueSk7Ci0JaW50IGhlaWdodCA9IHNpemUxLnkgKyBzaXplMi55ICsgc2l6ZTMueTsKLQlsaXN0LnNldEJvdW5kcyAoMCwgaGVpZ2h0LCB3aWR0aCwgcmVjdC5oZWlnaHQgLSBoZWlnaHQgLSBzaXplNC55KTsKLQl0ZXh0LnNldEJvdW5kcyAod2lkdGgsIDAsIHJlY3Qud2lkdGggLSB3aWR0aCwgcmVjdC5oZWlnaHQpOwotCWNhbnZhcy5zZXRCb3VuZHMgKHdpZHRoLCAwLCByZWN0LndpZHRoIC0gd2lkdGgsIHJlY3QuaGVpZ2h0KTsKLX0KLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyMjM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHRvb2xzLmphcj1KTkkgR2VuZXJhdGlvbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2ZjOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU1dUIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjg2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1Qvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L3dpZGdldHMvVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUL3dpbjMyL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKaW5kZXggNzlhZmM1Ny4uNzYxYTM2NiAxMDA3NTUKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1Qvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L3dpZGdldHMvVGFibGUuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvd2lkZ2V0cy9UYWJsZS5qYXZhCkBAIC0yMDgsMTMgKzIwOCwxMyBAQAogCQljYXNlIE9TLldNX1NZU0NIQVI6CiAJCWNhc2UgT1MuV01fU1lTS0VZRE9XTjoKIAkJY2FzZSBPUy5XTV9TWVNLRVlVUDoKLQkJCWNoZWNrU2VsZWN0aW9uID0gdHJ1ZTsKIAkJCS8vRkFMTCBUSFJPVUdICiAJCQkKIAkJLyogU2Nyb2xsIG1lc3NhZ2VzICovCiAJCWNhc2UgT1MuV01fSFNDUk9MTDoKIAkJY2FzZSBPUy5XTV9WU0NST0xMOgotCQkJCisJCQkvL0ZBTEwgVEhST1VHSAorCQkJCQkJCiAJCS8qIFJlc2l6ZSBtZXNzYWdlcyAqLwogCQljYXNlIE9TLldNX1dJTkRPV1BPU0NIQU5HRUQ6CiAJCQlpZiAoYmFja2dyb3VuZEltYWdlICE9IG51bGwgJiYgZHJhd0NvdW50ID09IDApIHsKQEAgLTIzOSw2ICsyMzksOCBAQAogCQljYXNlIE9TLldNX1hCVVRUT05EQkxDTEs6CiAJCWNhc2UgT1MuV01fWEJVVFRPTkRPV046CiAJCWNhc2UgT1MuV01fWEJVVFRPTlVQOgorCQkJY2hlY2tTZWxlY3Rpb24gPSB0cnVlOworCQkJLy9GQUxMIFRIUk9VR0gKIAkJCQogCQkvKiBPdGhlciBtZXNzYWdlcyAqLwogCQljYXNlIE9TLldNX1NFVEZPTlQ6CkBAIC02MjEsMTIgKzYyMywxNSBAQAogcHVibGljIFBvaW50IGNvbXB1dGVTaXplIChpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7CiAJY2hlY2tXaWRnZXQgKCk7CiAJaWYgKGZpeFNjcm9sbFdpZHRoKSBzZXRTY3JvbGxXaWR0aCAobnVsbCwgdHJ1ZSk7CisJaW50IGh3bmRIZWFkZXIgPSBPUy5TZW5kTWVzc2FnZSAoaGFuZGxlLCBPUy5MVk1fR0VUSEVBREVSLCAwLCAwKTsKKwlSRUNUIHJlY3QgPSBuZXcgUkVDVCAoKTsJCQkJCQorCU9TLkdldFdpbmRvd1JlY3QgKGh3bmRIZWFkZXIsIHJlY3QpOworCWludCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwogCWludCBiaXRzID0gMDsKIAlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHsKIAkJYml0cyB8PSB3SGludCAmIDB4RkZGRjsKIAl9IGVsc2UgewogCQlpbnQgd2lkdGggPSAwOwotCQlpbnQgaHduZEhlYWRlciA9IE9TLlNlbmRNZXNzYWdlIChoYW5kbGUsIE9TLkxWTV9HRVRIRUFERVIsIDAsIDApOwogCQlpbnQgY291bnQgPSBPUy5TZW5kTWVzc2FnZSAoaHduZEhlYWRlciwgT1MuSERNX0dFVElURU1DT1VOVCwgMCwgMCk7CiAJCWZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7CiAJCQl3aWR0aCArPSBPUy5TZW5kTWVzc2FnZSAoaGFuZGxlLCBPUy5MVk1fR0VUQ09MVU1OV0lEVEgsIGksIDApOwpAQCAtNjM4LDcgKzY0Myw3IEBACiAJaW50IGVtcHR5ID0gT1MuU2VuZE1lc3NhZ2UgKGhhbmRsZSwgT1MuTFZNX0FQUFJPWElNQVRFVklFV1JFQ1QsIDAsIDApOwogCWludCBvbmVJdGVtID0gT1MuU2VuZE1lc3NhZ2UgKGhhbmRsZSwgT1MuTFZNX0FQUFJPWElNQVRFVklFV1JFQ1QsIDEsIDApOwogCWludCBpdGVtSGVpZ2h0ID0gKG9uZUl0ZW0gPj4gMTYpIC0gKGVtcHR5ID4+IDE2KTsKLQlpbnQgaGVpZ2h0ID0gT1MuU2VuZE1lc3NhZ2UgKGhhbmRsZSwgT1MuTFZNX0dFVElURU1DT1VOVCwgMCwgMCkgKiBpdGVtSGVpZ2h0OworCWhlaWdodCArPSBPUy5TZW5kTWVzc2FnZSAoaGFuZGxlLCBPUy5MVk1fR0VUSVRFTUNPVU5ULCAwLCAwKSAqIGl0ZW1IZWlnaHQ7CiAJaWYgKHdpZHRoID09IDApIHdpZHRoID0gREVGQVVMVF9XSURUSDsKIAlpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IERFRkFVTFRfSEVJR0hUOwogCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgd2lkdGggPSB3SGludDsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L2J1aWxkbm90ZXNfc3d0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9idWlsZG5vdGVzX3N3dC5odG1sCmluZGV4IGI5ZDRkNDguLjkxY2I2MjUgMTAwNzU1Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L2J1aWxkbm90ZXNfc3d0Lmh0bWwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvYnVpbGRub3Rlc19zd3QuaHRtbApAQCAtMTEsNiArMTEsMjUgQEAKIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CiBTV1Q8L2gxPgogCis8aDI+IFNXVCBCdWlsZCAzLjIgMDEyYyAtIFR1ZXNkYXkgTm92ZW1iZXIgMm5kLCAyMDA1IDwvaDI+Cis8aDM+PGEgTkFNRT0iUHJvYmxlbSByZXBvcnRzIGZpeGVkIj48L2E+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMz4KKzxibG9ja3F1b3RlPgorMTE0NTMzCUVkaXRvciBwb3B1cCBoYXMgd3Jvbmcgc2l6ZQorPC9ibG9ja3F1b3RlPgorCis8aDI+IFNXVCBCdWlsZCAzLjIgMDEyYiAtIFR1ZXNkYXkgTm92ZW1iZXIgMXN0LCAyMDA1IDwvaDI+Cis8aDM+PGEgTkFNRT0iUHJvYmxlbSByZXBvcnRzIGZpeGVkIj48L2E+UHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMz4KKzxibG9ja3F1b3RlPgorMTE0NDk4CVRhYmxlIGRvZXNuJ3Qgc2VuZCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cyBhbnltb3JlIHdoZW4gc2VsZWN0aW5nIGVsZW1lbnRzIHdpdGggdGhlIG1vdXNlCis8YnI+MTE0NTE4CVtidWlsZF0gZWNsaXBzZSBzb2xhcmlzLW1vdGlmIGRlcGVuZHMgb24gbGlibS5zby4yCis8L2Jsb2NrcXVvdGU+CisKKzxoMj4gU1dUIEJ1aWxkIDMuMiAwMTJhIC0gVHVlc2RheSBOb3ZlbWJlciAxc3QsIDIwMDUgPC9oMj4KKzxoMz48YSBOQU1FPSJQcm9ibGVtIHJlcG9ydHMgZml4ZWQiPjwvYT5Qcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gzPgorPGJsb2NrcXVvdGU+CisxMTIzOTAJW1ZpZXdlcnNdIEpVbml0IGVycm9yIGluIEpGYWNlUGVyZm9ybWFuY2VTdWl0ZQorPC9ibG9ja3F1b3RlPgorCiA8aDI+IFNXVCBCdWlsZCAzLjIgMDEyIC0gTW9uZGF5IE9jdG9iZXIgMzFzdCwgMjAwNSA8L2gyPgogPGgzPjxhIE5BTUU9IlByb2JsZW0gcmVwb3J0cyBmaXhlZCI+PC9hPlByb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDM+CiA8YmxvY2txdW90ZT4KQEAgLTIyNzgsNyArMjI5Nyw3IEBACiA8YnI+NTMwNDU6ICBubyBtb3JlIGhhbmRsZXMhICAKIDxicj41MzA1NzogIEJyb3dzZXIgd2lkZ2V0IGFuZCBkaXNwbGF5IG9mIHNwZWNpYWwgY2hhcnMgIAogPGJyPjUzMTQxOiAgSlZNIGNyYXNoIGF0IGVjbGlwc2UgZXhpdCAgCi08YnI+NTMyMjE6ICBbU1dUIEV4YW1wbGVzXSDvv71TYXZlIEFz77+9Pz8/PyBEaWFsb2cgb2YgSW1hZ2UgQW5hbHl6ZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgY29ycmVjdCBmaWxlIHBhdGggIAorPGJyPjUzMjIxOiAgW1NXVCBFeGFtcGxlc10gPz8/U2F2ZSBBcz8/Pz8/Pz8gRGlhbG9nIG9mIEltYWdlIEFuYWx5emVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIGNvcnJlY3QgZmlsZSBwYXRoICAKIDxicj41MzIzNjogIFNldHRpbmcgZm9udC9jb2xvciBvbiBhbiBpdGVtIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlIHNob3VsZCBub3QgcmVkcmF3ICAKIDxicj41MzM2MTogIFtFZGl0b3JNZ210XSBOZXcgbG9vazogZWRpdG9yIGNsb3NlIGJ1dHRvbiAoeCkgZG9lcyBub3RoaW5nIHNvbWV0aW1lcyAgCiA8YnI+NTMzODg6ICBbNjRdIENyYXNoIGluIGdfc2lnbmFsX2xvb2t1cCAgCkBAIC0yNjQwLDcgKzI2NTksNyBAQAogPGJyPjQ1OTk3OiAgW2Jyb3dzZXJdIHN1cHBvcnQgYW5kIHJlcXVpcmUgTW96aWxsYSAxLjUgIAogPGJyPjQ2MTQ3OiAgW2Jyb3dzZXJdIFNXVCBhY2NlbGVyYXRvcnMgZ2V0IG92ZXJyaWRlbiBieSBJRSAgCiA8YnI+NDQ5MTk6ICBbS2V5QmluZGluZ3NdIGRpYWxvZyBrZXlib2FyZCBzaG9ydGN1dHMgZ29uZSAgCi08YnI+NDUzNjI6ICBbS2V5QmluZGluZ3NdIEZyZW5jaCBLZXlib2FyZCBpc3N1ZSB3aXRoIDAga2V5IChTSElGVCArIO+/vT8/Pz8pICAKKzxicj40NTM2MjogIFtLZXlCaW5kaW5nc10gRnJlbmNoIEtleWJvYXJkIGlzc3VlIHdpdGggMCBrZXkgKFNISUZUICsgPz8/Pz8/PykgIAogPGJyPjM3NzQwOiAgW0tleUJpbmRpbmdzXSBUZXh0IHRvb2wgaXRlbSBvbiB0aGUgVmlld3BhcnQgVGl0bGUgdGFrZXMgbWVudSdzIGFjY2VsZXJhdG9yIGtleSAgCiA8L2Jsb2NrcXVvdGU+CiAKQEAgLTM5MjYsNyArMzk0NSw3IEBACiA8YnI+MTQ5NTY6IFN0eWxlZFRleHQgLSBwcmludGluZyBzaG91bGQgc3VwcG9ydCBwYWdpbmF0aW9uLCBoZWFkZXJzLCBhbmQgZm9vdGVycwogPGJyPjIxNjk1OiBDcmFzaCB3aGVuIHN0YXJ0aW5nIGVjbGlwc2Ugb24gU29sYXJpczggd2l0aCBqYXZhIDEuNCAgCiA8YnI+MjIwNTI6IExhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZyBsb3NlcyB3b3Jrc3BhY2UgZGF0YSBkaXIgIAotPGJyPjIzMDQ5OiBDYW5ub3Qgd3JpdGUgU3dlZGlzaCBjaGFyYWN0ZXJzICjvv73vv73vv73vv73vv73vv70pIGluIGVkaXRvciAgCis8YnI+MjMwNDk6IENhbm5vdCB3cml0ZSBTd2VkaXNoIGNoYXJhY3RlcnMgKD8/Pz8/Pz8/Pz8/Pz8/Pz8/PykgaW4gZWRpdG9yICAKIDxicj4yNDI3MzogR1AgLVRyZWUgcmVtb3ZlQWxsIHJlYm9vdCB3aW5kb3dzWHAgIAogPGJyPjI0MzU5OiBNZW51SXRlbXMgd2l0aCBzdHlsZSBTV1QuUkFESU8gc2hvdWxkIGhhbmRsZSBtdXR1YWwgZXhjbHVzaW9uIG9uIHNlbGVjdGlvbgogPGJyPjI0NzU3OiBHVEs6IFggcG9pbnRlciBncmFiIHdoZW4gcmVzaXppbmcgYSB0YWJsZSBjb2x1bW4gIApAQCAtNDIxNyw3ICs0MjM2LDcgQEAKIDxicj4yMDE0NDogRW50ZXIga2V5IG5vdCB3b3JraW5nIGluIHBhY2thZ2VzIHZpZXcgIAogPGJyPjIxMTc5OiBTdGVwIGZpbHRlciBpbi1wbGFjZSB0ZXh0IGVkaXRvciBpbnZpc2libGUgIAogPGJyPjIxMjQzOiBTY3JvbGwgbG9jayBpbnNlcnRzIGEgY2hhcmFjdGVyIGR1cmluZyBpbmNyZW1lbnRhbCBzZWFyY2ggb24gR1RLCi08YnI+MjEzMzg6IEFjY2VudHMgYW5kIO+/vT8/Pz8gZG9uJ3Qgd29yayBpbiBlZGl0b3IgdXNpbmcgZ3RrICAKKzxicj4yMTMzODogQWNjZW50cyBhbmQgPz8/Pz8/PyBkb24ndCB3b3JrIGluIGVkaXRvciB1c2luZyBndGsgIAogPGJyPjIxNDcyOiBrZXlQcmVzc2VkIGV2ZW50IGlnbm9yZWQgYnkgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dCBmb3IgRU5URVIga2V5CiA8YnI+MjE2OTY6IFN0eWxlZFRleHQgLSBSVEYgdHJhbnNmZXIgY29kZXBhZ2UgZW5jb2RpbmcgIAogPGJyPjIxNjk4OiBTdHlsZWRUZXh0IC0gUlRGIHdyaXRlciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCAgCkBAIC01MTU4LDcgKzUxNzcsNyBAQAogPGJyPjQ3MjQ6IEdQIC0gRmF0YWwgYXBwIGVycm9yIC0gcmVuYW1pbmcgcmVzb3VyY2Ugb24gbGludXggKDFHRjdUWE8pICAKIDxicj40NzM2OiBGaXggcHJpbnRpbmcgKDFHRlcyQ1cpICAKIDxicj40ODE3OiBOZWVkIEphdmFEb2MgY29tbWVudHMgZm9yIFNXVCBQaG90b24gKDFHSkxFVTApICAKLTxicj42ODM1OiBDaGFyYWN0ZXJzIO+/ve+/ve+/vT8/Pz8gYW5kIO+/vT8/Pz8gZG9lc24ndCB3b3JrIGluIEphdmEgZWRpdG9yIG9uIFN3ZWRpc2ggIAorPGJyPjY4MzU6IENoYXJhY3RlcnMgPz8/Pz8/Pz8/Pz8/PyBhbmQgPz8/Pz8/PyBkb2Vzbid0IHdvcmsgaW4gSmF2YSBlZGl0b3Igb24gU3dlZGlzaCAgCiA8YnI+ODI1NTogQ2xvc2luZyBwYWludCB2aWV3ZXIgY2F1c2VzIGludGVybmFsIGVycm9yICAKIDxicj44NDEwOiBCbGFjayBjb2xvciBiZWNvbWUgdHJhbnNwYXJlbnQgaW4gVG9vbEJhciBpbWFnZXMgIAogPGJyPjg1MDM6IFN0eWxlZFRleHQgLSBjaGVlc2UgaWYgcmVzaXplIGluIHdvcmQgd3JhcCB0cmllcyB0byBrZWVwIHBhcnRpYWwgdG9wIGxpbmUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBiNDdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLkJyb3dzZXJEZW1vPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzY0ZGE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuQnJvd3NlckRlbW8uamFyID0gc3JjLwotb3V0cHV0LkJyb3dzZXJEZW1vLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0JCQkgICBwbHVnaW4ucHJvcGVydGllcyxcCi0JCQkgICBwbHVnaW4ueG1sLFwKLQkJCSAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgQnJvd3NlckRlbW8uamFyLFwKLSAgICAgICAgICAgICAgIGNzczEvLFwKLSAgICAgICAgICAgICAgIGNzczIvLFwKLSAgICAgICAgICAgICAgIGNzczMvLFwKLSAgICAgICAgICAgICAgIGNzczQvLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2sxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiOWYzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2sxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjY4ZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmxhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZjMWU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmxhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ib2FyZDEuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ib2FyZDEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M0ZDVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9lbXB0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YmNlNGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9lbXB0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvbGluZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEwZjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvbGluZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzNmZhOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWJvZHkge2JhY2tncm91bmQ6IHVybCguL2JhY2syLmpwZykgZml4ZWQ7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDEge3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNHB0OyBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDIge2JhY2tncm91bmQ6IHVybCguL2xpbmUxLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMyB7Zm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi0NCi11bCB7bGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMDsgbWFyZ2luOjA7IGZvbnQ6IDEycHQgVGltZXM7fQ0KLWxpLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZS5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFjay5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGwuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi0NCi0uYm9hcmQge3RleHQtYWxpZ246IGNlbnRlcjt9DQotdGFibGUgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46IDA7fQ0KLXRyIHt9DQotdGQge2hlaWdodDogMzJweDsgd2lkdGg6MzJweDsgdGFibGUtbGF5b3V0OiBmaXhlZDt9DQotDQotLndoaXRlbGluayBhIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vZW1wdHkuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0uYmxhY2tsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9lbXB0eS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLS5lbXB0eSB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2VtcHR5LmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotDQotLndoaXRlbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGUuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0uYmxhY2tsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibGFjay5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGUuZ2lmKSBuby1yZXBlYXQ7fQ0KLS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7fQ0KLS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsLmdpZikgbm8tcmVwZWF0O30NCi0NCi0ucGxheWVyd2hpdGUge2Zsb2F0OiBsZWZ0OyBtYXJnaW46IDFlbSAxZW07IGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7IGJhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0OyB0ZXh0LWFsaWduOiByaWdodDsgd2lkdGg6MTAwcHg7IGhlaWdodDozMnB4O30NCi0ucGxheWVyYmxhY2sge2Zsb2F0OiByaWdodDsgbWFyZ2luOiAxZW0gMWVtOyBib3JkZXI6IDFweCBzb2xpZCBncmF5OyBiYWNrZ3JvdW5kOiB1cmwoLi9ibGFjay5naWYpIG5vLXJlcGVhdDsgdGV4dC1hbGlnbjogcmlnaHQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6MzJweDt9DQotDQotLndpbm5lciB7Ym9yZGVyOiA0cHggc29saWQgYmx1ZTsgZm9udDogYm9sZCAxNnB0IFRpbWVzLCBzZXJpZjt9DQotLmxvc2VyIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgZm9udDogMTJwdCBUaW1lcywgc2VyaWY7fQ0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2FsbC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk3ZmMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2VsY29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5MmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2VsY29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+U3RhcnQgYSBnYW1lPC90aXRsZT4KLQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlLmNzcyI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5QYXducyBHYW1lPC9oMT4KLTxkaXYgY2xhc3M9InN0YXJ0Ij4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDFwbGF5ZXIiPjEgcGxheWVyPC9hPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MnBsYXllcnMiPjIgcGxheWVyczwvYT4KLTwvZGl2PgotPGgyPkhvdyB0byBwbGF5PC9oMj4KLVRoaXMgYm9hcmQgZ2FtZSBpcyBhIHZhcmlhbnQgb2YgUmV2ZXJzaSBhbmQgVGljIFRhYyBUb2UuIEVhY2ggb25lIG9mIHRoZSB0d28gcGxheWVycyBzZXRzIGEgcGF3biBvbiBhbiBlbXB0eSBjZWxsIG9mIHRoZSBib2FyZC4KLTxoMz5QYXduczwvaDM+Ci08dWw+Ci08bGkgY2xhc3M9IndoaXRlIj5QbGF5ZXIgMTwvbGk+Ci08bGkgY2xhc3M9ImJsYWNrIj5QbGF5ZXIgMjwvbGk+Ci08bGkgY2xhc3M9IndhbGwiPldhbGwuIENhbm5vdCBiZSByZXZlcnNlZC48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InRoZW1lIj4KLURpZmZlcmVudCB0aGVtZXMgYXJlIHN1cHBvcnRlZC4gVGhlbWUgaXMgY29uZmlndXJlZCB0aHJvdWdoIGEgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IChDU1MpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIEhUTUwgY29udGVudCBpcyByZW5kZXJlZCBieSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LgotPHVsIGNsYXNzPSJ0aGVtZSI+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MxIj5UaGVtZSAxPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MyIj5UaGVtZSAyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MzIj5UaGVtZSAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3M0Ij5UaGVtZSA0PC9hPjwvbGk+Ci08L3VsPgotCi08L2Rpdj4KLTxoMj5Ib3cgdG8gd2luPC9oMj4KLVRoZSBnYW1lIGVuZHMgd2hlbiBhbGwgY2VsbHMgYXJlIGZpbGxlZC4gVGhlIHdpbm5lciBpcyB0aGUgb25lIHdpdGggbW9zdCBwYXducyBvZiB0aGVpciBjb2xvdXIuIAotCi08aDI+SmF2YSBhbmQgSFRNTCBpbnRlZ3JhdGVkIHRocm91Z2ggdGhlIFNXVCBCcm93c2VyIHdpZGdldDwvaDI+Ci08cD4KLVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gQ29tcHV0ZXIgbW92ZXMgYXJlIHByb2dyYW1tZWQgaW4gcmVndWxhcgotSmF2YSBjb2RlIGluIHRoZSBFY2xpcHNlIHBsdWctaW4uIFRoZSBTV1QgQnJvd3NlciB3aWRnZXQgaXMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuZCByZWFjdGluZwotdG8gdXNlciBpbnB1dC4KLTwvcD4KLTxoMz5JbXBsZW1lbnRhdGlvbjwvaDM+Ci08cD4KLVRoZSBib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMKLXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLgotPGJyPlRoZSBBUEkgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiBkcmF3cwotdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuCi08YnI+UGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYSBoeXBlcmxpbmsgd2l0aCBhIFVSTCBzaW1pbGFyIHRvCi08Y29kZT5odHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5MjwvY29kZT4uIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyIChjb2x1bW4gMSwgcm93IDIpLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93aGl0ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3doaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzZmQ5Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3doaXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvQmFjazY0MHg0NDAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9CYWNrNjQweDQ0MC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzM4MjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9CYWNrNjQweDQ0MC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL2JsYWNrX2NoaXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9ibGFja19jaGlwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjNmViZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL2JsYWNrX2NoaXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9saW5lMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL2xpbmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMGYzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL2xpbmUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvc3R5bGUuY3NzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDc0OWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1ib2R5IHtiYWNrZ3JvdW5kOiB1cmwoLi9CYWNrNjQweDQ0MC5naWYpIGZpeGVkOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgxIHt0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgyIHtiYWNrZ3JvdW5kOiB1cmwoLi9saW5lMS5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDMge2ZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotDQotdWwge2xpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjowOyBmb250OiAxMnB0IFRpbWVzO30NCi1saS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGVfY2hpcC5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19jaGlwLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9jaGlwLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotDQotLmJvYXJkIHt0ZXh0LWFsaWduOiBsZWZ0O30NCi10YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IG1hcmdpbjogMDsgcGFkZGluZzowOyBiYWNrZ3JvdW5kOiB1cmwoLi90ZXh0dXJlX2NlbGxzLmdpZil9DQotdHIge30NCi10ZCB7aGVpZ2h0OjQ4cHg7IHdpZHRoOjQ4cHg7IHRhYmxlLWxheW91dDogZml4ZWQ7fQ0KLQ0KLS53aGl0ZWxpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmVtcHR5IHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLQ0KLS53aGl0ZWxpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL3doaXRlX2NoaXAuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19jaGlwLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9jaGlwLmdpZikgbm8tcmVwZWF0O30NCi0uYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrX2NoaXAuZ2lmKSBuby1yZXBlYXQ7fQ0KLS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX2NoaXAuZ2lmKSBuby1yZXBlYXQ7fQ0KLQ0KLS5wbGF5ZXJ3aGl0ZSB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL3doaXRlX2NoaXAuZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLS5wbGF5ZXJibGFjayB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDMwMHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19jaGlwLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0NCi0ud2lubmVyIHtib3JkZXI6IDRweCBzb2xpZCB3aGl0ZTsgZm9udDogYm9sZCAxNnB0IFRpbWVzLCBzZXJpZjt9DQotLmxvc2VyIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgZm9udDogMTJwdCBUaW1lcywgc2VyaWY7fQ0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvdGV4dHVyZV9jZWxscy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3RleHR1cmVfY2VsbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2ZlZTlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvdGV4dHVyZV9jZWxscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3dhbGxfY2hpcC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3dhbGxfY2hpcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjBiMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93YWxsX2NoaXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93ZWxjb21lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3dlbGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOTJhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3dlbGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlN0YXJ0IGEgZ2FtZTwvdGl0bGU+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0JPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZS5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+UGF3bnMgR2FtZTwvaDE+Ci08ZGl2IGNsYXNzPSJzdGFydCI+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQxcGxheWVyIj4xIHBsYXllcjwvYT4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDJwbGF5ZXJzIj4yIHBsYXllcnM8L2E+Ci08L2Rpdj4KLTxoMj5Ib3cgdG8gcGxheTwvaDI+Ci1UaGlzIGJvYXJkIGdhbWUgaXMgYSB2YXJpYW50IG9mIFJldmVyc2kgYW5kIFRpYyBUYWMgVG9lLiBFYWNoIG9uZSBvZiB0aGUgdHdvIHBsYXllcnMgc2V0cyBhIHBhd24gb24gYW4gZW1wdHkgY2VsbCBvZiB0aGUgYm9hcmQuCi08aDM+UGF3bnM8L2gzPgotPHVsPgotPGxpIGNsYXNzPSJ3aGl0ZSI+UGxheWVyIDE8L2xpPgotPGxpIGNsYXNzPSJibGFjayI+UGxheWVyIDI8L2xpPgotPGxpIGNsYXNzPSJ3YWxsIj5XYWxsLiBDYW5ub3QgYmUgcmV2ZXJzZWQuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJ0aGVtZSI+Ci1EaWZmZXJlbnQgdGhlbWVzIGFyZSBzdXBwb3J0ZWQuIFRoZW1lIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIENhc2NhZGluZyBTdHlsZSBTaGVldCAoQ1NTKSB0aGF0IGRldGVybWluZXMgaG93IHRoZSBIVE1MIGNvbnRlbnQgaXMgcmVuZGVyZWQgYnkgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4KLTx1bCBjbGFzcz0idGhlbWUiPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMSI+VGhlbWUgMTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMiI+VGhlbWUgMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMyI+VGhlbWUgMzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzNCI+VGhlbWUgNDwvYT48L2xpPgotPC91bD4KLQotPC9kaXY+Ci08aDI+SG93IHRvIHdpbjwvaDI+Ci1UaGUgZ2FtZSBlbmRzIHdoZW4gYWxsIGNlbGxzIGFyZSBmaWxsZWQuIFRoZSB3aW5uZXIgaXMgdGhlIG9uZSB3aXRoIG1vc3QgcGF3bnMgb2YgdGhlaXIgY29sb3VyLiAKLQotPGgyPkphdmEgYW5kIEhUTUwgaW50ZWdyYXRlZCB0aHJvdWdoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQ8L2gyPgotPHA+Ci1SZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIENvbXB1dGVyIG1vdmVzIGFyZSBwcm9ncmFtbWVkIGluIHJlZ3VsYXIKLUphdmEgY29kZSBpbiB0aGUgRWNsaXBzZSBwbHVnLWluLiBUaGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGlzIHVzZWQgZm9yIHJlbmRlcmluZyBhbmQgcmVhY3RpbmcKLXRvIHVzZXIgaW5wdXQuCi08L3A+Ci08aDM+SW1wbGVtZW50YXRpb248L2gzPgotPHA+Ci1UaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzCi1wcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4KLTxicj5UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotPGJyPlBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjwvY29kZT4uCi1lLmcgdGhlIHBsYXllciBjbGlja3Mgb24gYSBjZWxsIHRoYXQgbWF5IGdlbmVyYXRlIGEgaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotPGNvZGU+aHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTI8L2NvZGU+LiBUaGF0IGh5cGVybGluayBpZGVudGlmaWVzCi10aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllciAoY29sdW1uIDEsIHJvdyAyKS4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcKLW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIDxjb2RlPkJyb3dzZXIuc2V0VGV4dDwvY29kZT4gdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2hpdGVfY2hpcC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3doaXRlX2NoaXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZkNjU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2hpdGVfY2hpcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL0JhY2s2NDB4NDQwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvQmFjazY0MHg0NDAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzODIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvQmFjazY0MHg0NDAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9ibGFja19wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvYmxhY2tfcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWE0MWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9ibGFja19wYXduLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvbGluZTEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9saW5lMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTBmMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9saW5lMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3N0eWxlLmNzcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRmMDRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotYm9keSB7YmFja2dyb3VuZDogdXJsKC4vQmFjazY0MHg0NDAuZ2lmKSBmaXhlZDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMSB7dGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMiB7YmFja2dyb3VuZDogdXJsKC4vbGluZTEuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgzIHtmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLQ0KLXVsIHtsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46MDsgZm9udDogMTJwdCBUaW1lczt9DQotbGkud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2tfcGF3bi5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfcGF3bi5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLQ0KLS5ib2FyZCB7dGV4dC1hbGlnbjogbGVmdDt9DQotdGFibGUgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46IDA7IHBhZGRpbmc6MDsgYmFja2dyb3VuZDogdXJsKC4vdGV4dHVyZV9jZWxscy5naWYpfQ0KLXRyIHt9DQotdGQge2hlaWdodDo0OHB4OyB3aWR0aDo0OHB4OyB0YWJsZS1sYXlvdXQ6IGZpeGVkO30NCi0NCi0ud2hpdGVsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5lbXB0eSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0NCi0ud2hpdGVsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9wYXduLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2tfcGF3bi5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGVfcGF3bi5naWYpIG5vLXJlcGVhdDt9DQotLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19wYXduLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9wYXduLmdpZikgbm8tcmVwZWF0O30NCi0NCi0ucGxheWVyd2hpdGUge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9wYXduLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0ucGxheWVyYmxhY2sge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAzMDBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2tfcGF3bi5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotDQotLndpbm5lciB7Ym9yZGVyOiA0cHggc29saWQgd2hpdGU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3RleHR1cmVfY2VsbHMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy90ZXh0dXJlX2NlbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZWU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3RleHR1cmVfY2VsbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93YWxsX3Bhd24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93YWxsX3Bhd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVjZDUwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2FsbF9wYXduLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2VsY29tZS5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93ZWxjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTkyYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93ZWxjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TdGFydCBhIGdhbWU8L3RpdGxlPgotCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGUuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxPlBhd25zIEdhbWU8L2gxPgotPGRpdiBjbGFzcz0ic3RhcnQiPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MXBsYXllciI+MSBwbGF5ZXI8L2E+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQycGxheWVycyI+MiBwbGF5ZXJzPC9hPgotPC9kaXY+Ci08aDI+SG93IHRvIHBsYXk8L2gyPgotVGhpcyBib2FyZCBnYW1lIGlzIGEgdmFyaWFudCBvZiBSZXZlcnNpIGFuZCBUaWMgVGFjIFRvZS4gRWFjaCBvbmUgb2YgdGhlIHR3byBwbGF5ZXJzIHNldHMgYSBwYXduIG9uIGFuIGVtcHR5IGNlbGwgb2YgdGhlIGJvYXJkLgotPGgzPlBhd25zPC9oMz4KLTx1bD4KLTxsaSBjbGFzcz0id2hpdGUiPlBsYXllciAxPC9saT4KLTxsaSBjbGFzcz0iYmxhY2siPlBsYXllciAyPC9saT4KLTxsaSBjbGFzcz0id2FsbCI+V2FsbC4gQ2Fubm90IGJlIHJldmVyc2VkLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0idGhlbWUiPgotRGlmZmVyZW50IHRoZW1lcyBhcmUgc3VwcG9ydGVkLiBUaGVtZSBpcyBjb25maWd1cmVkIHRocm91Z2ggYSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgKENTUykgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgSFRNTCBjb250ZW50IGlzIHJlbmRlcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuCi08dWwgY2xhc3M9InRoZW1lIj4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczEiPlRoZW1lIDE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczIiPlRoZW1lIDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczMiPlRoZW1lIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczQiPlRoZW1lIDQ8L2E+PC9saT4KLTwvdWw+Ci0KLTwvZGl2PgotPGgyPkhvdyB0byB3aW48L2gyPgotVGhlIGdhbWUgZW5kcyB3aGVuIGFsbCBjZWxscyBhcmUgZmlsbGVkLiBUaGUgd2lubmVyIGlzIHRoZSBvbmUgd2l0aCBtb3N0IHBhd25zIG9mIHRoZWlyIGNvbG91ci4gCi0KLTxoMj5KYXZhIGFuZCBIVE1MIGludGVncmF0ZWQgdGhyb3VnaCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0PC9oMj4KLTxwPgotUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBDb21wdXRlciBtb3ZlcyBhcmUgcHJvZ3JhbW1lZCBpbiByZWd1bGFyCi1KYXZhIGNvZGUgaW4gdGhlIEVjbGlwc2UgcGx1Zy1pbi4gVGhlIFNXVCBCcm93c2VyIHdpZGdldCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYW5kIHJlYWN0aW5nCi10byB1c2VyIGlucHV0LgotPC9wPgotPGgzPkltcGxlbWVudGF0aW9uPC9oMz4KLTxwPgotVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi08YnI+VGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLTxicj5QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLTxjb2RlPmh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyPC9jb2RlPi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIgKGNvbHVtbiAxLCByb3cgMikuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3doaXRlX3Bhd24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93aGl0ZV9wYXduLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNWU1My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3doaXRlX3Bhd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9CYWNrNjQweDQ0MC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L0JhY2s2NDB4NDQwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzgyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L0JhY2s2NDB4NDQwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvYmx1ZV9wZW9wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9ibHVlX3Blb3BsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTBjNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9ibHVlX3Blb3BsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2dvbGRfcGVvcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvZ29sZF9wZW9wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDUwOTBhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvZ29sZF9wZW9wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9saW5lMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2xpbmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMGYzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2xpbmUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvc3R5bGUuY3NzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWIwOTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1ib2R5IHtiYWNrZ3JvdW5kOiB1cmwoLi9CYWNrNjQweDQ0MC5naWYpIGZpeGVkOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgxIHt0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgyIHtiYWNrZ3JvdW5kOiB1cmwoLi9saW5lMS5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDMge2ZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotDQotdWwge2xpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjowOyBmb250OiAxMnB0IFRpbWVzO30NCi1saS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vZ29sZF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX3Blb3BsZS5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLQ0KLS5ib2FyZCB7dGV4dC1hbGlnbjogbGVmdDt9DQotdGFibGUgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46IDA7IHBhZGRpbmc6MDsgYmFja2dyb3VuZDogdXJsKC4vdGV4dHVyZV9jZWxscy5naWYpfQ0KLXRyIHt9DQotdGQge2hlaWdodDo0OHB4OyB3aWR0aDo0OHB4OyB0YWJsZS1sYXlvdXQ6IGZpeGVkO30NCi0NCi0ud2hpdGVsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5lbXB0eSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0NCi0ud2hpdGVsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibHVlX3Blb3BsZS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2dvbGRfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibHVlX3Blb3BsZS5naWYpIG5vLXJlcGVhdDt9DQotLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9nb2xkX3Blb3BsZS5naWYpIG5vLXJlcGVhdDt9DQotLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfcGVvcGxlLmdpZikgbm8tcmVwZWF0O30NCi0NCi0ucGxheWVyd2hpdGUge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibHVlX3Blb3BsZS5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotLnBsYXllcmJsYWNrIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMzAwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL2dvbGRfcGVvcGxlLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0NCi0ud2lubmVyIHtib3JkZXI6IDRweCBzb2xpZCB3aGl0ZTsgZm9udDogYm9sZCAxNnB0IFRpbWVzLCBzZXJpZjt9DQotLmxvc2VyIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgZm9udDogMTJwdCBUaW1lcywgc2VyaWY7fQ0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvdGV4dHVyZV9jZWxscy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3RleHR1cmVfY2VsbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2ZlZTlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvdGV4dHVyZV9jZWxscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dhbGxfcGVvcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2FsbF9wZW9wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE2YzgxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2FsbF9wZW9wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93ZWxjb21lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dlbGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOTJhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dlbGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlN0YXJ0IGEgZ2FtZTwvdGl0bGU+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0JPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZS5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+UGF3bnMgR2FtZTwvaDE+Ci08ZGl2IGNsYXNzPSJzdGFydCI+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQxcGxheWVyIj4xIHBsYXllcjwvYT4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDJwbGF5ZXJzIj4yIHBsYXllcnM8L2E+Ci08L2Rpdj4KLTxoMj5Ib3cgdG8gcGxheTwvaDI+Ci1UaGlzIGJvYXJkIGdhbWUgaXMgYSB2YXJpYW50IG9mIFJldmVyc2kgYW5kIFRpYyBUYWMgVG9lLiBFYWNoIG9uZSBvZiB0aGUgdHdvIHBsYXllcnMgc2V0cyBhIHBhd24gb24gYW4gZW1wdHkgY2VsbCBvZiB0aGUgYm9hcmQuCi08aDM+UGF3bnM8L2gzPgotPHVsPgotPGxpIGNsYXNzPSJ3aGl0ZSI+UGxheWVyIDE8L2xpPgotPGxpIGNsYXNzPSJibGFjayI+UGxheWVyIDI8L2xpPgotPGxpIGNsYXNzPSJ3YWxsIj5XYWxsLiBDYW5ub3QgYmUgcmV2ZXJzZWQuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJ0aGVtZSI+Ci1EaWZmZXJlbnQgdGhlbWVzIGFyZSBzdXBwb3J0ZWQuIFRoZW1lIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIENhc2NhZGluZyBTdHlsZSBTaGVldCAoQ1NTKSB0aGF0IGRldGVybWluZXMgaG93IHRoZSBIVE1MIGNvbnRlbnQgaXMgcmVuZGVyZWQgYnkgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4KLTx1bCBjbGFzcz0idGhlbWUiPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMSI+VGhlbWUgMTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMiI+VGhlbWUgMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMyI+VGhlbWUgMzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzNCI+VGhlbWUgNDwvYT48L2xpPgotPC91bD4KLQotPC9kaXY+Ci08aDI+SG93IHRvIHdpbjwvaDI+Ci1UaGUgZ2FtZSBlbmRzIHdoZW4gYWxsIGNlbGxzIGFyZSBmaWxsZWQuIFRoZSB3aW5uZXIgaXMgdGhlIG9uZSB3aXRoIG1vc3QgcGF3bnMgb2YgdGhlaXIgY29sb3VyLiAKLQotPGgyPkphdmEgYW5kIEhUTUwgaW50ZWdyYXRlZCB0aHJvdWdoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQ8L2gyPgotPHA+Ci1SZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIENvbXB1dGVyIG1vdmVzIGFyZSBwcm9ncmFtbWVkIGluIHJlZ3VsYXIKLUphdmEgY29kZSBpbiB0aGUgRWNsaXBzZSBwbHVnLWluLiBUaGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGlzIHVzZWQgZm9yIHJlbmRlcmluZyBhbmQgcmVhY3RpbmcKLXRvIHVzZXIgaW5wdXQuCi08L3A+Ci08aDM+SW1wbGVtZW50YXRpb248L2gzPgotPHA+Ci1UaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzCi1wcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4KLTxicj5UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotPGJyPlBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjwvY29kZT4uCi1lLmcgdGhlIHBsYXllciBjbGlja3Mgb24gYSBjZWxsIHRoYXQgbWF5IGdlbmVyYXRlIGEgaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotPGNvZGU+aHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTI8L2NvZGU+LiBUaGF0IGh5cGVybGluayBpZGVudGlmaWVzCi10aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllciAoY29sdW1uIDEsIHJvdyAyKS4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcKLW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIDxjb2RlPkJyb3dzZXIuc2V0VGV4dDwvY29kZT4gdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2RvYy1odG1sL3N3dF9icm93c2VyX2RlbW9zX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9kZW1vc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjk3NWIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2RvYy1odG1sL3N3dF9icm93c2VyX2RlbW9zX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQnJvd3NlciBEZW1vczwvaDI+Ci0KLTxwPgotVGhlIEJyb3dzZXIgRGVtb3MgZGVtb25zdHJhdGUgdmFyaW91cyBmZWF0dXJlcyBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LiAKLTwvcD48cD5UaGUgUGF3bnMgR2FtZSBpcyBhIGJvYXJkIGdhbWUgdGhhdCBjYW4gYmUgcGxheWVkIGFnYWluc3QgdGhlIGNvbXB1dGVyCi1vciBhZ2FpbnN0IGFub3RoZXIgcGxheWVyLiBSZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIFRoZQotYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzCi1wcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4KLVRoZSBBUEkgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiBkcmF3cwotdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuCi1QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhbiBoeXBlcmxpbmsgd2l0aCBhIFVSTCBzaW1pbGFyIHRvCi1odHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5Mi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1ZpZXc8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkJyb3dzZXIgRGVtbzwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9pY29ucy9wYXduLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMWY4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9pY29ucy9wYXduLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTBmZWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVEJyb3dzZXJEZW1vcy5uYW1lID0gU1dUIEJyb3dzZXIgRGVtb3MgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkJyb3dzZXJEZW1vcy5uYW1lID0gQnJvd3NlciBEZW1vCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uQnJvd3NlckRlbW9zLm5hbWUgPSBCcm93c2VyIERlbW8KLWxhdW5jaGl0ZW0uQnJvd3NlckRlbW9zLmRlc2NyaXB0aW9uID0gXAotCVRoZSBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgdGhlIFNXVCBCcm93c2VyIHdpZGdldCBmb3IgSFRNTCByZW5kZXJpbmcuXG5cblwKLQlUaGUgUGF3bnMgR2FtZSBpcyBhIGJvYXJkIGdhbWUgdGhhdCBjYW4gYmUgcGxheWVkIGFnYWluc3QgdGhlIGNvbXB1dGVyIG9yIGFnYWluc3QgYW5vdGhlciBwbGF5ZXIuXG5cblwKLQlSZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIFRoZSBib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMgXAotCXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLiBcblwKLQlUaGUgQVBJIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKSBkcmF3cyB0aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS5cblwKLQlQbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIuIGUuZyB0aGUgcGxheWVyIGNsaWNrcyBcCi0Jb24gYSBjZWxsIHRoYXQgZGVmaW5lcyBhbiBoeXBlcmxpbmsgd2l0aCBhIFVSTCBodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5Mi5cCi0JVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllci4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcgXAotCW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIEJyb3dzZXIuc2V0VGV4dCB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxZWUyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQnJvd3NlckRlbW9zLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW9QbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IkJyb3dzZXJEZW1vLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5Ccm93c2VyRGVtb3MubmFtZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtbyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzLkJyb3dzZXJEZW1vVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL3Bhd24uZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IkJyb3dzZXIgRGVtbyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQnJvd3NlckRlbW9zLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQnJvd3NlckRlbW9zLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZGVtb3Mudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzLkJyb3dzZXJEZW1vVmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvQnJvd3NlckRlbW9QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzZGJkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvQnJvd3NlckRlbW9QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlckRlbW9QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBzdGF0aWMgQnJvd3NlckRlbW9QbHVnaW4gcGx1Z2luOwotCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMVUdJTl9QQVRIID0gbnVsbDsKLQkKLQlwdWJsaWMgQnJvd3NlckRlbW9QbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW9QbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlQTFVHSU5fUEFUSCA9IFBsYXRmb3JtLnJlc29sdmUocGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIuIikpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnJvd3NlckRlbW9QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEJyb3dzZXJEZW1vUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL1Bhd25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMmVmNzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL1Bhd25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zOwotCi1wdWJsaWMgY2xhc3MgUGF3bnMgewotCi0JLyogQ3VycmVudCBib2FyZCByZXByZXNlbnRhdGlvbiBpbiBjb21wYWN0ZWQgZm9ybSAqLwotCWJ5dGVbXSBnYW1lID0gbmV3IGJ5dGVbNjRdOwotCS8qIEJlc3QgbW92ZSAqLwotCWludCBiZXN0SW5kZXggPSAtMTsKLQkvKiBSZWxhdGVkIGJlc3Qgc2NvcmUgKi8KLQlpbnQgYmVzdFNjb3JlID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JLyogRXN0aW1hdGVkIHN0cmF0ZWdpYyB2YWx1ZSBvZiBlYWNoIGNlbGwgYmFzZWQgb24gcHJveGltaXR5IHRvIHdhbGxzICovCi0Jc3RhdGljIGludFtdIGdhbWVXYWxsV2VpZ2h0ID0gbmV3IGludFs2NF07Ci0JVGhyZWFkIHRocmVhZCA9IG51bGw7Ci0JYm9vbGVhbiB0aHJlYWRTdG9wID0gZmFsc2U7Ci0JCi0JZmluYWwgc3RhdGljIGJ5dGUgRU1QVFkgPSAwOwotCWZpbmFsIHN0YXRpYyBieXRlIFdISVRFID0gMTsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBCTEFDSyA9IDI7Ci0JZmluYWwgc3RhdGljIGJ5dGUgV0FMTCA9IDM7Ci0JCi1wdWJsaWMgUGF3bnMoKSB7Ci19Ci0KLS8qIFByb3ZpZGUgdGhlIGN1cnJlbnQgZ2FtZSBhbmQgaWduaXRpYXRlIHRoZSBzZWFyY2ggb2YgdGhlIGJlc3QgbW92ZSBmb3IgdGhlIGdpdmVuIHR5cGUKLSAqIE11c3QgcmV0dXJuIGltbWVkaWF0ZWx5IGFzIGl0IHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KLSAqIFRoZSBVSSB0aHJlYWQgd2lsbCBmZXRjaCB0aGUgYmVzdCBtb3ZlIGFueSB0aW1lIHRoZXJlYWZ0ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHBsYXlSZXF1ZXN0KGJ5dGVbXVtdIGdhbWUsIGludCB0eXBlKSB7Ci0JdGhyZWFkU3RvcCA9IHRydWU7Ci0Jc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCWJlc3RJbmRleCA9IC0xOwotCQliZXN0U2NvcmUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQkJY29udmVydChnYW1lLCB0aGlzLmdhbWUpOwotCQlpbml0UGF3bkJvcmRlcnModGhpcy5nYW1lLCBnYW1lV2FsbFdlaWdodCk7Ci0JCS8qIFF1aWNrbHkgY29tcHV0ZSBhIGxlZ2FsIG1vdmUgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmdhbWUubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0aGlzLmdhbWVbaV0gPT0gRU1QVFkpIHsKLQkJCQliZXN0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3luY2hyb25pemVkKFBhd25zLnRoaXMpIHsKLQkJCQkJdGhyZWFkU3RvcCA9IGZhbHNlOwotCQkJCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50WzJdOwotCQkJCQkvKiBpZiBsb25nIHRpbWUsIG11c3QgY2hlY2sgZm9yIHRocmVhZFN0b3AgYW5kIGV4aXQgZWFybHkgKi8gCi0JCQkJCWV2YWxCZXN0KFBhd25zLnRoaXMuZ2FtZSwgQkxBQ0ssIDIsIHJlc3VsdCk7Ci0JCQkJCWJlc3RJbmRleCA9IHJlc3VsdFswXTsKLQkJCQkJYmVzdFNjb3JlID0gcmVzdWx0WzFdOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCX0KLX0KLQotLyogRmV0Y2ggYmVzdCBtb3ZlIGluIG5hdHVyYWwgY29vcmRpbmF0ZXMgZm9yIHRoZSBib2FyZCBwcmV2aW91c2x5IGdpdmVuIGluCi0gKiB0aGUgY2FsbCB0byBwbGF5UmVxdWVzdC4KLSAqLwotcHVibGljIHZvaWQgZ2V0QmVzdE1vdmUoaW50W10gcG9pbnQpIHsKLQljb252ZXJ0KGJlc3RJbmRleCwgcG9pbnQpOwotCXRocmVhZFN0b3AgPSB0cnVlOwotfQotCi0vKiBHaXZlbiBhbiBleHBhbmRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYm9hcmQsIGZvcm1hdCBpbnRlcm5hbCBjb21wYWN0IG1vZGUgKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnQoYnl0ZVtdW10gYm9hcmQsIGJ5dGVbXSBnKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBib2FyZC5sZW5ndGg7IGkrKykgU3lzdGVtLmFycmF5Y29weShib2FyZFtpXSwgMCwgZywgaSAqIDgsIDgpOwotfQotLyogVXBkYXRlIGdpdmVuIGNvbXBhY3QgbW9kZWwgYmFzZWQgb24gcGxheWVyIG1vdmUgaW4gbmF0dXJhbCBjb29yZGluYXRlcyAqLwotc3RhdGljIHZvaWQgc2V0KGJ5dGVbXSBnLCBpbnQgeCwgaW50IHksIGJ5dGUgdHlwZSkgewotCWdbeCo4K3ldID0gdHlwZTsKLX0KLS8qIEdpdmVuIGFuIGluZGV4IGluIGNvbXBhY3QgcmVwcmVzZW50YXRpb24sIHJldHVybiBuYXR1cmFsIGNvb3JkaW5hdGVzICovCi1zdGF0aWMgdm9pZCBjb252ZXJ0KGludCBpbmRleCwgLypvdXQgWzBdIHggWzFdIHkgKi9pbnRbXSBwb2ludCkgewotCXBvaW50WzBdID0gaW5kZXggLyA4OwotCXBvaW50WzFdID0gaW5kZXggJSA4OwotfQotLyogR2l2ZW4gYW4gaW5kZXggaW50byB0aGUgY29tcGFjdCBtb2RlbCBhbmQgdGhlIG5laWdoYm91ciBjb2RlLAotICogcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZyBuZWlnaGJvdXIgaW5kZXguCi0gKiBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIG5laWdoYm91ci4KLSAqIAotICogTmVpZ2hib3VyIGNvZGUgZm9yIHRoZSBpbmRleCBYCi0gKiAwIDEgMgotICogMyBYIDQKLSAqIDUgNiA3IAotICovCi1zdGF0aWMgaW50IGdldE5laWdoYm91ckluZGV4KGJ5dGVbXSBnLCBpbnQgaW5kZXgsIGludCBuZWlnaGJvdXIpIHsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGcubGVuZ3RoKSByZXR1cm4gLTE7Ci0JaW50IHJlc3VsdCA9IC0xOwotCXN3aXRjaCAobmVpZ2hib3VyKSB7Ci0JCWNhc2UgMDogcmVzdWx0ID0gaW5kZXggPCA4IHx8IGluZGV4ICUgOCA9PSAwID8gLTEgOiBpbmRleCAtIDk7IGJyZWFrOwotCQljYXNlIDE6IHJlc3VsdCA9IGluZGV4IDwgOCA/IC0xIDogaW5kZXggLSA4OyBicmVhazsKLQkJY2FzZSAyOiByZXN1bHQgPSBpbmRleCA8IDggfHwgaW5kZXggJSA4ID09IDcgPyAtMSA6IGluZGV4IC0gNzsgYnJlYWs7Ci0JCWNhc2UgMzogcmVzdWx0ID0gaW5kZXggJSA4ID09IDAgPyAtMSA6IGluZGV4IC0gMTsgYnJlYWs7Ci0JCWNhc2UgNDogcmVzdWx0ID0gaW5kZXggJSA4ID09IDcgPyAtMSA6IGluZGV4ICsgMTsgYnJlYWs7Ci0JCWNhc2UgNTogcmVzdWx0ID0gaW5kZXggJSA4ID09IDAgfHwgaW5kZXggPj0gNTYgPyAtMSA6IGluZGV4ICsgNzsgYnJlYWs7Ci0JCWNhc2UgNjogcmVzdWx0ID0gaW5kZXggPj0gNTYgPyAtMSA6IGluZGV4ICsgODsgYnJlYWs7Ci0JCWNhc2UgNzogcmVzdWx0ID0gaW5kZXggJSA4ID09IDcgfHwgaW5kZXggPj0gNTYgPyAtMSA6IGluZGV4ICsgOTsgYnJlYWs7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiBNYWtlIHRoZSBwbGF5ZXIgdHlwZSBwbGF5IGF0IGluZGV4IG9uIGdpdmVuIGNvbXBhY3QgYm9hcmQgCi0gKiBDb21wdXRlIGFsbCBwYXducyB0aGF0IG11c3QgYmUgcmV2ZXJzZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHBsYXkoYnl0ZVtdIGcsIGludCBpbmRleCwgYnl0ZSB0eXBlKSB7Ci0JYnl0ZSBvcHBvbmVudFR5cGUgPSB0eXBlID09IFdISVRFID8gQkxBQ0sgOiBXSElURTsKLQlmb3IgKGludCBuZWlnaGJvdXIgPSAwOyBuZWlnaGJvdXIgPD0gNzsgbmVpZ2hib3VyKyspIHsKLQkJaW50IG5JbmRleCA9IGdldE5laWdoYm91ckluZGV4KGcsIGluZGV4LCBuZWlnaGJvdXIpOwotCQlpbnRbXSByZXZlcnNpSW5kZWNlcyA9IG5ldyBpbnRbNl07Ci0JCWludCBuUmV2ZXJzaSA9IDA7Ci0JCXdoaWxlIChuSW5kZXggIT0gLTEgJiYgblJldmVyc2kgPCA2ICYmIGdbbkluZGV4XSA9PSBvcHBvbmVudFR5cGUpIHsKLQkJCXJldmVyc2lJbmRlY2VzW25SZXZlcnNpXSA9IG5JbmRleDsKLQkJCW5SZXZlcnNpKys7Ci0JCQluSW5kZXggPSBnZXROZWlnaGJvdXJJbmRleChnLCBuSW5kZXgsIG5laWdoYm91cik7CQkJCi0JCX0KLQkJaWYgKG5SZXZlcnNpID4gMCAmJiBuSW5kZXggIT0gLTEgJiYgZ1tuSW5kZXhdID09IHR5cGUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblJldmVyc2k7IGkrKykgZ1tyZXZlcnNpSW5kZWNlc1tpXV0gPSB0eXBlOwotCQl9Ci0JfQotCWdbaW5kZXhdID0gdHlwZTsKLX0KLS8qIEV2YWx1YXRlIHRoZSBnaXZlbiBjb21wYWN0IG1vZGVsIGJhc2VkIG9uIHBhd25zIGRpc3RyaWJ1dGlvbiAKLSAqIEhpZ2ggbWVhbnMgd2hpdGUgaGFzIGFkdmFudGFnZS4gQmVsb3cgemVybyBtZWFucyBibGFjayBoYXMgYWR2YW50YWdlLgotICovCi1zdGF0aWMgaW50IGV2YWwoYnl0ZVtdIGcpIHsKLQlpbnQgY250V2hpdGUgPSAwLCBjbnRCbGFjayA9IDAsIGNudEVtcHR5ID0gMDsKLQlpbnQgY250V2hpdGVXYWxsQWR2YW50YWdlID0gMCwgY250QmxhY2tXYWxsQWR2YW50YWdlID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaWYgKGdbaV0gPT0gV0hJVEUpIHsKLQkJCWNudFdoaXRlKys7Ci0JCQljbnRXaGl0ZVdhbGxBZHZhbnRhZ2UgKz0gZ2FtZVdhbGxXZWlnaHRbaV07Ci0JCX0KLQkJZWxzZSBpZiAoZ1tpXSA9PSBCTEFDSykgewotCQkJY250QmxhY2srKzsKLQkJCWNudEJsYWNrV2FsbEFkdmFudGFnZSArPSBnYW1lV2FsbFdlaWdodFtpXTsKLQkJfQotCQllbHNlIGlmIChnW2ldID09IEVNUFRZKSBjbnRFbXB0eSsrOwotCX0KLQlpZiAoY250RW1wdHkgPT0gMCkgewotCQlpZiAoY250V2hpdGUgPiBjbnRCbGFjaykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOyAvKiBXaGl0ZSB3aW5zICovCi0JCWlmIChjbnRXaGl0ZSA8IGNudEJsYWNrKSByZXR1cm4gSW50ZWdlci5NSU5fVkFMVUU7IC8qIEJsYWNrIHdpbnMgKi8KLQkJcmV0dXJuIDA7IC8qIFN0YWxlbWF0ZSAqLwotCX0KLQlyZXR1cm4gY250V2hpdGUgKyBjbnRXaGl0ZVdhbGxBZHZhbnRhZ2UgLSBjbnRCbGFjayAtIGNudEJsYWNrV2FsbEFkdmFudGFnZTsKLX0KLQotLyogUmVjb2duaXplIHBhd25zIHByb3RlY3RlZCBieSB3YWxscyBvciBib3JkZXJzIAotICogVEJEIC0gbm90ZSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIGZvciBlYWNoIGNlbGwgYW5kIHN0b3JlZAotICogaW4gYSBzZXBhcmF0ZSBieXRlW10gZ1dhbGxHYWluCi0gKiAqLwotc3RhdGljIHZvaWQgaW5pdFBhd25Cb3JkZXJzKGJ5dGVbXSBnLCBpbnRbXSBnYW1lV2FsbFdlaWdodCkgewotCS8qIEEgcGF3biBoYXMgOCBuZWlnaGJvdXJzIG9uIDQgYXhlcy4KLQkgKiBTdHJhdGVnaWMgcGF3bnMgaGF2ZSBvbmUgc2lkZSBvZiBlYWNoIGF4aXMgcHJvdGVjdGVkIGJ5IGEgd2FsbCBhbmQgdGhlIG90aGVyCi0JICogc2lkZSBub3QgY2xvc2VkIGJ5IGEgd2FsbC4KLQkgKiBBIHBhd24gY2Fubm90IGJlIHJldmVyc2VkIHdoZW4gZWFjaCBvZiBpdHMgNCBheGVzIGFyZSBwcm90ZWN0ZWQgYnkgYSB3YWxsIG9uCi0JICogb25lIHNpZGUuIFBhd25zIHRoYXQgaGF2ZSBtb3JlIHRoYW4gNCB3YWxscyBhcmUgbGVzcyBpbnRlcmVzdGluZyBzaW5jZSB0aGV5Ci0JICogYXJlIG5vdCBvcGVuIGVub3VnaCB0byB0aGUgYm9hcmQuCi0JICogCi0JICogTmJyIHdhbGxzLCBuYnIgYXhpcyBjb3ZlcmVkLCBlc3RpbWF0ZWQgdmFsdWUKLQkgKiAwIG4vYSAwCi0JICogMSAxIDIKLQkgKiAyIDEgMQotCSAqIDIgMiA2Ci0JICogMyAyIDQKLQkgKiA0IDIgMgotCSAqIDMgMyA5Ci0JICogNCAzIDgKLQkgKiA0IDQgMTYKLQkgKiA1IDQgMTQKLQkgKiA2IDQgOQotCSAqIDcgNCA2Ci0JICogOCA0IDAKLQkgKi8KLQlpbnRbXSBuVHlwZXMgPSBuZXcgaW50WzhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlpbnQgbldhbGxzID0gMDsKLQkJaW50IG5BeGlzID0gMDsKLQkJZm9yIChpbnQgbiA9IDA7IG4gPCA4OyBuKyspIHsKLQkJCWludCBuSW5kZXggPSBnZXROZWlnaGJvdXJJbmRleChnLCBpLCBuKTsKLQkJCW5UeXBlc1tuXSA9IG5JbmRleCAhPSAtMSA/IGdbbkluZGV4XSA6IFdBTEw7Ci0JCQlpZiAoblR5cGVzW25dID09IFdBTEwpIG5XYWxscysrOwotCQl9Ci0JCWludCBzY29yZSA9IG5XYWxsczsKLQkJaWYgKG5XYWxscyA+IDApIHsKLQkJCWlmIChuVHlwZXNbMF0gPT0gV0FMTCB8fCBuVHlwZXNbN10gPT0gV0FMTCkgbkF4aXMrKzsKLQkJCWlmIChuVHlwZXNbMV0gPT0gV0FMTCB8fCBuVHlwZXNbNl0gPT0gV0FMTCkgbkF4aXMrKzsKLQkJCWlmIChuVHlwZXNbMl0gPT0gV0FMTCB8fCBuVHlwZXNbNV0gPT0gV0FMTCkgbkF4aXMrKzsKLQkJCWlmIChuVHlwZXNbNF0gPT0gV0FMTCB8fCBuVHlwZXNbM10gPT0gV0FMTCkgbkF4aXMrKzsKLQkJCXN3aXRjaCAobkF4aXMpIHsKLQkJCQljYXNlIDQ6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgNDogc2NvcmUgPSAxNjsgYnJlYWs7IGNhc2UgNTogc2NvcmUgPSAxNDsgYnJlYWs7IGNhc2UgNjogc2NvcmUgPSA5OyBjYXNlIDc6IHNjb3JlID0gNjsgYnJlYWs7IGNhc2UgODogc2NvcmUgPSAwOyBicmVhazt9IGJyZWFrOwotCQkJCWNhc2UgMzogc3dpdGNoIChuV2FsbHMpIHsgY2FzZSAzOiBzY29yZSA9IDk7IGJyZWFrOyBjYXNlIDQ6IHNjb3JlID0gODt9IGJyZWFrOwotCQkJCWNhc2UgMjogc3dpdGNoIChuV2FsbHMpIHsgY2FzZSAyOiBzY29yZSA9IDY7IGJyZWFrOyBjYXNlIDM6IHNjb3JlID0gNDsgYnJlYWs7IGNhc2UgNDogc2NvcmUgPSAyOyB9IGJyZWFrOwotCQkJCWNhc2UgMTogc3dpdGNoIChuV2FsbHMpIHsgY2FzZSAxOiBzY29yZSA9IDI7IGJyZWFrOyBjYXNlIDI6IHNjb3JlID0gMTsgYnJlYWs7fSBicmVhazsKLQkJCX0KLQkJfQotCQlnYW1lV2FsbFdlaWdodFtpXSA9IHNjb3JlOwotCX0KLX0KLQotLyogRXZhbHVhdGUgdGhlIGJlc3QgbW92ZSBmb3IgcGxheWVyIHR5cGUgZm9yIHRoZSBnaXZlbiBib2FyZCwgZG9pbmcgYSBkZXB0aCAxIHNlYXJjaCAqLwotc3RhdGljIHZvaWQgZXZhbEJlc3QoYnl0ZVtdIGcsIGJ5dGUgdHlwZSwgaW50IGRlcHRoLCAvKiBvdXQgWzBdIGJlc3QgbW92ZSwgWzFdIG1pbmltYXggKi9pbnRbXSByZXN1bHQpIHsKLQlieXRlW10gdG1wID0gbmV3IGJ5dGVbNjRdOwotCWJ5dGUgb3Bwb25lbnRUeXBlID0gdHlwZSA9PSBXSElURSA/IEJMQUNLIDogV0hJVEU7Ci0JcmVzdWx0WzBdID0gLTE7IHJlc3VsdFsxXSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlpZiAoZ1tpXSA9PSBFTVBUWSkgewotCQkJU3lzdGVtLmFycmF5Y29weShnLCAwLCB0bXAsIDAsIDY0KTsKLQkJCXBsYXkodG1wLCBpLCB0eXBlKTsKLQkJCWludCBzY29yZSA9IGV2YWwodG1wKTsKLQkJCWlmIChkZXB0aCA+IDEpIHsKLQkJCQlpbnRbXSB0bXBSZXN1bHQgPSBuZXcgaW50WzJdOwotCQkJCWV2YWxCZXN0KHRtcCwgb3Bwb25lbnRUeXBlLCBkZXB0aCAtIDEsIHRtcFJlc3VsdCk7Ci0JCQkJc2NvcmUgPSB0bXBSZXN1bHRbMV07Ci0JCQl9Ci0JCQlpZiAoKHR5cGUgPT0gV0hJVEUgJiYgc2NvcmUgPiByZXN1bHRbMV0pIHx8ICh0eXBlID09IEJMQUNLICYmIHNjb3JlIDwgcmVzdWx0WzFdKSB8fCByZXN1bHRbMF0gPT0gLTEpIHsKLQkJCQlyZXN1bHRbMF0gPSBpOwotCQkJCXJlc3VsdFsxXSA9IHNjb3JlOwotCQkJfQotCQl9Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0Jyb3dzZXJEZW1vVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0Jyb3dzZXJEZW1vVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTIzNzAxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlckRlbW9WaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUFjdGlvbiBwYXduQWN0aW9uOwotCUFjdGlvbiBlZGl0QWN0aW9uOwotCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JCi0JcHVibGljIEJyb3dzZXJEZW1vVmlldygpIHsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJYnJvd3Nlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSk7Ci0JCQl0ZXh0LnNldFRleHQoIkJyb3dzZXIgd2lkZ2V0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuIFRoZSBleGFjdCBlcnJvciBpczpcclxuIitlKTsKLQkJCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQluZXcgUGF3blRhYihpdGVtKTsKLQkJCi0JCWl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJbmV3IEVkaXRvclRhYihpdGVtKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JfQotCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMTY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGFiIHsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JVGV4dCBodG1sVGV4dCwgc2NyaXB0VGV4dDsKLQlCdXR0b24gaHRtbEJ1dHRvbiwgc2NyaXB0QnV0dG9uOwotCXN0YXRpYyBTdHJpbmcgaHRtbCA9IAotCQkiPGh0bWw+XHJcbiIrCi0JCSIJPGJvZHk+XHJcbiIrCi0JCSIJCTxoMSBpZD0nbXlpZCc+SFRNTCBEb2N1bWVudDwvaDE+XHJcbiIrCi0JCSIJCTxoMj5TZXQgSFRNTCBjb250ZW50PC9oMj5cclxuIisKLQkJIgkJPG9sPlxyXG4iKwotCQkiCQkJPGxpPkVudGVyIGh0bWwgZGF0YSBpbnRvIHRoZSAnc2V0VGV4dCcgcGFuZTwvbGk+XHJcbiIrCi0JCSIJCQk8bGk+Q2xpY2sgb24gJ3NldFRleHQnIHRvIHNldCB0aGUgbmV3IGNvbnRlbnQ8L2xpPlxyXG4iKwotCQkiCQk8L29sPlxyXG4iKwotCQkiCQk8aDI+UXVlcnkgb3IgbW9kaWZ5IEhUTUwgZG9jdW1lbnQ8L2gyPlxyXG4iKwotCQkiCQk8b2w+XHJcbiIrCi0JCSIJCTxsaT5FbnRlciBqYXZhc2NyaXB0IGNvbW1hbmRzIGludG8gdGhlICdleGVjdXRlJyBwYW5lPC9saT5cclxuIisKLQkJIgkJPGxpPkNsaWNrIG9uICdleGVjdXRlJyB0byBydW4gdGhlIGphdmFzY3JpcHQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQ8L2xpPlxyXG4iKwotCQkiCQk8L29sPlxyXG4iKwotCQkiCTwvYm9keT5cclxuIisKLQkJIjwvaHRtbD4iOwotCQotCXN0YXRpYyBTdHJpbmcgc2NyaXB0ID0gCi0JCSJ2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTtcclxuIisKLQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0NvbnRlbnQgaW5zZXJ0ZWQhJyk7XHJcbiIrCi0JCSJub2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChub2RlKTtcclxuXHJcbiIrCi0JCSJkb2N1bWVudC5iZ0NvbG9yID0gJ3llbGxvdyc7IjsKLQkKLQlwdWJsaWMgRWRpdG9yVGFiKFRhYkl0ZW0gaXRlbSkgewotCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShpdGVtLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiRWRpdG9yIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQoZm9ybSk7Ci0JCQotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWZpbmFsIEZvcm1EYXRhIHNhc2hEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOwotCQlzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXNhc2hEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlzYXNoLnNldExheW91dERhdGEoc2FzaERhdGEpOwotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBzYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCQlpbnQgcmlnaHQgPSBwYXJlbnRSZWN0LndpZHRoIC0gcmVjdC53aWR0aCAtIDIwOwotCQkJCWUueCA9IE1hdGgubWF4KE1hdGgubWluKGUueCwgcmlnaHQpLCAyMCk7Ci0JCQkJaWYgKGUueCAhPSByZWN0LngpIHsKLQkJCQkJc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBlLngpOwotCQkJCQlwYXJlbnQubGF5b3V0KCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvKiBJbml0aWFsaXplIFBhbmVsICovCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJR3JvdXAgaHRtbEdyb3VwID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWh0bWxHcm91cC5zZXRUZXh0KCJzZXRUZXh0Iik7Ci0JCWh0bWxUZXh0ID0gbmV3IFRleHQoaHRtbEdyb3VwLCBTV1QuTVVMVEkpOwotCQlodG1sQnV0dG9uID0gbmV3IEJ1dHRvbihodG1sR3JvdXAsIFNXVC5QVVNIKTsKLQkJaHRtbEJ1dHRvbi5zZXRUZXh0KCJzZXRUZXh0Iik7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWh0bWxHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWh0bWxUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlodG1sQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlodG1sR3JvdXAubGF5b3V0KCk7Ci0JCQotCQlHcm91cCBzY3JpcHRHcm91cCA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5PTkUpOwotCQlzY3JpcHRHcm91cC5zZXRUZXh0KCJleGVjdXRlIik7Ci0JCXNjcmlwdFRleHQgPSBuZXcgVGV4dChzY3JpcHRHcm91cCwgU1dULk1VTFRJKTsKLQkJc2NyaXB0QnV0dG9uID0gbmV3IEJ1dHRvbihzY3JpcHRHcm91cCwgU1dULlBVU0gpOwotCQlzY3JpcHRCdXR0b24uc2V0VGV4dCgiZXhlY3V0ZSIpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJc2NyaXB0R3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzY3JpcHRUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlzY3JpcHRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNjcmlwdEdyb3VwLmxheW91dCgpOwotCQkKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlodG1sVGV4dC5zZXRUZXh0KGh0bWwpOwotCQlzY3JpcHRUZXh0LnNldFRleHQoc2NyaXB0KTsKLQkJcGFyZW50LmxheW91dCgpOwotCQkKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJV2lkZ2V0IHcgPSBlLndpZGdldDsKLQkJCQlpZiAodyA9PSBodG1sQnV0dG9uKSBicm93c2VyLnNldFRleHQoaHRtbFRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAodyA9PSBzY3JpcHRCdXR0b24pIGJyb3dzZXIuZXhlY3V0ZShzY3JpcHRUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlodG1sQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJc2NyaXB0QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzZjEyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLlBhd25zOwotCi1wdWJsaWMgY2xhc3MgUGF3blRhYiB7Ci0KLQlBY3Rpb24gcGF3bkFjdGlvbjsKLQlBY3Rpb24gZWRpdEFjdGlvbjsKLQkKLQlCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCVJldmVyc2lMaXN0ZW5lciByZXZlcnNpTGlzdGVuZXI7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfV0VMQ09NRSA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBUWVBFX1NUQVJUID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfQk9BUkQgPSAzOwotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9CT0FSRF9PVkVSID0gNDsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMID0gImh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvIjsKLQlzdGF0aWMgU3RyaW5nIFBMVUdJTl9QQVRIID0gQnJvd3NlckRlbW9QbHVnaW4uUExVR0lOX1BBVEg7Ci0Jc3RhdGljIFN0cmluZyBDU1NfRk9MREVSID0gImNzczIiOwotCXN0YXRpYyBTdHJpbmcgVVJMX0NTUyA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi9zdHlsZS5jc3MiOwotCXN0YXRpYyBTdHJpbmcgVVJMX1dFTENPTUUgPVBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi93ZWxjb21lLmh0bWwiOwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fU1RBUlRfMl9QTEFZRVJTID0gImFjdGlvbnN0YXJ0MnBsYXllcnMiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1NUQVJUXzFfUExBWUVSID0gImFjdGlvbnN0YXJ0MXBsYXllciI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fV0hJVEUgPSAiYWN0aW9ud2hpdGUiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX0JMQUNLID0gImFjdGlvbmJsYWNrIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9USEVNRSA9ICJhY3Rpb250aGVtZSI7Ci0KLQlzdGF0aWMgYnl0ZVtdW10gZ2FtZSA9IG51bGw7Ci0Jc3RhdGljIGJvb2xlYW4gaXNXaGl0ZSA9IHRydWU7Ci0Jc3RhdGljIGludCBjbnRXaGl0ZSA9IDAsIGNudEJsYWNrID0gMDsKLQlzdGF0aWMgYm9vbGVhbiBjb21wdXRlciA9IGZhbHNlOwotCXN0YXRpYyBpbnQgY3gsIGN5OwotCWZpbmFsIHN0YXRpYyBieXRlIEVNUFRZID0gMDsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXSElURSA9IDE7Ci0JZmluYWwgc3RhdGljIGJ5dGUgQkxBQ0sgPSAyOwotCWZpbmFsIHN0YXRpYyBieXRlIFdBTEwgPSAzOwotCQotCXN0YXRpYyBQYXducyB0dHIgPSBudWxsOwotCXN0YXRpYyBpbnRbXSBtb3ZlID0gbmV3IGludFsyXTsKLQlzdGF0aWMgTWVudSBtZW51ID0gbnVsbDsKLQkKLQlwdWJsaWMgUGF3blRhYihUYWJJdGVtIGl0ZW0pIHsJCQotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKGl0ZW0uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpdGVtLnNldFRleHQoIlBhd25zIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChicm93c2VyKTsKLQotCQltZW51ID0gbmV3IE1lbnUoYnJvd3Nlci5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJTWVudUl0ZW0gaXRlbTIgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQlpdGVtMi5zZXRUZXh0KCJFbmQgR2FtZSIpOwotCQlpdGVtMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZ2FtZSA9IG51bGw7Ci0JCQkJaXNXaGl0ZSA9IHRydWU7Ci0JCQkJY250V2hpdGUgPSAwOyBjbnRCbGFjayA9IDA7Ci0JCQkJdHRyID0gbnVsbDsKLQkJCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLnNldE1lbnUobWVudSk7Ci0JCQotCQlyZXZlcnNpTGlzdGVuZXIgPSBuZXcgUmV2ZXJzaUxpc3RlbmVyKCk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihyZXZlcnNpTGlzdGVuZXIpOwotCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRIdG1sKGludCB0eXBlKSB7Ci0JCVN0cmluZyBodG1sID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVFlQRV9CT0FSRDoKLQkJY2FzZSBUWVBFX0JPQVJEX09WRVI6IHsKLQkJCWh0bWwgPSAiPGh0bWw+PGhlYWRlcj48bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIiIrVVJMX0NTUysiXCI+PC9oZWFkZXI+PGJvZHk+PGRpdiBjbGFzcz1cImJvYXJkXCI+PHRhYmxlPjx0Ym9keT4iOwotCQkJU3RyaW5nIGNsYXNzUGxheWVyV2hpdGUgPSAicGxheWVyd2hpdGUiLCBjbGFzc1BsYXllckJsYWNrID0gInBsYXllcmJsYWNrIjsKLQkJCWlmICh0eXBlID09IFRZUEVfQk9BUkRfT1ZFUikgewotCQkJCWlmIChjbnRXaGl0ZSA+IGNudEJsYWNrKSB7Ci0JCQkJCWNsYXNzUGxheWVyV2hpdGUgKz0gIiB3aW5uZXIiOwotCQkJCQljbGFzc1BsYXllckJsYWNrICs9ICIgbG9zZXIiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNsYXNzUGxheWVyV2hpdGUgKz0gIiBsb3NlciI7Ci0JCQkJCWNsYXNzUGxheWVyQmxhY2sgKz0gIiB3aW5uZXIiOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB3aGl0ZSA9ICI8dGQgY2xhc3M9XCJ3aGl0ZVwiLz4iOwotCQkJU3RyaW5nIGJsYWNrID0gIjx0ZCBjbGFzcz1cImJsYWNrXCIvPiI7Ci0JCQlTdHJpbmcgd2FsbCA9ICI8dGQgY2xhc3M9XCJ3YWxsXCIvPiI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhbWUubGVuZ3RoOyBpKyspIHsKLQkJCQlodG1sICs9ICI8dHI+IjsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdhbWVbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQkJc3dpdGNoIChnYW1lW2ldW2pdKSB7Ci0JCQkJCQljYXNlIEVNUFRZOiB7Ci0JCQkJCQkJU3RyaW5nIGVtcHR5ID0gIjx0ZCBjbGFzcz1cIiIrKGlzV2hpdGUgPyAid2hpdGVsaW5rIiA6ICJibGFja2xpbmsiKSsiXCI+IisgKGlzV2hpdGUgfHwgKCFpc1doaXRlICYmICFjb21wdXRlcikgPyAiPGEgaHJlZj1cIiIrVVJMKyhpc1doaXRlID8gQUNUSU9OX1dISVRFIDogQUNUSU9OX0JMQUNLKSsiL3h4IitpKyJ5eSIraisiXCIgY2xhc3M9XCJlbXB0eVwiLz4iIDogIjxkaXYgY2xhc3M9XCJlbXB0eVwiLz4iKSsiPC90ZD4iOwotCQkJCQkJCWh0bWwgKz0gZW1wdHk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBXSElURTogaHRtbCArPSB3aGl0ZTsgYnJlYWs7Ci0JCQkJCQljYXNlIEJMQUNLOiBodG1sICs9IGJsYWNrOyBicmVhazsKLQkJCQkJCWNhc2UgV0FMTDogaHRtbCArPSB3YWxsOyBicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlodG1sICs9IjwvdHI+IjsKLQkJCX0KLQkJCWh0bWwgKz0gIjwvdGJvZHk+PC90YWJsZT48L2Rpdj4iOwotCQkJaHRtbCArPSAiPGRpdiBjbGFzcz1cIiIrY2xhc3NQbGF5ZXJXaGl0ZSsiXCI+IitjbnRXaGl0ZSsiPC9kaXY+IjsKLQkJCWh0bWwgKz0gIjxkaXYgY2xhc3M9XCIiK2NsYXNzUGxheWVyQmxhY2srIlwiPiIrY250QmxhY2srIjwvZGl2PiI7Ci0JCQlodG1sICs9ICI8L2JvZHk+PC9odG1sPiI7Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JCXJldHVybiBodG1sOwotCX0KLQotCXB1YmxpYyBjbGFzcyBSZXZlcnNpTGlzdGVuZXIgaW1wbGVtZW50cyBMb2NhdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCXRyeSB7Ci0JCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzFfUExBWUVSKSAhPSAtMSB8fCBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzJfUExBWUVSUykgIT0gLTEpIHsKLQkJCQljb21wdXRlciA9IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fU1RBUlRfMV9QTEFZRVIpICE9IC0xOwotCQkJCWdhbWUgPSBuZXcgYnl0ZVs4XVs4XTsKLQkJCQlpZiAoY29tcHV0ZXIpIHR0ciA9IG5ldyBQYXducygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSBnYW1lWyhpbnQpKE1hdGgucmFuZG9tKCkqZ2FtZS5sZW5ndGgpXVsoaW50KShNYXRoLnJhbmRvbSgpKmdhbWVbMF0ubGVuZ3RoKV0gPSBXQUxMOwotCQkJCWUuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChUWVBFX0JPQVJEKSk7Ci0JCQkJfX0pOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1RIRU1FKSAhPSAtMSkgewotCQkJCWludCBpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fVEhFTUUpICsgQUNUSU9OX1RIRU1FLmxlbmd0aCgpICsgMTsKLQkJCQlDU1NfRk9MREVSID0gZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgNCk7Ci0JCQkJVVJMX0NTUyA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi9zdHlsZS5jc3MiOwotCQkJCVVSTF9XRUxDT01FID0gUExVR0lOX1BBVEgrQ1NTX0ZPTERFUisiL3dlbGNvbWUuaHRtbCI7Ci0JCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJyb3dzZXIuc2V0VXJsKFVSTF9XRUxDT01FKTsKLQkJCQl9fSk7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYnl0ZSBwbGF5ZXIgPSBFTVBUWTsKLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1dISVRFKSAhPSAtMSkgcGxheWVyID0gV0hJVEU7Ci0JCQllbHNlIGlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX0JMQUNLKSAhPSAtMSkgcGxheWVyID0gQkxBQ0s7Ci0JCQlpZiAocGxheWVyICE9IEVNUFRZKSB7Ci0JCQkJaW50IGluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKCJ4eCIpICsgMjsKLQkJCQlpbnQgeCA9IEludGVnZXIucGFyc2VJbnQoZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpOwotCQkJCWluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKCJ5eSIpICsgMjsKLQkJCQlpbnQgeSA9IEludGVnZXIucGFyc2VJbnQoZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpOwotCQkJCWJvb2xlYW4gaGFzTW9yZSA9IGFkZCh4LCB5LCBwbGF5ZXIpOwotCQkJCWlzV2hpdGUgPSBwbGF5ZXIgIT0gV0hJVEU7Ci0JCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoaGFzTW9yZSA/IFRZUEVfQk9BUkQgOiBUWVBFX0JPQVJEX09WRVIpKTsKLQkJCQlpZiAoY29tcHV0ZXIgJiYgaGFzTW9yZSAmJiAhaXNXaGl0ZSkgcGxheShlLmRpc3BsYXksIGJyb3dzZXIsIDUwMDApOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJfQotCQkJfWNhdGNoIChFeGNlcHRpb24gZTEgKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkKGludCB4LCBpbnQgeSwgYnl0ZSBjb2xvcikgewotCQlnYW1lW3hdW3ldID0gY29sb3I7Ci0JCWludCBjbnQgPSBNYXRoLm1pbih4LCB5KSwgbiA9IDA7Ci0JCWludCBvdGhlcl9jb2xvciA9IGNvbG9yID09IFdISVRFID8gQkxBQ0sgOiBXSElURTsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beS1kXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5LWRdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gTWF0aC5taW4oZ2FtZS5sZW5ndGggLSAxIC0geCwgZ2FtZVswXS5sZW5ndGggLSAxIC0geSk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5K2RdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beStkXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4K2RdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBNYXRoLm1pbihnYW1lLmxlbmd0aCAtIDEgLSB4LCB5KTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3ktZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeCtkXVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3grZF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IE1hdGgubWluKHgsIGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHkpOyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3krZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0geTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4XVt5LWRdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3hdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4XVt5K2RdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3hdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSB4OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beV0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5XSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4LWRdW3ldID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gZ2FtZS5sZW5ndGggLSAxIC0geDsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3ldID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beV0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeCtkXVt5XSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0KLQkJYm9vbGVhbiBoYXNNb3JlID0gZmFsc2U7Ci0JCWNudFdoaXRlID0gMDsgY250QmxhY2sgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdhbWUubGVuZ3RoOyBpKyspCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGdhbWVbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQlzd2l0Y2ggKGdhbWVbaV1bal0pIHsKLQkJCQkJY2FzZSBFTVBUWTogaGFzTW9yZSA9IHRydWU7IGJyZWFrOwotCQkJCQljYXNlIFdISVRFOiBjbnRXaGl0ZSsrOyBicmVhazsKLQkJCQkJY2FzZSBCTEFDSzogY250QmxhY2srKzsgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gaGFzTW9yZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsYXkoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBCcm93c2VyIGJyb3dzZXIsIGludCBkZWxheSkgewotCQl0dHIucGxheVJlcXVlc3QoZ2FtZSwgQkxBQ0spOwotCQlkaXNwbGF5LnRpbWVyRXhlYygzMDAwLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0dHIuZ2V0QmVzdE1vdmUobW92ZSk7Ci0JCQkJCWJvb2xlYW4gaGFzTW9yZSA9IGFkZChtb3ZlWzBdLCBtb3ZlWzFdLCBCTEFDSyk7Ci0JCQkJCWlzV2hpdGUgPSB0cnVlOwotCQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChoYXNNb3JlID8gVFlQRV9CT0FSRCA6IFRZUEVfQk9BUkRfT1ZFUikpOwotCQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxNGUxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ1ZWU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTY0NGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLQkgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQkgICAgICAgCi1zb3VyY2UuYnJvd3NlcmV4YW1wbGUuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWUxODEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBCcm93c2VyPC9oMj4KLQotPHA+Ci1UaGUgQnJvd3NlciBFeGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gCi1JdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwgYW5kIHNvbWUKLWFkZGl0aW9uYWwgd2lkZ2V0cyB0byBpbXBsZW1lbnQgYWN0aW9ucyBjb21tb25seSBmb3VuZCBvbiBicm93c2VycyAodG9vbGJhcgotd2l0aCBiYWNrLCBmb3J3YXJkLCByZWZyZXNoIGFuZCBzdG9wIGJ1dHRvbnMsIHN0YXR1cyBiYXIgZXRjLikuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJFeGFtcGxlPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5Ccm93c2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2ljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWUyMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTdjZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVEJyb3dzZXJFeGFtcGxlLm5hbWUgPSBTV1QgQnJvd3NlciBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5Ccm93c2VyRXhhbXBsZS5uYW1lID0gV2ViIEJyb3dzZXIKLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5uYW1lID0gV2ViIEJyb3dzZXIKLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gaW50ZWdyYXRlIGEgV2ViIEJyb3dzZXIgd2l0aCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LlxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSBjb21wb3NpdGUgY29udGFpbmluZyBhIEJyb3dzZXIgd2lkZ2V0IHRvIHJlbmRlciBIVE1MLiBcCi0JQWRkaXRpb25hbCB3aWRnZXRzIGFsbG93IHRoZSB1c2VyIHRvIHBlcmZvcm0gdHlwaWNhbCBicm93c2VyIGFjdGlvbnMgKGZvciBleGFtcGxlLCBuYXZpZ2F0ZSB0byBhIHBhcnRpY3VsYXIgVVJMLCBnbyBiYWNrLCBmb3J3YXJkLCByZWZyZXNoIGFuZCBzdG9wKS4KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTM0NTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIiCi0gICBuYW1lPSIlcGx1Z2luLlNXVEJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImJyb3dzZXJleGFtcGxlLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5Ccm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTYxNjBmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBCcm93c2VyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmNmNlMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+QnJvd3NlclZpZXc8L2NvZGU+IGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24KLSAqIG9mIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGNvbnRyb2wuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUJyb3dzZXJFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IEJyb3dzZXJFeGFtcGxlKGZyYW1lLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWluc3RhbmNlLmZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjNjhlYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ1Yzc2Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLQkgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQkgICAgICAgCi1zb3VyY2UuY29udHJvbHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTQ2MzA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIENvbnRyb2xzIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkNvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjBkMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEN1c3RvbSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIEN1c3RvbSBDb250cm9scyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgZW11bGF0ZWQgU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgZW11bGF0ZWQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ3VzdG9tQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkN1c3RvbSBDb250cm9sczwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmRlZTk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9pY29ucy9jb250cm9sc19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA3YzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVENvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkNvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzCi12aWV3LkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIEN1c3RvbSBDb250cm9scwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkNvbnRyb2xzRXhhbXBsZS5uYW1lID0gQ29udHJvbHMKLWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIG5hdGl2ZSBTV1QgY29udHJvbHMuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBjb250cm9sLiBcCi0JVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgdGhlIGNvbnRyb2wuCi0JCi1sYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lID0gQ3VzdG9tIENvbnRyb2xzCi1sYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjdXN0b20gU1dUIGNvbnRyb2xzLlxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGFsbG93cyB0aGUgdXNlciBcCi0JdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgY3VzdG9tIGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2NDk0ODMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLkNvbnRyb2xQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImNvbnRyb2xzLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMuQ29udHJvbFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLnZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy5DdXN0b21Db250cm9sVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY3VzdG9tY29udHJvbHMudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9jb250cm9sc19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5DdXN0b21Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jdXN0b21jb250cm9scy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmN1c3RvbWNvbnRyb2xzLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlYjZkNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb250cm9sUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTk1MzI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+Q29udHJvbHM8L2NvZGU+IGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24KLSAqIG9mIHRoZSBuYXRpdmUgY29udHJvbHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGNvbnRyb2wuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IENvbnRyb2xFeGFtcGxlKGZyYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWluc3RhbmNlLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ3VzdG9tQ29udHJvbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0MzAyZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiA8Y29kZT5DdXN0b21Db250cm9sczwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGN1c3RvbSBjb250cm9scyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udHJvbFZpZXcgZXh0ZW5kcyBDb250cm9sVmlldyB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IEN1c3RvbUNvbnRyb2xFeGFtcGxlKGZyYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzdmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjE5ZTQ5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy8sXAotICAgICAgICAgICAgICAgZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0JICAgICAgICAgICAqLmphcgotCSAgICAgICAgICAgCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5sYXVuY2hlci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZjRmOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRXhhbXBsZSBMYXVuY2hlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBFeGFtcGxlIExhdW5jaGVyPC9oMj4KLQotPHA+Ci1UaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgV29ya2JlbmNoIHZpZXdzIAotb3Igc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCi08L3A+Ci0KLTx1bD4KLTxsaT5Xb3JrYmVuY2ggdmlld3MgYXJlIGV4YW1wbGVzIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBFY2xpcHNlLiAgV2hlbiB0aGUgbGF1bmNoZXIKLXN0YXJ0cyBhIFdvcmtiZW5jaCB2aWV3LCBpdCBpcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUuCi08bGk+U3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgYXJlIGxhdW5jaGVkIGluIGEgc2VwYXJhdGUgd2luZG93LgotPC91bD4KLQotPHA+Ci1Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHJ1biB0aGUgc3RhbmRhbG9uZSBleGFtcGxlcyB3aXRob3V0IHRoZSBTV1QgRXhhbXBsZSBMYXVuY2hlciwgCi1yZWZlciB0byA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4uCi08L3A+Ci08cD4KLVRoZSBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGFsc28gYmUgbGF1bmNoZWQgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgU1dUIEV4YW1wbGUgCi1MYXVuY2hlci4gIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGNhdGVnb3J5IG9mIHRoZSAKLTxzdHJvbmc+U2hvdyBWaWV3czwvc3Ryb25nPiBkaWFsb2cuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBFeGFtcGxlIExhdW5jaGVyPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51LCBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvc3Ryb25nPiB2aWV3LiAKLUEgdmlldyBjb250YWluaW5nIGEgbGlzdCBvZiBleGFtcGxlcyB3aWxsIGFwcGVhciBpbiB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi1XaGVuIHlvdSBzZWxlY3QgYW4gZXhhbXBsZSBmcm9tIHRoZSBsaXN0IGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGV4YW1wbGUgaXMgZGlzcGxheWVkLgotQ2xpY2sgb24gdGhlIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGJ1dHRvbiB0byBsYXVuY2ggdGhlIGV4YW1wbGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWRmOTE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhFQUQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLTxIVE1MPgotPEJPRFk+Ci08SDE+PENFTlRFUj5MYXVuY2ggSXRlbXM8L0NFTlRFUj48L0gxPgotPEgyPklkZW50aWZpZXI8L0gyPgotb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zPEgyPkRlc2NyaXB0aW9uPC9IMj4KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkICdzdGFuZGFsb25lIHByb2dyYW0nIGFuZAotJ1dvcmtiZW5jaCB2aWV3JwotbGF1bmNoIGl0ZW1zIHRvIHRoZSBMYXVuY2hlciwgb3B0aW9uYWxseSBncm91cGluZyB0aGVtIGludG8KLWNhdGVnb3JpZXMgc28gYXMgdG8gZm9ybSBhIG11bHRpLXRpZXJlZCBoaWVyYXJjaHkuCi1TdGFuZGFsb25lIHByb2dyYW1zIGFyZSBleGVjdXRlZCB1c2luZyB0aGUgcGxhdGZvcm0ncyBldmVudCBsb29wLgotV29ya2JlbmNoIHZpZXdzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYWN0aXZlIFdvcmtiZW5jaCBQZXJzcGVjdGl2ZS48SDI+TWFya3VwPC9IMj4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgZXh0ZW5zaW9uIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5wb2ludDwvYj4gLSA8L2xpPjxsaT48Yj5pZDwvYj4gLSA8L2xpPjxsaT48Yj5uYW1lPC9iPiAtIDwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgcHJvZ3JhbSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBwcm9ncmFtPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO21haW5DbGFzcyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwbHVnaW5JZCZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5tYWluQ2xhc3M8L2I+IC0gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBtYWluKCkgbWV0aG9kIGlzIHRvIGJlIGxhdW5jaGVkLjwvbGk+PGxpPjxiPnBsdWdpbklkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0gcGx1Z2luIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0uPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCB2aWV3IEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIHZpZXc8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dmlld0lkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPnZpZXdJZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBXb3JrYmVuY2ggVmlldyB0byBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgaXRlbSBpcyBsYXVuY2hlZC48L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGNhdGVnb3J5IEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGNhdGVnb3J5PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2F0ZWdvcnkmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGNhdGVnb3J5LjwvbGk+PGxpPjxiPmlkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBjYXRlZ29yeS4gIENhdGVnb3JpZXMgd2l0aCBkdXBsaWNhdGUgaWQncyB3aWxsIGJlIGRpc2NhcmRlZC48L2xpPjxsaT48Yj5jYXRlZ29yeTwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBwYXJlbnQgY2F0ZWdvcnkuPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBpdGVtIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGl0ZW08L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjYXRlZ29yeSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ljb24mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmFibGVkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgImZhbHNlIiJ0cnVlIjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkZXNjcmlwdGlvbiZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPm5hbWU8L2I+IC0gVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgbGF1bmNoIGl0ZW0uPC9saT48bGk+PGI+aWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGxhdW5jaCBpdGVtLiBMYXVuY2ggaXRlbXMgd2l0aCBkdXBsaWNhdGUgaWQncyB3aWxsIGJlIGRpc2NhcmRlZC48L2xpPjxsaT48Yj5jYXRlZ29yeTwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBjYXRlZ29yeSB0aGlzIGxhdW5jaCBpdGVtIGJlbG9uZ3MgdG8uPC9saT48bGk+PGI+aWNvbjwvYj4gLSBUaGUgZGVjbGFyaW5nIHBsdWdpbiByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdG8gZGlzcGxheSB3aXRoIHRoaXMgbGF1bmNoIGl0ZW0gaW4gdGhlIExhdW5jaGVyLjwvbGk+PGxpPjxiPmVuYWJsZWQ8L2I+IC0gU2V0IHRvICJmYWxzZSIgdG8gZGlzYWJsZSB0aGlzIGxhdW5jaCBpdGVtLCBvciB0byAidHJ1ZSIgdG8gZW5hYmxlIGl0IChkZWZhdWx0KS48L2xpPjxsaT48Yj5kZXNjcmlwdGlvbjwvYj4gLSBUaGUgbG9jYWxpemVkIHBsYWluLXRleHQgZGVzY3JpcHRpb24gb2YgdGhpcyBsYXVuY2ggaXRlbS48L2xpPjwvdWw+Ci08SDI+RXhhbXBsZTwvSDI+Ci08SDI+QVBJIEluZm9ybWF0aW9uPC9IMj4KLTxIMj5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjwvSDI+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjlmYjZiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FiNGQzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5Yzc3NzM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9vcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEwM2FhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVExhdW5jaGVyRXhhbXBsZS5uYW1lID0gU1dUIExhdW5jaGVyIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkxhdW5jaGVyRXhhbXBsZS5uYW1lID0gU1dUIEV4YW1wbGUgTGF1bmNoZXIKLQotZXh0ZW5zaW9uLXBvaW50LmxhdW5jaEl0ZW1zLm5hbWUgPSBMYXVuY2ggSXRlbXMKLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUubmFtZSA9IExhdW5jaGVyCi1sYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMgd2hpY2ggY2FuIGVpdGhlciBiZSBcCi0JV29ya2JlbmNoIFZpZXdzLCBvciBTdGFuZGFsb25lIGFwcGxpY2F0aW9ucy5cblxuXAotCVdvcmtiZW5jaCBWaWV3cyBhcmUgZXhhbXBsZXMgdGhhdCBhcmUgaW50ZWdyYXRlZCBpbnRvIEVjbGlwc2UuICBXaGVuIHRoZSBMYXVuY2hlciBcCi0Jc3RhcnRzIGEgV29ya2JlbmNoIFZpZXcsIGl0IGlzIG9wZW5lZCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwZXJzcGVjdGl2ZS5cblxuXAotCVN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLQotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi1lcnJvci5Db3VsZE5vdEZpbmRSZWdpc3RlcmVkRXh0ZW5zaW9ucyA9IENvdWxkIE5vdCBGaW5kIFJlZ2lzdGVyZWQgRXh0ZW5zaW9ucwotZXJyb3IuSW5jb21wbGV0ZVByb2dyYW1MYXVuY2hJdGVtID0gSW5jb21wbGV0ZSBYTUwgUHJvZ3JhbUxhdW5jaEl0ZW0gZGVmaW5pdGlvbiwgaWQgPSB7MH0KLWVycm9yLkluY29tcGxldGVWaWV3TGF1bmNoSXRlbSA9IEluY29tcGxldGUgWE1MIFZpZXdMYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci1lcnJvci5JbmNvbXBsZXRlTGF1bmNoSXRlbSA9IEluY29tcGxldGUgb3IgdW5yZWNvZ25pemVkIFhNTCBMYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci0KLWxhdW5jaGl0ZW0uTnVsbC5kZXNjcmlwdGlvbiA9IDw8bm8gaXRlbSBzZWxlY3RlZD4+Ci0KLWxhdW5jaGl0ZW0uTWlzc2luZy5uYW1lID0gPDx1bm5hbWVkPj4KLWxhdW5jaGl0ZW0uTWlzc2luZy5kZXNjcmlwdGlvbiA9IDw8bm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlPj4KLQotdmlldy5sYXVuY2hHcm91cC50ZXh0ID0gRXhhbXBsZXMKLXZpZXcubGF1bmNoQnV0dG9uLnRleHQgPSBSdW4KLXZpZXcuZGVzY3JpcHRpb25Hcm91cC50ZXh0ID0gRGVzY3JpcHRpb24KLQotcnVuLmVycm9yLkludm9jYXRpb24gPSBBIGZhdGFsIGVycm9yIG9jY3VycmVkIHdoaWxlIGxhdW5jaGluZyB0aGUgcHJvZ3JhbS4KLXJ1bi5lcnJvci5Eb2VzTm90SW1wbGVtZW50TWV0aG9kID0gVGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlbigpIG1ldGhvZC4KLXJ1bi5lcnJvci5Db3VsZE5vdEZpbmRDbGFzcyA9IENvdWxkIG5vdCBmaW5kIHRoZSBjbGFzcyB0byBydW4uCi1ydW4uZXJyb3IuQ291bGROb3RJbnN0YW50aWF0ZUNsYXNzID0gQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyB0byBydW4uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDI4MWI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIiCi0gICBuYW1lPSIlcGx1Z2luLlNXVExhdW5jaGVyRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5MYXVuY2hlclBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGF1bmNoZXIuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJsYXVuY2hJdGVtcyIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5sYXVuY2hJdGVtcy5uYW1lIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZCIvPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iYXBwbGljYXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVjYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkxhdW5jaGVyRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5MYXVuY2hlclZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zY2hlbWEvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmV4c2QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc2NoZW1hL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGI3ZDhiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zY2hlbWEvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIiIGlkPSJsYXVuY2hJdGVtcyIgbmFtZT0iTGF1bmNoIEl0ZW1zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkICZhcG9zO3N0YW5kYWxvbmUgcHJvZ3JhbSZhcG9zOyBhbmQKLSZhcG9zO1dvcmtiZW5jaCB2aWV3JmFwb3M7Ci1sYXVuY2ggaXRlbXMgdG8gdGhlIExhdW5jaGVyLCBvcHRpb25hbGx5IGdyb3VwaW5nIHRoZW0gaW50bwotY2F0ZWdvcmllcyBzbyBhcyB0byBmb3JtIGEgbXVsdGktdGllcmVkIGhpZXJhcmNoeS4KLVN0YW5kYWxvbmUgcHJvZ3JhbXMgYXJlIGV4ZWN1dGVkIHVzaW5nIHRoZSBwbGF0Zm9ybSZhcG9zO3MgZXZlbnQgbG9vcC4KLVdvcmtiZW5jaCB2aWV3cyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFjdGl2ZSBXb3JrYmVuY2ggUGVyc3BlY3RpdmUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpdGVtIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvZ3JhbSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIGEgJnF1b3Q7U3RhbmRhbG9uZSBQcm9ncmFtJnF1b3Q7IGZvciBhIGxhdW5jaCBpdGVtIHRvIHJ1bi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFpbkNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgd2hvc2UgbWFpbigpIG1ldGhvZCBpcyB0byBiZSBsYXVuY2hlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwbHVnaW5JZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtIHBsdWdpbiBjb250YWluaW5nIHRoZSBwcm9ncmFtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSAmcXVvdDtXb3JrYmVuY2ggVmlldyZxdW90OyBmb3IgYSBsYXVuY2ggaXRlbSB0byBhY3RpdmF0ZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIFdvcmtiZW5jaCBWaWV3IHRvIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBpdGVtIGlzIGxhdW5jaGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIGEgbGF1bmNoIGl0ZW0gY2F0ZWdvcnkgaGVhZGluZy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoaXMgY2F0ZWdvcnkuICBDYXRlZ29yaWVzIHdpdGggZHVwbGljYXRlIGlkJmFwb3M7cyB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBwYXJlbnQgY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgbGF1bmNoIGl0ZW0gY2F0ZWdvcnkgZGVzY3JpcHRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Iml0ZW0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhIGxhdW5jaCBpdGVtLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlldyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9ncmFtIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBsYXVuY2ggaXRlbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoaXMgbGF1bmNoIGl0ZW0uIExhdW5jaCBpdGVtcyB3aXRoIGR1cGxpY2F0ZSBpZCZhcG9zO3Mgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgY2F0ZWdvcnkgdGhpcyBsYXVuY2ggaXRlbSBiZWxvbmdzIHRvLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGRlY2xhcmluZyBwbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHRvIGRpc3BsYXkgd2l0aCB0aGlzIGxhdW5jaCBpdGVtIGluIHRoZSBMYXVuY2hlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTZXQgdG8gJnF1b3Q7ZmFsc2UmcXVvdDsgdG8gZGlzYWJsZSB0aGlzIGxhdW5jaCBpdGVtLCBvciB0byAmcXVvdDt0cnVlJnF1b3Q7IHRvIGVuYWJsZSBpdCAoZGVmYXVsdCkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxvY2FsaXplZCBwbGFpbi10ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgbGF1bmNoIGl0ZW0uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtRGVzY3JpcHRvci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmMxMDVmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEl0ZW1EZXNjcmlwdG9yIGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IGEgbGF1bmNoIGl0ZW0uCi0gKi8KLWNsYXNzIEl0ZW1EZXNjcmlwdG9yIHsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgSW1hZ2UgIGljb247Ci0JcHJpdmF0ZSBTdHJpbmcgdmlldzsKLQlwcml2YXRlIFN0cmluZyBtYWluVHlwZTsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gSXRlbURlc2NyaXB0b3IuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGljb24gdGhlIGljb24KLQkgKiBAcGFyYW0gdmlldyB0aGUgaG9zdCB2aWV3IG1heSBiZSBudWxsIGlmIGl0IGlzIGEgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbgotCSAqIEBwYXJhbSBtYWluVHlwZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gcnVuIG1heSBiZSBudWxsIGlmIGl0IGlzIGEgdmlldwotCSAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHdoaWNoIGNvbnRhaW5zIHRoZSBtYWluIGNsYXNzCi0JICovCi0JcHVibGljIEl0ZW1EZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJSW1hZ2UgaWNvbiwgU3RyaW5nIHZpZXcsIFN0cmluZyBtYWluVHlwZSwgU3RyaW5nIHBsdWdpbklkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJdGhpcy5tYWluVHlwZSA9IG1haW5UeXBlOwotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uJ3Mgc3BlY2lmaWVkIHR5cGUsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdHlwZSB3YXMgc3BlY2lmaWVkIGJ5IHRoZSBleHRlbnNpb24uCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uJ3Mgc3BlY2lmaWVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUl0ZW1JbnN0YW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTGF1bmNoZXJQbHVnaW4uTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhpcyBwcm9ncmFtLgotCSAqCi0JICogQHJldHVybiB0aGUgdXNlci1zcGVjaWZpZWQgSUQgZm9yIHRoaXMgcHJvZ3JhbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHJhbnNsYXRlZCBuYW1lIGZvciB0aGUgcHJvZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIGZvciB0aGUgcHJvZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3bGluZS1kZWxpbWl0ZWQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2dyYW0sIG51bGwgaWYgbm8gZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaWNvbiBmb3IgdGhpcyBkZXNjcmlwdG9yCi0JICogCi0JICogQHJldHVybnMgYW4gaWNvbiwgbnVsbCBpZiB0aGUgaXRlbSBpcyBhIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uKCkgewotCQlyZXR1cm4gaWNvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaG9zdCB2aWV3IGZvciB0aGUgcHJvZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBob3N0IHZpZXcsIG51bGwgaWYgdGhlIGl0ZW0gaXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3ICgpIHsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0byBydW4KLQkgKiBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgY2xhc3MgdG8gcnVuIGZvciB0aGUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5UeXBlICgpIHsKLQkJcmV0dXJuIG1haW5UeXBlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCBjb250YWlucyB0aGUgcHJvZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCBjb250YWlucyB0aGUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkICgpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGFuIGl0ZW0gaXMgYSBmb2xkZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGl0ZW0gaXMgYSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvbGRlcigpIHsKLQkJcmV0dXJuIChtYWluVHlwZSA9PSBudWxsICYmIHZpZXcgPT0gbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgdGhlIGVxdWFsaXR5IG9mIGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzLmdldElkKCkuZXF1YWxzSWdub3JlQ2FzZShvdGhlci5nZXRJZCgpKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKG90aGVyIGluc3RhbmNlb2YgSXRlbURlc2NyaXB0b3IpIHsKLQkJCUl0ZW1EZXNjcmlwdG9yIG90aGVyRGVzY3JpcHRvciA9IChJdGVtRGVzY3JpcHRvcikgb3RoZXI7Ci0JCQlyZXR1cm4gZ2V0SWQoKS5lcXVhbHNJZ25vcmVDYXNlKG90aGVyRGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFByb2R1Y2VzIGEgaGFzaGNvZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgaGFzaGNvZGUKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gaWQudG9VcHBlckNhc2UoKS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1UcmVlTm9kZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbVRyZWVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MDMwYTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbVRyZWVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgdXNlZCB0byBzdG9yZSB0cmVlIHN0cnVjdHVyZXMgb2YgSXRlbURlc2NyaXB0b3JzCi0gKi8KLWNsYXNzIEl0ZW1UcmVlTm9kZSB7Ci0JcHJpdmF0ZSBJdGVtVHJlZU5vZGUgbmV4dFNpYmxpbmc7Ci0JcHJpdmF0ZSBJdGVtVHJlZU5vZGUgZmlyc3RDaGlsZDsKLQlwcml2YXRlIEl0ZW1EZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbGVhZiBJdGVtVHJlZU5vZGUgd2l0aCBhIGdpdmVuIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVOb2RlKEl0ZW1EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbm9kZSB0byB0aGUgVHJlZSBpbiBzb3J0ZWQgb3JkZXIgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBhZGQuIE5vdGUgdGhhdCBub2RlLm5leHRTaWJsaW5nIG11c3QgYmUgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNvcnRlZE5vZGUoSXRlbVRyZWVOb2RlIG5vZGUpIHsKLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkgewotCQkJZmlyc3RDaGlsZCA9IG5vZGU7Ci0JCX0gZWxzZSBpZiAoZmlyc3RDaGlsZC5kZXNjcmlwdG9yLmdldE5hbWUoKS5jb21wYXJlVG8obm9kZS5kZXNjcmlwdG9yLmdldE5hbWUoKSkgPiAwKSB7Ci0JCQlub2RlLm5leHRTaWJsaW5nID0gZmlyc3RDaGlsZDsKLQkJCWZpcnN0Q2hpbGQgPSBub2RlOwotCQl9IGVsc2UgewotCQkJSXRlbVRyZWVOb2RlIGN1cnNvcjsKLQkJCWZvciAoY3Vyc29yID0gZmlyc3RDaGlsZDsgY3Vyc29yLm5leHRTaWJsaW5nICE9IG51bGw7IGN1cnNvciA9IGN1cnNvci5uZXh0U2libGluZykgewotCQkJCUl0ZW1UcmVlTm9kZSBzaWJsaW5nID0gY3Vyc29yLm5leHRTaWJsaW5nOwotCQkJCWlmIChzaWJsaW5nLmRlc2NyaXB0b3IuZ2V0TmFtZSgpLmNvbXBhcmVUbyhub2RlLmRlc2NyaXB0b3IuZ2V0TmFtZSgpKSA+IDApIGJyZWFrOwotCQkJfQotCQkJbm9kZS5uZXh0U2libGluZyA9IGN1cnNvci5uZXh0U2libGluZzsKLQkJCWN1cnNvci5uZXh0U2libGluZyA9IG5vZGU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSXRlbURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHNpYmxpbmcsIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJdGVtVHJlZU5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0JCXJldHVybiBuZXh0U2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3QgY2hpbGQsIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJdGVtVHJlZU5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIGZpcnN0Q2hpbGQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZWYzMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoZXJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGF1bmNoZXJQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcKLQkJTEFVTkNIX0lURU1TX1BPSU5UX0lEID0gIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0lURU0gPSAiaXRlbSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTV9JQ09OID0gImljb24iLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0lURU1fREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU0gPSAicHJvZ3JhbSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9QTFVHSU4gPSAicGx1Z2luSWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fQ0xBU1MgPSAibWFpbkNsYXNzIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WSUVXID0gInZpZXciLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZJRVdfVklFV0lEID0gInZpZXdJZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lEID0gImlkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfTkFNRSA9ICJuYW1lIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfRU5BQkxFRCA9ICJlbmFibGVkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX1RSVUUgPSAidHJ1ZSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOwkJCi0KLQlzdGF0aWMgZmluYWwgaW50Ci0JCWxpQ2xvc2VkRm9sZGVyID0gMCwKLQkJbGlPcGVuRm9sZGVyID0gMSwKLQkJbGlHZW5lcmljRXhhbXBsZSA9IDI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkiaWNvbnMvY2xvc2VkRm9sZGVyLmdpZiIsCi0JCSJpY29ucy9vcGVuRm9sZGVyLmdpZiIsCi0JCSJpY29ucy9nZW5lcmljX2V4YW1wbGUuZ2lmIiB9OwotCXN0YXRpYyBJbWFnZSBpbWFnZXNbXTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgdGhlIExhdW5jaGVyUGx1Z2luLgotCSAqLwotCXB1YmxpYyBMYXVuY2hlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSk7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIENsZWFuIHVwCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGF1bmNoZXJQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJaW1hZ2VzW2ldID0gZ2V0SW1hZ2VGcm9tUGx1Z2luKHBsdWdpbi5nZXRCdW5kbGUoKSwgaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCWlmIChpbWFnZXNbaV0gPT0gbnVsbCkgewotCQkJCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSwgbnVsbCk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotICAgICAqIENvbnN0cnVjdHMgYSBsaXN0IG9mIGF2YWlsYWJsZSBwcm9ncmFtcyBmcm9tIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEl0ZW1UcmVlTm9kZSByZXByZXNlbnRpbmcgdGhlIHJvb3Qgb2YgYSB0cmVlIG9mIGl0ZW1zICh0aGUgcm9vdCBpcyBub3QgdG8gYmUgZGlzcGxheWVkKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlbVRyZWVOb2RlIGdldExhdW5jaEl0ZW1UcmVlKCkgewotCQlJdGVtVHJlZU5vZGUgY2F0ZWdvcnlUcmVlID0KLQkJCW5ldyBJdGVtVHJlZU5vZGUobmV3IEl0ZW1EZXNjcmlwdG9yKCI8PFJvb3Q+PiIsICI8PFJvb3Q+PiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKLQotCQkvLyBnZXQgdGhlIHBsYXRmb3JtJ3MgcHVibGljIHBsdWdpbiByZWdpc3RyeQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkvLyByZXRyaWV2ZSBhbGwgY29uZmlndXJhdGlvbiBlbGVtZW50cyByZWdpc3RlcmVkIGF0IG91ciBsYXVuY2hJdGVtcyBleHRlbnNpb24tcG9pbnQKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlndXJhdGlvbkVsZW1lbnRzID0KLQkJCWV4dGVuc2lvblJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihMQVVOQ0hfSVRFTVNfUE9JTlRfSUQpOwotCQkJCi0JCWlmIChjb25maWd1cmF0aW9uRWxlbWVudHMgPT0gbnVsbCB8fCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdEZpbmRSZWdpc3RlcmVkRXh0ZW5zaW9ucyIpLCBudWxsKTsKLQkJCXJldHVybiBjYXRlZ29yeVRyZWU7Ci0JCX0KLQkJCi0JCS8qIENvbGxlY3QgYWxsIGxhdW5jaCBjYXRlZ29yaWVzIC0tIGNvYWxlc2NlIHRob3NlIHdpdGggc2FtZSBJRCAqLwotCQlIYXNoTWFwIGlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1tpXTsKLQkJCWZpbmFsIFN0cmluZyBjZU5hbWUgPSBjZS5nZXROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliSWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCwgbnVsbCk7Ci0JCQkKLQkJCWlmIChpZE1hcC5jb250YWluc0tleShhdHRyaWJJZCkpIGNvbnRpbnVlOwotCQkJaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfQ0FURUdPUlkpKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGF0dHJpYk5hbWUgPSBnZXRJdGVtTmFtZShjZSk7IAotCQkJCUl0ZW1EZXNjcmlwdG9yIHRoZURlc2NyaXB0b3IgPSBuZXcgSXRlbURlc2NyaXB0b3IoYXR0cmliSWQsIGF0dHJpYk5hbWUsCi0JCQkJCWdldEl0ZW1EZXNjcmlwdGlvbihjZSksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGNlKTsKLQkJCQlpZE1hcC5wdXQoYXR0cmliSWQsIG5ldyBJdGVtVHJlZU5vZGUodGhlRGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCQotCQkvKiBHZW5lcmF0ZSBsYXVuY2ggY2F0ZWdvcnkgaGllcmFyY2h5ICovCi0JCVNldCB0ZW1wSWRTZXQgPSBuZXcgSGFzaFNldCgpOyAvLyB1c2VkIHRvIHByZXZlbnQgZHVwbGljYXRlcyBmcm9tIGJlaW5nIGVudGVyZWQgaW50byB0aGUgdHJlZQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gY29uZmlndXJhdGlvbkVsZW1lbnRzW2ldOwotCQkJZmluYWwgU3RyaW5nIGNlTmFtZSA9IGNlLmdldE5hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJJZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lELCBudWxsKTsKLQkJCQotCQkJaWYgKHRlbXBJZFNldC5jb250YWlucyhhdHRyaWJJZCkpIGNvbnRpbnVlOwotCQkJaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfQ0FURUdPUlkpKSB7Ci0JCQkJZmluYWwgSXRlbVRyZWVOb2RlIHRoZU5vZGUgPSAoSXRlbVRyZWVOb2RlKSBpZE1hcC5nZXQoYXR0cmliSWQpOwotCQkJCWFkZEl0ZW1CeUNhdGVnb3J5KGNlLCBjYXRlZ29yeVRyZWUsIHRoZU5vZGUsIGlkTWFwKTsKLQkJCQl0ZW1wSWRTZXQuYWRkKGF0dHJpYklkKTsKLQkJCX0KLQkJfQotCQkKLQkJLyogR2VuZXJhdGUgcHJvZ3JhbSB0cmVlICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudHNbaV07Ci0JCQlmaW5hbCBTdHJpbmcgY2VOYW1lID0gY2UuZ2V0TmFtZSgpOwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYklkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQsIG51bGwpOwotCi0JCQlpZiAoaWRNYXAuY29udGFpbnNLZXkoYXR0cmliSWQpKSBjb250aW51ZTsKLQkJCWlmIChjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZKSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBlbHNlIGlmIChjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX0lURU0pKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGVuYWJsZWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9FTkFCTEVELCAKLQkJCQkJTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9UUlVFKTsKLQkJCQlpZiAoZW5hYmxlZC5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfVkFMVUVfRkFMU0UpKSBjb250aW51ZTsKLQkJCQlJdGVtRGVzY3JpcHRvciB0aGVEZXNjcmlwdG9yID0gY3JlYXRlSXRlbURlc2NyaXB0b3IoY2UsIGF0dHJpYklkKTsJCQkJCi0JCQkKLQkJCQlpZiAodGhlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIEl0ZW1UcmVlTm9kZSB0aGVOb2RlID0gbmV3IEl0ZW1UcmVlTm9kZSh0aGVEZXNjcmlwdG9yKTsKLQkJCQkJYWRkSXRlbUJ5Q2F0ZWdvcnkoY2UsIGNhdGVnb3J5VHJlZSwgdGhlTm9kZSwgaWRNYXApOwotCQkJCQlpZE1hcC5wdXQoYXR0cmliSWQsIHRoZU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0ZWdvcnlUcmVlOwotCX0KLQotCQkJCQotCS8qKgotCSAqIEFkZHMgYW4gaXRlbSB0byB0aGUgY2F0ZWdvcnkgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEl0ZW1CeUNhdGVnb3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBjZSwgSXRlbVRyZWVOb2RlIHJvb3QsCi0JCUl0ZW1UcmVlTm9kZSB0aGVOb2RlLCBIYXNoTWFwIGlkTWFwKSB7Ci0JCWZpbmFsIFN0cmluZyBhdHRyaWJDYXRlZ29yeSA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0NBVEVHT1JZLCBudWxsKTsKLQkJCQkKLQkJLy8gbG9jYXRlIHRoZSBwYXJlbnQgbm9kZQotCQlJdGVtVHJlZU5vZGUgcGFyZW50Tm9kZSA9IG51bGw7Ci0JCWlmIChhdHRyaWJDYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnROb2RlID0gKEl0ZW1UcmVlTm9kZSkgaWRNYXAuZ2V0KGF0dHJpYkNhdGVnb3J5KTsKLQkJfQotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSBwYXJlbnROb2RlID0gcm9vdDsKLQkJCQkKLQkJLy8gYWRkIHRoZSBpdGVtCi0JCXBhcmVudE5vZGUuYWRkU29ydGVkTm9kZSh0aGVOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIEl0ZW1EZXNjcmlwdG9yIGZyb20gYW4gWE1MIGRlZmluaXRpb24uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEBwYXJhbSBhdHRyaWJJZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHJldHVybiBhIG5ldyBJdGVtRGVzY3JpcHRvciwgb3IgbnVsbCBpZiBhbiBlcnJvciBvY2N1cnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJdGVtRGVzY3JpcHRvciBjcmVhdGVJdGVtRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIFN0cmluZyBhdHRyaWJJZCkgewotCQlmaW5hbCBTdHJpbmcgYXR0cmliTmFtZSA9IGdldEl0ZW1OYW1lKGNlKTsKLQkJZmluYWwgSW1hZ2UgIGF0dHJpYkljb24gPSBnZXRJdGVtSWNvbihjZSk7Ci0JCWZpbmFsIFN0cmluZyBhdHRyaWJEZXNjcmlwdGlvbiA9IGdldEl0ZW1EZXNjcmlwdGlvbihjZSk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZpZXdDRSA9IGdldEl0ZW1FbGVtZW50KGNlLCBMQVVOQ0hfSVRFTVNfWE1MX1ZJRVcpOwotCQlpZiAodmlld0NFICE9IG51bGwpIHsKLQkJCS8vSXRlbSBpcyBhIHZpZXcKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJWaWV3ID0gZ2V0SXRlbUF0dHJpYnV0ZSh2aWV3Q0UsIExBVU5DSF9JVEVNU19YTUxfVklFV19WSUVXSUQsIG51bGwpOwkJCi0JCQlpZiAoYXR0cmliVmlldyA9PSBudWxsKSB7Ci0JCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkluY29tcGxldGVWaWV3TGF1bmNoSXRlbSIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGF0dHJpYklkIH0gKSwgbnVsbCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEl0ZW1EZXNjcmlwdG9yKGF0dHJpYklkLCBhdHRyaWJOYW1lLCBhdHRyaWJEZXNjcmlwdGlvbiwKLQkJCQkJYXR0cmliSWNvbiwgYXR0cmliVmlldywgbnVsbCwgbnVsbCwgdmlld0NFKTsKLQkJfSBlbHNlIHsKLQkJCS8vSXRlbSBpcyBhIHN0YW5kYWxvbmUKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBwcm9ncmFtQ0UgPSBnZXRJdGVtRWxlbWVudChjZSwgTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNKTsKLQkJCWlmIChwcm9ncmFtQ0UgIT0gbnVsbCkgewotCQkJCWZpbmFsIFN0cmluZyBhdHRyaWJQbHVnaW5JZCA9IGdldEl0ZW1BdHRyaWJ1dGUocHJvZ3JhbUNFLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fUExVR0lOLCBudWxsKTsKLQkJCQlmaW5hbCBTdHJpbmcgYXR0cmliQ2xhc3MgICAgPSBnZXRJdGVtQXR0cmlidXRlKHByb2dyYW1DRSwgTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX0NMQVNTLCBudWxsKTsKLQkJCQlpZiAoYXR0cmliQ2xhc3MgPT0gbnVsbCB8fCBhdHRyaWJQbHVnaW5JZCA9PSBudWxsKSB7Ci0JCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5JbmNvbXBsZXRlUHJvZ3JhbUxhdW5jaEl0ZW0iLAotCQkJCQluZXcgT2JqZWN0W10geyBhdHRyaWJJZCB9ICksIG51bGwpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBJdGVtRGVzY3JpcHRvcihhdHRyaWJJZCwgYXR0cmliTmFtZSwgYXR0cmliRGVzY3JpcHRpb24sCi0JCQkJCWF0dHJpYkljb24sIG51bGwsIGF0dHJpYkNsYXNzLCBhdHRyaWJQbHVnaW5JZCwgcHJvZ3JhbUNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkluY29tcGxldGVMYXVuY2hJdGVtIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXR0cmliSWQgfSApLCBudWxsKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgcGFydGljdWxhciBjaGlsZCBYTUwgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBwYXJlbnQKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBmZXRjaAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQncyBJQ29uZmlndXJhdGlvbkVsZW1lbnQsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEl0ZW1FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBjZSwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudENFcyA9IGNlLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gKGVsZW1lbnRDRXMgIT0gbnVsbCAmJiBlbGVtZW50Q0VzLmxlbmd0aCAhPSAwKSA/IGVsZW1lbnRDRXNbMF0gOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGFuIFhNTCBhdHRyaWJ1dGUgZm9yIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSB0byBmZXRjaAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZAotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJdGVtQXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgdmFsdWUgPSBjZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBnaXZlbiB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZvciBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcmV0dXJuIGEgbmV3bGluZS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgaXRlbSwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEl0ZW1EZXNjcmlwdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9JVEVNX0RFU0NSSVBUSU9OLCAiIik7Ci0JCXJldHVybiAoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SXRlbU5hbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCXJldHVybiBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9OQU1FLAotCQkJZ2V0UmVzb3VyY2VTdHJpbmcoImxhdW5jaGl0ZW0uTWlzc2luZy5uYW1lIikpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWNvbiBmb3IgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHJldHVybiBhbiBpY29uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SXRlbUljb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCVN0cmluZyBpY29uUGF0aCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfSVRFTV9JQ09OLCAiIik7Ci0JCWlmIChpY29uUGF0aC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gY2UuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHN5bWJvbGljTmFtZSk7Ci0JCQlJbWFnZSBpY29uID0gZ2V0SW1hZ2VGcm9tUGx1Z2luKGJ1bmRsZSwgaWNvblBhdGgpOwotCQkJaWYgKGljb24gIT0gbnVsbCkgewotCQkJCUltYWdlW10gbmV3SW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlcy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGltYWdlcywgMCwgbmV3SW1hZ2VzLCAwLCBpbWFnZXMubGVuZ3RoKTsKLQkJCQluZXdJbWFnZXNbaW1hZ2VzLmxlbmd0aF0gPSBpY29uOwotCQkJCWltYWdlcyA9IG5ld0ltYWdlczsKLQkJCQlyZXR1cm4gaWNvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VzW2xpR2VuZXJpY0V4YW1wbGVdOwotCX0KLQotCS8qKgotCSAqIEdldHMgYW4gaW1hZ2UgZnJvbSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBidW5kbGUgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZvciB0aGUgcGx1Z2luIHdpdGggdGhlIGltYWdlCi0JICogQHBhcmFtIGljb25QYXRoIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBpbnN0YWxsIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEltYWdlRnJvbVBsdWdpbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgaWNvblBhdGgpIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVcmwgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGluc3RhbGxVcmwsIGljb25QYXRoKTsKLQkJCWlzID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKGlzKTsKLQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSwgbWFzayk7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2VlYTI0OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotLyoqCi0gKiBMYXVuY2hlciB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiB0byBsYXVuY2ggdGhlIG90aGVyIHJlZ2lzdGVyZWQgZXhhbXBsZXMuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaGVyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcml2YXRlIFNoZWxsIHdvcmtiZW5jaFNoZWxsOwotCQotCXByaXZhdGUgVHJlZSBsYXVuY2hUcmVlOwotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gcnVuQnV0dG9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIExhdW5jaGVyVmlldy4KLQkgKi8KLQlwdWJsaWMgTGF1bmNoZXJWaWV3KCkgewotCQlMYXVuY2hlclBsdWdpbi5pbml0UmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZS4KLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl3b3JrYmVuY2hTaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBTcGxpdExheW91dCgpKTsKLQkJCQkKLQkJR3JvdXAgbGF1bmNoR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhdW5jaEdyb3VwLnNldFRleHQoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpZXcubGF1bmNoR3JvdXAudGV4dCIpKTsKLQkJCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxhdW5jaEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlsYXVuY2hUcmVlID0gbmV3IFRyZWUobGF1bmNoR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYXVuY2hUcmVlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsYXVuY2hUcmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbSA9IGdldFNlbGVjdGVkSXRlbSgpOwotCQkJCXNldERlc2NyaXB0aW9uQnlJdGVtKGl0ZW0pOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbSA9IGdldFNlbGVjdGVkSXRlbSgpOwotCQkJCXNldERlc2NyaXB0aW9uQnlJdGVtKGl0ZW0pOwotCQkJCWlmIChpdGVtLmdldE1haW5UeXBlKCkgPT0gbnVsbCAmJiBpdGVtLmdldFZpZXcoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIENhdGVnb3J5IHNlbGVjdGVkLCBzbyBqdXN0IGV4cGFuZC9jb2xhcHNlIHRoZSBub2RlCi0JCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCQlib29sZWFuIGV4cGFuZGVkID0gdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKTsKLQkJCQkJaWYgKHRyZWVJdGVtICE9IG51bGwpIHRyZWVJdGVtLnNldEV4cGFuZGVkKCFleHBhbmRlZCk7Ci0JCQkJCXRyZWVJdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tleHBhbmRlZCA/IExhdW5jaGVyUGx1Z2luLmxpQ2xvc2VkRm9sZGVyIDogTGF1bmNoZXJQbHVnaW4ubGlPcGVuRm9sZGVyXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGF1bmNoSXRlbShnZXRTZWxlY3RlZEl0ZW0oKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJbGF1bmNoVHJlZS5hZGRUcmVlTGlzdGVuZXIobmV3IFRyZWVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXJdKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tMYXVuY2hlclBsdWdpbi5saU9wZW5Gb2xkZXJdKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcnVuQnV0dG9uID0gbmV3IEJ1dHRvbihsYXVuY2hHcm91cCwgU1dULlBVU0gpOwotCQlydW5CdXR0b24uc2V0VGV4dChMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlldy5sYXVuY2hCdXR0b24udGV4dCIpKTsKLQkJcnVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbGF1bmNoSXRlbShnZXRTZWxlY3RlZEl0ZW0oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgZGVzY3JpcHRpb25Hcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb25Hcm91cC5zZXRUZXh0KExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2aWV3LmRlc2NyaXB0aW9uR3JvdXAudGV4dCIpKTsKLQkJZGVzY3JpcHRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQotCQlkZXNjcmlwdGlvblRleHQgPSBuZXcgVGV4dChkZXNjcmlwdGlvbkdyb3VwLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwKLQkJCVNXVC5XUkFQIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0obnVsbCk7Ci0JCXNldEl0ZW1EZXNjcmlwdG9ycyhMYXVuY2hlclBsdWdpbi5nZXRMYXVuY2hJdGVtVHJlZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSAgewotCQlsYXVuY2hUcmVlLnNldEZvY3VzKCk7Ci0JCXJ1bkJ1dHRvbi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24ocnVuQnV0dG9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl3b3JrYmVuY2hTaGVsbCA9IG51bGw7Ci0JCWxhdW5jaFRyZWUgPSBudWxsOwotCQlkZXNjcmlwdGlvblRleHQgPSBudWxsOwotCQlydW5CdXR0b24gPSBudWxsOwkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyBhIG5ldyBsYXVuY2ggbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Um9vdCB0aGUgbmV3IHRyZWUgb2YgbGF1bmNoIGl0ZW1zIGZvciB0aGUgVUkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJdGVtRGVzY3JpcHRvcnMoZmluYWwgSXRlbVRyZWVOb2RlIG5ld1Jvb3QpIHsKLQkJaWYgKHdvcmtiZW5jaFNoZWxsID09IG51bGwpIHJldHVybjsKLQkJd29ya2JlbmNoU2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoKGxhdW5jaFRyZWUgPT0gbnVsbCkgfHwgKGxhdW5jaFRyZWUuaXNEaXNwb3NlZCgpKSkgcmV0dXJuOwotCQkJCWxhdW5jaFRyZWUucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCQlmb3IgKEl0ZW1UcmVlTm9kZSBub2RlID0gbmV3Um9vdC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsKLQkJCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlkb05vZGUobm9kZSwgbmV3IFRyZWVJdGVtKGxhdW5jaFRyZWUsIFNXVC5OT05FKSk7IC8vIHRvcC1sZXZlbCBUcmVlSXRlbQotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBhZGRHcm91cChUcmVlSXRlbSBwYXJlbnQsIEl0ZW1UcmVlTm9kZSBub2RlKSB7Ci0JCQkJZm9yICg7bm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWRvTm9kZShub2RlLCBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSkpOyAvLyBUcmVlSXRlbSBhdCBkZXB0aCA+IDAKLQkJCQl9Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgZG9Ob2RlKEl0ZW1UcmVlTm9kZSBub2RlLCBUcmVlSXRlbSB0cmVlSXRlbSkgewotCQkJCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW0gPSBub2RlLmdldERlc2NyaXB0b3IoKTsKLQkJCQl0cmVlSXRlbS5zZXRUZXh0KGl0ZW0uZ2V0TmFtZSgpKTsKLQkJCQl0cmVlSXRlbS5zZXREYXRhKGl0ZW0pOwotCQkJCWlmIChub2RlLmdldERlc2NyaXB0b3IoKS5pc0ZvbGRlcigpKSB7Ci0JCQkJCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCQkJdHJlZUl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW0xhdW5jaGVyUGx1Z2luLmxpQ2xvc2VkRm9sZGVyXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJlZUl0ZW0uc2V0SW1hZ2Uobm9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0SWNvbigpKTsKLQkJCQl9Ci0JCQkJYWRkR3JvdXAodHJlZUl0ZW0sIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc3BlY2lmaWVkIGxhdW5jaCBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtRGVzY3JpcHRvciB0aGUgbGF1bmNoIGl0ZW0gdG8gZXhlY3V0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBsYXVuY2hJdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yKSB7Ci0JCS8qIENhc2UgMTogVGhlIGxhdW5jaCBpdGVtIGlzIGEgdmlldyAqLwotCQlTdHJpbmcgcGx1Z2luVmlld0lkID0gaXRlbURlc2NyaXB0b3IuZ2V0VmlldyAoKTsKLQkJaWYgKHBsdWdpblZpZXdJZCAhPSBudWxsKSB7Ci0JCQlmaW5hbCBJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0ID0gdGhpczsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0U2l0ZSB3b3JrYmVuY2hQYXJ0U2l0ZSA9IHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFBhcnRTaXRlLmdldFBhZ2UoKTsKLQkJCXRyeSB7Ci0JCQkJd29ya2JlbmNoUGFnZS5zaG93VmlldyhwbHVnaW5WaWV3SWQpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxhdW5jaGVyUGx1Z2luLmxvZ0Vycm9yKExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJydW4uZXJyb3IuSW52b2NhdGlvbiIpLCBlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKiBDYXNlIDI6IFRoZSBsYXVuY2ggaXRlbSBpcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbSAqLwotCQlpZiAod29ya2JlbmNoU2hlbGwgPT0gbnVsbCkgcmV0dXJuOwotCQl0cnkgewotCQkJT2JqZWN0IGluc3RhbmNlID0gaXRlbURlc2NyaXB0b3IuY3JlYXRlSXRlbUluc3RhbmNlKCk7Ci0JCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewotCQkJCURpc3BsYXkgZGlzcGxheSA9IHdvcmtiZW5jaFNoZWxsLmdldERpc3BsYXkoKTsKLQkJCQlNZXRob2Qgb3Blbk1ldGhvZCA9IGluc3RhbmNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoIm9wZW4iLCBuZXcgQ2xhc3NbXSB7RGlzcGxheS5jbGFzc30pOwotCQkJCW9wZW5NZXRob2QuaW52b2tlKGluc3RhbmNlLCBuZXcgT2JqZWN0W10ge2Rpc3BsYXl9KTsKLQkJCX0KLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCUxhdW5jaGVyUGx1Z2luLmxvZ0Vycm9yKExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJydW4uZXJyb3IuRG9lc05vdEltcGxlbWVudE1ldGhvZCIpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxhdW5jaGVyUGx1Z2luLmxvZ0Vycm9yKExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJydW4uZXJyb3IuQ291bGROb3RJbnN0YW50aWF0ZUNsYXNzIiksIGUpOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBPYnRhaW5zIHRoZSBzZWxlY3RlZCBsYXVuY2ggaXRlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSXRlbURlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIEl0ZW1EZXNjcmlwdG9yIGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJZmluYWwgVHJlZUl0ZW1bXSBzZWxlY3Rpb25zID0gbGF1bmNoVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbnMubGVuZ3RoID09IDApIHJldHVybiBudWxsOwotCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtRGVzY3JpcHRvciA9IChJdGVtRGVzY3JpcHRvcikgc2VsZWN0aW9uc1swXS5nZXREYXRhKCk7Ci0JCXJldHVybiBpdGVtRGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudGx5IHZpc2libGUgZGVzY3JpcHRpb24gdGV4dCB0byByZWZsZWN0IHRoYXQgb2YgYSBwYXJ0aWN1bGFyIEl0ZW1EZXNjcmlwdG9yLgotCSAqCi0JICogQHBhcmFtIGl0ZW1EZXNjcmlwdG9yIHRoZSBsYXVuY2ggaXRlbSB3aG9zZSBkZXNjcmlwdGlvbiBpcyB0byBiZSBkaXNwbGF5ZWQsIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREZXNjcmlwdGlvbkJ5SXRlbShJdGVtRGVzY3JpcHRvciBpdGVtRGVzY3JpcHRvcikgewotCQlTdHJpbmcgZGVzY3JpcHRpb247Ci0JCWlmIChpdGVtRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJsYXVuY2hpdGVtLk51bGwuZGVzY3JpcHRpb24iKTsKLQkJCWlmIChydW5CdXR0b24gIT0gbnVsbCkgcnVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZGVzY3JpcHRpb24gPSBpdGVtRGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQkJZGVzY3JpcHRpb24gPSBMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygibGF1bmNoaXRlbS5NaXNzaW5nLmRlc2NyaXB0aW9uIik7Ci0JCQlpZiAocnVuQnV0dG9uICE9IG51bGwpIHsKLQkJCQlydW5CdXR0b24uc2V0RW5hYmxlZChpdGVtRGVzY3JpcHRvci5nZXRWaWV3KCkgIT0gbnVsbCB8fCBpdGVtRGVzY3JpcHRvci5nZXRNYWluVHlwZSgpICE9IG51bGwpOwotCQkJfQotCQl9Ci0JCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9TcGxpdExheW91dC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvU3BsaXRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjYzN2FmMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9TcGxpdExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEEgTGF5b3V0IGNsYXNzIHRoYXQgYXV0b21hdGljYWxseSBzd2l0Y2hlcyBmcm9tIGEgaG9yaXpvbnRhbCBzcGxpdCB0byBhIHZlcnRpY2FsCi0gKiBzcGxpdCBsYXlvdXQgdG8gYWNjb21vZGF0ZSBjaGFuZ2luZyBzaXplIGNvbmRpdGlvbnMuCi0gKiAKLSAqIExhdGVyIG9uIHdlIG1pZ2h0IGltcHJvdmUgdGhpcyBjbGFzcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgInByZWZlcnJlZCIgc2l6ZSBvZgotICogdGhlIHdpZGdldHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGxpdExheW91dCBleHRlbmRzIExheW91dCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCXNwbGl0SG9yaXpvbnRhbGx5ID0gMCwKLQkJc3BsaXRWZXJ0aWNhbGx5ID0gMTsKLQlwcml2YXRlIGludCBzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCi0JcHVibGljIGludCBzcGFjaW5nID0gMzsKLQlwdWJsaWMgaW50IG1hcmdpblRvcCA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5MZWZ0ID0gMzsKLQlwdWJsaWMgaW50IG1hcmdpblJpZ2h0ID0gMzsKLQlwdWJsaWMgaW50IG1hcmdpbkJvdHRvbSA9IDM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxheW91dAotCSAqLwotCXB1YmxpYyBTcGxpdExheW91dCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExheW91dCNjb21wdXRlU2l6ZShDb21wb3NpdGUsIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCWlmICh3SGludCA9PSBTV1QuREVGQVVMVCkgewotCQkJaWYgKGhIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQkJUG9pbnQgaFNwbGl0U2l6ZSA9IGNvbXB1dGVIU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCQlQb2ludCB2U3BsaXRTaXplID0gY29tcHV0ZVZTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZhbHNlKTsKLQkJCQlpbnQgaFNwbGl0QXJlYSA9IGhTcGxpdFNpemUueCAqIGhTcGxpdFNpemUueTsKLQkJCQlpbnQgdlNwbGl0QXJlYSA9IHZTcGxpdFNpemUueCAqIHZTcGxpdFNpemUueTsKLQkJCQkvLyBDaG9vc2UgZGlyZWN0aW9uIGNvbnN1bWluZyBsZWFzdCBhcmVhCi0JCQkJaWYgKGhTcGxpdEFyZWEgPCB2U3BsaXRBcmVhKSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0JCQkJCXJldHVybiBoU3BsaXRTaXplOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRWZXJ0aWNhbGx5OwotCQkJCQlyZXR1cm4gdlNwbGl0U2l6ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIENvbnN0cmFpbmVkIGluIGhlaWdodDogc3BsaXQgdmVydGljYWxseQotCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRWZXJ0aWNhbGx5OwotCQkJCXJldHVybiBjb21wdXRlVlNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQkvLyBDb25zdHJhaW5lZCBpbiB3aWR0aDogc3BsaXQgaG9yaXpvbnRhbGx5Ci0JCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQkJCQlyZXR1cm4gY29tcHV0ZUhTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaEhpbnQgPCB3SGludCkgewotCQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0VmVydGljYWxseTsKLQkJCQkJcmV0dXJuIGNvbXB1dGVWU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCQkJCQlyZXR1cm4gY29tcHV0ZUhTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCX0JCQkJCQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgTGF5b3V0I2xheW91dChDb21wb3NpdGUsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCWNvbXB1dGVTaXplKGNvbXBvc2l0ZSwgY2xpZW50QXJlYS53aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQsIGZhbHNlKTsKLQkJCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQljbGllbnRBcmVhLnggKz0gbWFyZ2luTGVmdDsKLQkJY2xpZW50QXJlYS55ICs9IG1hcmdpblRvcDsKLQkJY2xpZW50QXJlYS53aWR0aCAtPSBtYXJnaW5SaWdodCArIG1hcmdpbkxlZnQ7Ci0JCWNsaWVudEFyZWEuaGVpZ2h0IC09IG1hcmdpbkJvdHRvbSArIG1hcmdpblRvcDsKLQkJUG9pbnQgcG9zaXRpb24gPSBuZXcgUG9pbnQoY2xpZW50QXJlYS54LCBjbGllbnRBcmVhLnkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIENvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWZpbmFsIFJlY3RhbmdsZSBib3VuZHM7Ci0JCQlpZiAoc3BsaXREaXJlY3Rpb24gPT0gc3BsaXRIb3Jpem9udGFsbHkpIHsKLQkJCQlpbnQgaGVpZ2h0ID0gY2xpZW50QXJlYS5oZWlnaHQgLyBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJYm91bmRzID0gbmV3IFJlY3RhbmdsZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBjbGllbnRBcmVhLndpZHRoLCBoZWlnaHQpOwotCQkJCXBvc2l0aW9uLnkgKz0gaGVpZ2h0ICsgc3BhY2luZzsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHdpZHRoID0gY2xpZW50QXJlYS53aWR0aCAvIGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBjbGllbnRBcmVhLmhlaWdodCk7Ci0JCQkJcG9zaXRpb24ueCArPSB3aWR0aCArIHNwYWNpbmc7Ci0JCQl9Ci0JCQlib3VuZHMud2lkdGggPSBNYXRoLm1heChib3VuZHMud2lkdGgsIDApOwotCQkJYm91bmRzLmhlaWdodCA9IE1hdGgubWF4KGJvdW5kcy5oZWlnaHQsIDApOwotCQkJY2hpbGQuc2V0Qm91bmRzKGJvdW5kcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVIU3BsaXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUG9pbnQgc2l6ZSA9IG5ldyBQb2ludChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQsIG1hcmdpblRvcCArIG1hcmdpbkJvdHRvbSk7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0KLQkJCVBvaW50IGNoaWxkU2l6ZSA9IGNoaWxkLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQlzaXplLnggPSBNYXRoLm1heChzaXplLngsIGNoaWxkU2l6ZS54KTsKLQkJCXNpemUueSArPSBjaGlsZFNpemUueSArIHNwYWNpbmc7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlVlNwbGl0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0LCBtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b20pOwotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCi0JCQlQb2ludCBjaGlsZFNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJc2l6ZS54ICs9IGNoaWxkU2l6ZS54ICsgc3BhY2luZzsKLQkJCXNpemUueSA9IE1hdGgubWF4KHNpemUueSwgY2hpbGRTaXplLnkpOwotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmYzJjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGU1NWQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5sYXlvdXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MjlmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBMYXlvdXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gTGF5b3V0czwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgCi11c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4KLVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEKLXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCB0aGUgdW5kZXJseWluZwotY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPkNvZGU8L3N0cm9uZz4gYnV0dG9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlLkxheW91dEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkxheW91dHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvaWNvbnMvbGF5b3V0c19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NWRkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYmRiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUTGF5b3V0RXhhbXBsZS5uYW1lID0gU1dUIExheW91dCBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5MYXlvdXRFeGFtcGxlLm5hbWUgPSBTV1QgTGF5b3V0cwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSA9IExheW91dHMKLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIFxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGFsbG93cyB0aGUgXAotCXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LlwKLQlUaGUgdXNlciBjYW4gaW5zZXJ0IHdpZGdldHMgaW50byBhIGxheW91dCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxheW91dCBkYXRhIFwKLQl1c2luZyBhIHByb3BlcnR5IHNoZWV0LiAgV2hlbiB0aGUgdXNlciBoYXMgYSBzdWl0YWJsZSBhcnJhbmdlbWVudCwgY29kZSBjYW4gYmUgXAotCWdlbmVyYXRlZCBieSBjbGlja2luZyBvbiB0aGUgQ29kZSBidXR0b24uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzOTA2My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUTGF5b3V0RXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLkxheW91dFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGF5b3V0cy5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuTGF5b3V0RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGF5b3V0c19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMuTGF5b3V0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkxheW91dEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkMmRhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMYXlvdXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjliM2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+TGF5b3V0czwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGxheW91dHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGxheW91dC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlMYXlvdXRFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IExheW91dEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDBmNjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmU3NjA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLSAgICAgICAgICAgIAotc291cmNlLm9sZXdpbjMyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyN2RhOGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBPTEUgV2ViIEJyb3dzZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIE9MRSBXZWIgQnJvd3NlcjwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBlbWJlZCBhbiBBY3RpdmUgWCBjb250cm9sIGludG8gYW4gU1dUIGFwcGxpY2F0aW9uIG9yIGFuIEVjbGlwc2Ugdmlldy4KLTwvcD4KLTxwPgotV2hlbiB0aGUgdmlldyBpcyBvcGVuZWQsIGl0IHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBXaW5kb3dzIEludGVybmV0IEV4cGxvcmVyCi1jb250cm9sLiAgVGhlIE9MRSB3ZWIgYnJvd3NlciBoYXMKLTxzdHJvbmc+QmFjazwvc3Ryb25nPiBhbmQgPHN0cm9uZz5Gb3J3YXJkPC9zdHJvbmc+IGJ1dHRvbnMgdG8gdGFrZSB5b3UgdG8gcmVjZW50bHkgdmlzaXRlZCBwYWdlcy4gIFRoZSBicm93c2VyIGFsc28gY29udGFpbnMKLWEgPHN0cm9uZz5Ib21lPC9zdHJvbmc+IGJ1dHRvbiB0byB0YWtlIHlvdSB0byB0aGUgd2ViIGJyb3dzZXIncyBob21lIHBhZ2UsIGEgPHN0cm9uZz5TdG9wPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCBzdG9wcyB0aGUgCi1jdXJyZW50IHRyYW5zZmVyLCBhIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCB3aWxsIHNlYXJjaCBmb3IgdGV4dCB0eXBlZCBpbiB0aGUgPHN0cm9uZz5BZGRyZXNzPC9zdHJvbmc+IHRleHQgZmllbGQsIGFuZAotYSA8c3Ryb25nPlJlZnJlc2g8L3N0cm9uZz4gYnV0dG9uIHdoaWNoIHJlLWRyYXdzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlLiBUaGVyZSBpcyBhbHNvIGEKLTxzdHJvbmc+R288L3N0cm9uZz4gYnV0dG9uIHdoaWNoLCB3aGVuIGNsaWNrZWQsIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBwYWdlIHNwZWNpZmllZCBpbiB0aGUgPHN0cm9uZz5BZGRyZXNzPC9zdHJvbmc+IGZpZWxkLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPk90aGVyPC9zdHJvbmc+LiAgCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdAotdGhlIHZpZXcgbmFtZWQgPHN0cm9uZz5PTEUgV2ViIEJyb3dzZXIgKHdpbjMyKTwvc3Ryb25nPi4gQSB2aWV3IGNvbnRhaW5pbmcgYSB3ZWIgYnJvd3NlciB3aWxsIGFwcGVhci4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5PTEUgV2ViIEJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldpbjMyIG9ubHk8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmNmNDFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiOWI2YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2EyMzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI3MGUxOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3M2FjOTFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTNkMzQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OTVlMjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ODExMzg4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVE9MRUV4YW1wbGUubmFtZSA9IFNXVCBPTEUgRXhhbXBsZSBQbHVnaW4gKFdpbjMyKQotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lID0gT0xFIFdlYiBCcm93c2VyIChXaW4zMikKLQotbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMubmFtZSA9IFdpbjMyIG9ubHkKLWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyBmb3IgV2luZG93cyBzeXN0ZW1zIG9ubHkuCi0KLWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSA9IE9MRSBXZWIgQnJvd3NlcgotbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBlbWJlZCBhbiBBY3RpdmUgWCBjb250cm9sIGludG8gYW4gU1dUIGFwcGxpY2F0aW9uIG9yIGFuIEVjbGlwc2Ugdmlldy5cblxuXAotCVdoZW4gdGhlIHZpZXcgaXMgb3BlbmVkLCBpdCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgV2luZG93cyBJbnRlcm5ldCBFeHBsb3JlciBcCi0JY29udHJvbC4gIFRoZSBPTEUgV2ViIEJyb3dzZXIgaGFzIFwKLQlCYWNrIGFuZCBGb3J3YXJkIGJ1dHRvbnMgdG8gdGFrZSB5b3UgdG8gcmVjZW50bHkgdmlzaXRlZCBwYWdlcy4gIFRoZSBicm93c2VyIGFsc28gY29udGFpbnMgXAotCWEgSG9tZSBidXR0b24gdG8gdGFrZSB5b3UgdG8gdGhlIHdlYiBicm93c2VyJ3MgaG9tZSBwYWdlLCBhIFN0b3AgYnV0dG9uIHdoaWNoIHN0b3BzIHRoZSBcCi0JY3VycmVudCB0cmFuc2ZlciwgYSBTZWFyY2ggYnV0dG9uIHdoaWNoIHdpbGwgc2VhcmNoIGZvciB0ZXh0IHR5cGVkIGluIHRoZSBBZGRyZXNzIHRleHQgZmllbGQsIGFuZCBcCi0JYSBSZWZyZXNoIGJ1dHRvbiB3aGljaCByZS1kcmF3cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS4gVGhlcmUgaXMgYWxzbyBhIFwKLQlHbyBidXR0b24gd2hpY2gsIHdoZW4gY2xpY2tlZCwgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHRoZSBBZGRyZXNzIGZpZWxkLgotCi1icm93c2VyLkJhY2sudGV4dCA9IEJhY2t3YXJkCi1icm93c2VyLkJhY2sudG9vbHRpcCA9IEdvIHRvIHByZXZpb3VzIFdlYiBzaXRlIGluIHRoZSBoaXN0b3J5IGxpc3QKLQotYnJvd3Nlci5Gb3J3YXJkLnRleHQgPSBGb3J3YXJkCi1icm93c2VyLkZvcndhcmQudG9vbHRpcCA9IEdvIHRvIG5leHQgV2ViIHNpdGUgaW4gdGhlIGhpc3RvcnkgbGlzdAotCi1icm93c2VyLkhvbWUudGV4dCA9IEhvbWUKLWJyb3dzZXIuSG9tZS50b29sdGlwID0gR28gdG8gaG9tZSBXZWIgc2l0ZQotCi1icm93c2VyLlN0b3AudGV4dCA9IFN0b3AKLWJyb3dzZXIuU3RvcC50b29sdGlwID0gU3RvcCBsb2FkaW5nIGN1cnJlbnQgV2ViIHNpdGUKLQotYnJvd3Nlci5SZWZyZXNoLnRleHQgPSBSZWZyZXNoCi1icm93c2VyLlJlZnJlc2gudG9vbHRpcCA9IFJlZnJlc2ggY3VycmVudCBXZWIgc2l0ZQotCi1icm93c2VyLlNlYXJjaC50ZXh0ID0gU2VhcmNoCi1icm93c2VyLlNlYXJjaC50b29sdGlwID0gU2VhcmNoIHRoZSBXZWIKLQotYnJvd3Nlci5BZGRyZXNzLmxhYmVsID0gQWRkcmVzcyA6Ci0KLWJyb3dzZXIuR28udGV4dCA9IEdvCi0KLWJyb3dzZXIuU3RhdGUuVW5pbml0aWFsaXplZC50ZXh0ID0gTm90IHJlYWR5LgotYnJvd3Nlci5TdGF0ZS5Mb2FkaW5nLnRleHQgPSBMb2FkaW5nIFdlYiBzaXRlLi4uCi1icm93c2VyLlN0YXRlLkxvYWRlZC50ZXh0ID0gUmVhZHkuCi1icm93c2VyLlN0YXRlLkludGVyYWN0aXZlLnRleHQgPSBMb2FkaW5nIFdlYiBzaXRlLi4uCi1icm93c2VyLlN0YXRlLkNvbXBsZXRlLnRleHQgPSBEb25lLgotCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLWVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wgPSBVbmFibGUgdG8gY3JlYXRlIDw8QnJvd3NlciBDb250cm9sPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDEwNzI0Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSBGaWxlIHdyaXR0ZW4gYnkgUERFIDEuMCAtLT4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RPTEVFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PbGVQbHVnaW4iPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0ib2xld2luMzIuamFyIj4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgIDx2aWV3Ci0gICAgICAgICBuYW1lPSIldmlldy5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgaWNvbj0iaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PbGVCcm93c2VyVmlldyIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLmJyb3dzZXJWaWV3Ij4KLSAgIDwvdmlldz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8Y2F0ZWdvcnkKLSAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoV2luMzJPbmx5Q2F0ZWdvcnkiPgotICAgPC9jYXRlZ29yeT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgaWNvbj0iaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoV2luMzJPbmx5Q2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi52aWV3bGF1bmNoZXIiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5icm93c2VyVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2l0ZW0+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmE1ZDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiBPbGUgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IHRvIGRlbW9uc3RyYXRlIFdpbjMyIE9MRSAvIEFjdGl2ZVgKLSAqIGludGVncmF0aW9uLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBPbGVCcm93c2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlICAgICAgZGlzcGxheUFyZWE7Ci0KLQlwcml2YXRlIE9sZUZyYW1lICAgICAgIHdlYkZyYW1lOwotCXByaXZhdGUgT2xlV2ViQnJvd3NlciAgd2ViQnJvd3NlcjsKLQlwcml2YXRlIFRleHQgICAgICAgICAgIHdlYlVybDsKLQlwcml2YXRlIE9sZUNvbnRyb2xTaXRlIHdlYkNvbnRyb2xTaXRlOwotCXByaXZhdGUgUHJvZ3Jlc3NCYXIgICAgd2ViUHJvZ3Jlc3M7Ci0JcHJpdmF0ZSBMYWJlbCAgICAgICAgICB3ZWJTdGF0dXM7Ci0JcHJpdmF0ZSBCdXR0b24gICAgICAgICB3ZWJOYXZpZ2F0ZUJ1dHRvbjsKLQkKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRCYWNrd2FyZDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRGb3J3YXJkOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZEhvbWU7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kU3RvcDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRSZWZyZXNoOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZFNlYXJjaDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZhdGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX0FNQklFTlRfRExDT05UUk9MID0gLTU1MTI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERMQ1RMX05PX1NDUklQVFMgPSAweDgwOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgdGhlIE9MRSBicm93c2VyIHZpZXcuCi0JICovCi0JcHVibGljIE9sZUJyb3dzZXJWaWV3KCkgewotCQlPbGVQbHVnaW4uaW5pdFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWRpc3BsYXlBcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCi0JCWNyZWF0ZVRvb2xiYXIoKTsKLQkJY3JlYXRlQnJvd3NlckZyYW1lKCk7CQkKLQkJY3JlYXRlU3RhdHVzQXJlYSgpOwotCQljcmVhdGVCcm93c2VyQ29udHJvbCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW51cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhY3RpdmF0ZWQpIHsKLQkJCXdlYkNvbnRyb2xTaXRlLmRlYWN0aXZhdGVJblBsYWNlQ2xpZW50KCk7Ci0JCQlhY3RpdmF0ZWQgPSBmYWxzZTsKLQkJfQotCQlpZiAod2ViQnJvd3NlciAhPSBudWxsKSB3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQkJd2ViQnJvd3NlciA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgIHsKLQkJd2ViVXJsLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2ViIGJyb3dzZXIgdG9vbGJhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbGJhcigpIHsKLQkJLy8gQWRkIGEgdG9vbGJhcgotCQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMKLQkJd2ViQ29tbWFuZEJhY2t3YXJkID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkJhY2sudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkJhY2sudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpQmFja10pOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29CYWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgZm9yd2FyZCB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMKLQkJd2ViQ29tbWFuZEZvcndhcmQgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Gb3J3YXJkLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkZvcndhcmQudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlGb3J3YXJkXSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29Gb3J3YXJkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIHNlcGFyYXRvcgotCQluZXcgVG9vbEl0ZW0oYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSB0byB0aGUgSG9tZSBwYWdlCi0JCXdlYkNvbW1hbmRIb21lID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuSG9tZS50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Ib21lLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRIb21lLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpSG9tZV0pOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZEhvbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvSG9tZSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gYWJvcnQgd2ViIHBhZ2UgbG9hZGluZwotCQl3ZWJDb21tYW5kU3RvcCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0b3AudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RvcC50ZXh0IikpOwotCQl3ZWJDb21tYW5kU3RvcC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVN0b3BdKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRTdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5TdG9wKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byByZWZyZXNoIHRoZSBjdXJyZW50IHdlYiBwYWdlCi0JCXdlYkNvbW1hbmRSZWZyZXNoID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuUmVmcmVzaC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5SZWZyZXNoLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpUmVmcmVzaF0pOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLlJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgc2VwYXJhdG9yCi0JCW5ldyBUb29sSXRlbShiYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBzZWFyY2ggdGhlIHdlYgotCQl3ZWJDb21tYW5kU2VhcmNoID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TZWFyY2gudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TZWFyY2gudGV4dCIpKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVNlYXJjaF0pOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kU2VhcmNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb1NlYXJjaCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSB0ZXh0IGFyZWEgZm9yIFVzZXJzIHRvIGVudGVyIGEgdXJsCi0JCUNvbXBvc2l0ZSBhZGRyZXNzQmFyID0gbmV3IENvbXBvc2l0ZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlhZGRyZXNzQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlhZGRyZXNzQmFyLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlMYWJlbCBhZGRyZXNzTGFiZWwgPSBuZXcgTGFiZWwoYWRkcmVzc0JhciwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYWRkcmVzc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhZGRyZXNzTGFiZWwuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuQWRkcmVzcy5sYWJlbCIpKTsKLQkJYWRkcmVzc0xhYmVsLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJCi0JCXdlYlVybCA9IG5ldyBUZXh0KGFkZHJlc3NCYXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJd2ViVXJsLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXdlYlVybC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJd2ViVXJsLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCXdlYk5hdmlnYXRlQnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbih3ZWJOYXZpZ2F0ZUJ1dHRvbik7Ci0JCQl9Ci0JCX0pOwotCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgdG8gdGhlIHdlYiBzaXRlIHNwZWNpZmllZCBpbiB0aGUgVGV4dCBhcmVhIGRlZmluZWQgYWJvdmUKLQkJd2ViTmF2aWdhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGFkZHJlc3NCYXIsIFNXVC5QVVNIKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Hby50ZXh0IikpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuTmF2aWdhdGUod2ViVXJsLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdlYiBicm93c2VyIE9sZUZyYW1lLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCcm93c2VyRnJhbWUoKSB7Ci0JCS8vIEV2ZXJ5IGNvbnRyb2wgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgT2xlRnJhbWU6Ci0JCXdlYkZyYW1lID0gbmV3IE9sZUZyYW1lKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXdlYkZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBXZWIgYnJvd3NlciBzdGF0dXMgYXJlYS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RhdHVzQXJlYSgpIHsKLQkJLy8gQWRkIGEgcHJvZ3Jlc3MgYmFyIHRvIGRpc3BsYXkgZG93bmxvYWRpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24KLQkJd2ViUHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIoZGlzcGxheUFyZWEsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXdlYlByb2dyZXNzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwkJCi0KLQkJLy8gQWRkIGEgbGFiZWwgZm9yIGRpc3BsYXlpbmcgc3RhdHVzIG1lc3NhZ2VzIGFzIHRoZXkgYXJlIHJlY2VpdmVkIGZyb20gdGhlIGNvbnRyb2wKLQkJd2ViU3RhdHVzID0gbmV3IExhYmVsKGRpc3BsYXlBcmVhLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl3ZWJTdGF0dXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXdlYlN0YXR1cy5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JfQkKLQotCS8qKgotCSAqIENyZWF0ZXMgV2ViIGJyb3dzZXIgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnJvd3NlckNvbnRyb2woKSB7Ci0JCXRyeSB7Ci0JCQkvLyBDcmVhdGUgYW4gQXV0b21hdGlvbiBvYmplY3QgZm9yIGFjY2VzcyB0byBleHRlbmRlZCBjYXBhYmlsaXRpZXMKLQkJCXdlYkNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKHdlYkZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCQlWYXJpYW50IGRvd25sb2FkID0gbmV3IFZhcmlhbnQoRExDVExfTk9fU0NSSVBUUyk7Ci0JCQl3ZWJDb250cm9sU2l0ZS5zZXRTaXRlUHJvcGVydHkoRElTUElEX0FNQklFTlRfRExDT05UUk9MLCBkb3dubG9hZCk7Ci0JCQlPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbih3ZWJDb250cm9sU2l0ZSk7Ci0JCQl3ZWJCcm93c2VyID0gbmV3IE9sZVdlYkJyb3dzZXIob2xlQXV0b21hdGlvbik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJLy8gQ3JlYXRpb24gbWF5IGhhdmUgZmFpbGVkIGJlY2F1c2UgY29udHJvbCBpcyBub3QgaW5zdGFsbGVkIG9uIG1hY2hpbmUKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHdlYkZyYW1lLCBTV1QuQk9SREVSKTsKLQkJCU9sZVBsdWdpbi5sb2dFcnJvcihPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wiKSwgZXgpOwotCQkJbGFiZWwuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBSZXNwb25kIHRvIFByb2dyZXNzQ2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgUHJvZ3Jlc3MgYmFyCi0JCXdlYkNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5Qcm9ncmVzc0NoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYXJpYW50IHByb2dyZXNzID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCVZhcmlhbnQgbWF4UHJvZ3Jlc3MgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQkJaWYgKHByb2dyZXNzID09IG51bGwgfHwgbWF4UHJvZ3Jlc3MgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCXdlYlByb2dyZXNzLnNldE1heGltdW0obWF4UHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCXdlYlByb2dyZXNzLnNldFNlbGVjdGlvbihwcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gUmVzcG9uZCB0byBTdGF0dXNUZXh0Q2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgU3RhdHVzIFRleHQgbGFiZWwKLQkJd2ViQ29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihPbGVXZWJCcm93c2VyLlN0YXR1c1RleHRDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFyaWFudCBzdGF0dXNUZXh0ID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCWlmIChzdGF0dXNUZXh0ID09IG51bGwpCXJldHVybjsKLQkJCQlTdHJpbmcgdGV4dCA9IHN0YXR1c1RleHQuZ2V0U3RyaW5nKCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJd2ViU3RhdHVzLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSByZWFkeSBzdGF0ZSBhbmQgcHJpbnQgb3V0IHRoZSBjdXJyZW50IHN0YXRlIAotCQl3ZWJDb250cm9sU2l0ZS5hZGRQcm9wZXJ0eUxpc3RlbmVyKE9sZVdlYkJyb3dzZXIuRElTUElEX1JFQURZU1RBVEUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBPTEUuUFJPUEVSVFlfQ0hBTkdJTkcpIHJldHVybjsKLQkJCQlpbnQgc3RhdGUgPSB3ZWJCcm93c2VyLmdldFJlYWR5U3RhdGUoKTsKLQkJCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX1VOSU5JVElBTElaRUQ6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuVW5pbml0aWFsaXplZC50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0xPQURJTkc6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuTG9hZGluZy50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0xPQURFRDoKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5Mb2FkZWQudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfSU5URVJBQ1RJVkU6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuSW50ZXJhY3RpdmUudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfQ09NUExFVEU6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuQ29tcGxldGUudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIGFjdGl2ZSBjb21tYW5kIHN0YXRlcwotCQl3ZWJDb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKE9sZVdlYkJyb3dzZXIuQ29tbWFuZFN0YXRlQ2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50eXBlICE9IE9sZVdlYkJyb3dzZXIuQ29tbWFuZFN0YXRlQ2hhbmdlKSByZXR1cm47Ci0JCQkJZmluYWwgaW50IGNvbW1hbmRJRCA9Ci0JCQkJCShldmVudC5hcmd1bWVudHNbMF0gIT0gbnVsbCkgPyBldmVudC5hcmd1bWVudHNbMF0uZ2V0SW50KCkgOiAwOwotCQkJCWZpbmFsIGJvb2xlYW4gY29tbWFuZEVuYWJsZWQgPQotCQkJCQkoZXZlbnQuYXJndW1lbnRzWzFdICE9IG51bGwpID8gZXZlbnQuYXJndW1lbnRzWzFdLmdldEJvb2xlYW4oKSA6IGZhbHNlOwotCQkJCQotCQkJCXN3aXRjaCAoY29tbWFuZElEKSB7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5DU0NfTkFWSUdBVEVCQUNLOgotCQkJCQkgCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRFbmFibGVkKGNvbW1hbmRFbmFibGVkKTsKLQkJCQkJIAlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLkNTQ19OQVZJR0FURUZPUldBUkQ6Ci0JCQkJCSAJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChjb21tYW5kRW5hYmxlZCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGluIHBsYWNlIGFjdGl2YXRlIHRoZSBBY3RpdmVYIGNvbnRyb2wJCQotCQlhY3RpdmF0ZWQgPSAod2ViQ29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpID09IE9MRS5TX09LKTsKLQkJaWYgKGFjdGl2YXRlZCkgd2ViQnJvd3Nlci5Hb0hvbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU1YzJlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgT2xlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9sZVBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgZmluYWwgaW50Ci0JCWJpQmFjayA9IDAsCi0JCWJpRm9yd2FyZCA9IDEsCi0JCWJpSG9tZSA9IDIsCi0JCWJpU3RvcCA9IDMsCi0JCWJpUmVmcmVzaCA9IDQsCi0JCWJpU2VhcmNoID0gNTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpY29ucy9iYWNrd2FyZF9uYXYuZ2lmIiwKLQkJImljb25zL2ZvcndhcmRfbmF2LmdpZiIsCi0JCSJpY29ucy9ob21lX25hdi5naWYiLAotCQkiaWNvbnMvc3RvcF9uYXYuZ2lmIiwKLQkJImljb25zL3JlZnJlc2hfbmF2LmdpZiIsCi0JCSJpY29ucy9zZWFyY2hfbmF2LmdpZiIgfTsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2VzW107Ci0Jc3RhdGljIEZvbnQgIGJyb3dzZXJGb250OwotICAgCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBPTEUgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBPbGVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPbGVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJaW1hZ2VzW2ldID0gZ2V0SW1hZ2VGcm9tUGx1Z2luKHBsdWdpbi5nZXRCdW5kbGUoKSwgaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCWlmIChpbWFnZXNbaV0gPT0gbnVsbCkgewotCQkJCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSwgbnVsbCk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJyb3dzZXJGb250ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnJvd3NlckZvbnQgPSBuZXcgRm9udCAobnVsbCwgIk1TIFNhbnMgU2VyaWYiLCA4LCBTV1QuTlVMTCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCX0KLQkJfQotCQlpZiAoaW1hZ2VzID09IG51bGwgfHwgYnJvd3NlckZvbnQgPT0gbnVsbCkgewotCQkJZnJlZVJlc291cmNlcygpOwotCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JCWlmIChicm93c2VyRm9udCAhPSBudWxsKSBicm93c2VyRm9udC5kaXNwb3NlICgpOwotCQlicm93c2VyRm9udCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYW4gaW1hZ2UgZnJvbSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBwZCB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZm9yIHRoZSBwbHVnaW4gd2l0aCB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaWNvblBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tUGx1Z2luKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpY29uUGF0aCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVybCwgaWNvblBhdGgpOwotCQkJaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoaXMpOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDk4ODEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgYW4gT2xlQXV0b21hdGlvbiBvYmplY3QgdXNlZCB0byBzZW5kIGNvbW1hbmRzCi0gKiB0byBhIFdpbjMyICJTaGVsbC5FeHBsb3JlciIgT0xFIGNvbnRyb2wuCi0gKiAKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG1hbmFnZSB0aGUgc2V0dXAsIHR5cGljYWwgdXNlIGFuZCB0ZWFyZG93biBvZgotICogYSBzaW1wbGUgd2ViIGJyb3dzZXIuCi0gKi8KLWNsYXNzIE9sZVdlYkJyb3dzZXIgewotCS8qIFNlZSB0aGUgV2luZG93cyBQbGF0Zm9ybSBTREsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgKiBPTEUgY29udHJvbCB1c2VkIGhlcmUgYW5kIGl0cyB1c2FnZS4KLQkgKi8KLQkvLyBHZW5lcmF0ZWQgZnJvbSB0eXBlbGliIGZpbGVuYW1lOiBzaGRvY3Z3LmRsbAotCi0JLy8gQ29uc3RhbnRzIGZvciBXZWJCcm93c2VyIENvbW1hbmRTdGF0ZUNoYW5nZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19VUERBVEVDT01NQU5EUyA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19OQVZJR0FURUZPUldBUkQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19OQVZJR0FURUJBQ0sgPSAyOwotCi0JLy8gQ09uc3RhbnRzIGZvciBXZWIgQnJvd3NlciBSZWFkeVN0YXRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURJTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfTE9BREVEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0lOVEVSQUNUSVZFID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0NPTVBMRVRFID0gNDsKLQkKLQkvLyBXZWIgQnJvd3NlciBDb250cm9sIEV2ZW50cyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCZWZvcmVOYXZpZ2F0ZSAgICAgICAgPSAxMDA7IC8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0by4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOYXZpZ2F0ZUNvbXBsZXRlICAgICAgPSAxMDE7IC8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byBiZWNvbWVzIHZpc2libGUgYW5kIGVudGVycyB0aGUgbmF2aWdhdGlvbiBzdGFjay4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0dXNUZXh0Q2hhbmdlICAgICAgPSAxMDI7IC8vIFN0YXR1c2JhciB0ZXh0IGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NDaGFuZ2UgICAgICAgID0gMTA4OyAvLyBGaXJlZCB3aGVuIGRvd25sb2FkIHByb2dyZXNzIGlzIHVwZGF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG93bmxvYWRDb21wbGV0ZSAgICAgID0gMTA0OyAvLyBEb3dubG9hZCBvZiBwYWdlIGNvbXBsZXRlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbW1hbmRTdGF0ZUNoYW5nZSAgICA9IDEwNTsgLy8gVGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBjb21tYW5kIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb3dubG9hZEJlZ2luICAgICAgICAgPSAxMDY7IC8vIERvd25sb2FkIG9mIGEgcGFnZSBzdGFydGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ld1dpbmRvdyAgICAgICAgICAgICA9IDEwNzsgLy8gRmlyZWQgd2hlbiBhIG5ldyB3aW5kb3cgc2hvdWxkIGJlIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGl0bGVDaGFuZ2UgICAgICAgICAgID0gMTEzOyAvLyBEb2N1bWVudCB0aXRsZSBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lQmVmb3JlTmF2aWdhdGUgICA9IDIwMDsgLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOYXZpZ2F0ZUNvbXBsZXRlID0gMjAxOyAvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8gaW4gYSBmcmFtZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZU5ld1dpbmRvdyAgICAgICAgPSAyMDQ7IC8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1aXQgICAgICAgICAgICAgICAgICA9IDEwMzsgLy8gRmlyZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBxdWl0aW5nLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd01vdmUgICAgICAgICAgICA9IDEwOTsgLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gbW92ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93UmVzaXplICAgICAgICAgID0gMTEwOyAvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBzaXplZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBY3RpdmF0ZSAgICAgICAgPSAxMTE7IC8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIGFjdGl2YXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9wZXJ0eUNoYW5nZSAgICAgICAgPSAxMTI7IC8vIEZpcmVkIHdoZW4gdGhlIFB1dFByb3BlcnR5IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0KLQkvLyBXZWIgQnJvd3NlciBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX1JFQURZU1RBVEUgPSAtNTI1OwotCi0JcHJpdmF0ZSBPbGVBdXRvbWF0aW9uICBvbGVBdXRvbWF0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICogPHA+Ci0JICogVHlwaWNhbCB1c2U6PGJyPgotCSAqIDxjb2RlPgotCSAqIE9sZUNvbnRyb2xTaXRlIG9sZUNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKG9sZUZyYW1lLCBzdHlsZSwgIlNoZWxsLkV4cGxvcmVyIik7PGJyPgotCSAqIE9sZUF1dG9tYXRpb24gb2xlQXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKG9sZUNvbnRyb2xTaXRlKTs8YnI+Ci0JICogT2xlV2ViQnJvd3NlciB3ZWJCcm93c2VyID0gbmV3IE9sZVdlYkJyb3dzZXIob2xlQ29udHJvbFNpdGUsIG9sZUF1dG9tYXRpb24pOzxicj4KLQkgKiA8L2NvZGU+Ci0JICogCi0gICAgICogQHBhcmFtIG9sZUF1dG9tYXRpb24gdGhlIE9sZUF1dG9tYXRpb24gb2JqZWN0IGZvciB0aGlzIGNvbnRyb2wuCi0gICAgICogQHBhcmFtIG9sZUNvbnRyb2xTaXRlIHRoZSBPbGVDb250cm9sU2l0ZSBvYmplY3QgZm9yIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgT2xlV2ViQnJvd3NlcihPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24pIHsKLQkJdGhpcy5vbGVBdXRvbWF0aW9uID0gb2xlQXV0b21hdGlvbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG9sZUF1dG9tYXRpb24gIT0gbnVsbCkgb2xlQXV0b21hdGlvbi5kaXNwb3NlKCk7Ci0JCW9sZUF1dG9tYXRpb24gPSBudWxsOwotCX0KLQkKLQkvKgotCSAqIEludGVyYWN0IHdpdGggdGhlIENvbnRyb2wgdmlhIE9MRSBBdXRvbWF0aW9uCi0JICogCi0JICogTm90ZTogWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRHMgaWYgeW91IGtub3cgdGhlbSBiZWZvcmVoYW5kCi0JICogICAgICAgdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5LCBidXQgeW91IGluY3JlYXNlIGNvdXBsaW5nCi0JICogICAgICAgdG8gdGhlIGNvbnRyb2wuCi0JICovCi0JIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgdGl0bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCB3ZWIgcGFnZSB0aXRsZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uTmFtZSgpIHsKLQkJLy8gZGlzcGlkPTIxMCwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvbk5hbWUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTG9jYXRpb25OYW1lIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0JTVFIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBVUkwgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpIHsKLQkJLy8gZGlzcGlkPTIxMSwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvblVSTCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJMb2NhdGlvblVSTCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZUF1dG9tYXRpb24uZ2V0UHJvcGVydHkoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSAhPSBPTEUuVlRfQlNUUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldFN0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2wsIG9uZSBvZjoKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRDsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfTE9BRElORzsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfTE9BREVEOwotCSAqICAgICAgICAgUkVBRFlTVEFURV9JTlRFUkFDVElWRTsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfQ09NUExFVEUuCi0JICovCi0JcHVibGljIGludCBnZXRSZWFkeVN0YXRlKCkgewotCQkvLyBkaXNwaWQ9NDI5NDk2Njc3MSwgdHlwZT1QUk9QR0VULCBuYW1lPSJSZWFkeVN0YXRlIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlJlYWR5U3RhdGUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0k0KSByZXR1cm4gLTE7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldEludCgpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0JhY2soKSB7Ci0JCi0JCS8vIGRpc3BpZD0xMDAsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0JhY2siCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29CYWNrIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0ZvcndhcmQoKSB7Ci0JCi0JCS8vIGRpc3BpZD0xMDEsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0ZvcndhcmQiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29Gb3J3YXJkIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gaG9tZSBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIEdvSG9tZSgpIHsKLQkJLy8gZGlzcGlkPTEwMiwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvSG9tZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb0hvbWUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byB1c2VyLXNwZWNpZmllZCBXZWIgc2VhcmNoIGdhdGV3YXkuCi0JICovCi0JcHVibGljIHZvaWQgR29TZWFyY2goKSB7Ci0JCS8vIGRpc3BpZD0xMDMsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb1NlYXJjaCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb1NlYXJjaCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIGEgcGFydGljdWxhciBVUkwuCi0JICovCi0JcHVibGljIHZvaWQgTmF2aWdhdGUoU3RyaW5nIHVybCkgewotCQkvLyBkaXNwaWQ9MTA0LCB0eXBlPU1FVEhPRCwgbmFtZT0iTmF2aWdhdGUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkKLQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07IC8vIGlkZW50aWZpZXIgb2YgYXJndW1lbnQKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjdXJyZW50bHkgdmlld2VkIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwbGF0Zm9ybS1kZWZpbmVkIHJlc3VsdCBjb2RlIGZvciB0aGUgIlJlZnJlc2giIG1ldGhvZCBpbnZvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgUmVmcmVzaCgpewotCQkvLyBkaXNwaWQ9IDQyOTQ5NjY3NDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJSZWZyZXNoIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlJlZnJlc2gifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlTm9SZXBseShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgbG9hZGluZyBvZiB0aGUgY3Vycm5ldCBwYWdlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGxhdGZvcm0tZGVmaW5lZCByZXN1bHQgY29kZSBmb3IgdGhlICJTdG9wIiBtZXRob2QgaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIFN0b3AoKSB7Ci0JCS8vIGRpc3BpZD0xMDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJTdG9wIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlN0b3AifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM5YWYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjBhZTBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCi1zb3VyY2UucGFpbnQuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDhlN2NlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIFBhaW50IFRvb2w8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIFBhaW50IFRvb2w8L2gyPgotCi08cD4JCi1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgU1dUIGdyYXBoaWNzIG9wZXJhdGlvbnMgaW4gdGhlIGZvcm0gb2YgYQotcnVkaW1lbnRhcnkgYml0bWFwIHBhaW50aW5nIHByb2dyYW0uICBUaGUgUGFpbnQgVG9vbCBpbXBsZW1lbnRhdGlvbiBhbHNvIAotZGVtb25zdHJhdGVzIGEgbWVjaGFuaXNtIGZvciBtYW5hZ2luZyB0aW1lZCBHVUkgb3BlcmF0aW9ucyBpbiB0aGUgYmFja2dyb3VuZCAKLXRoYXQgYXJlIHRyaWdnZXJlZCBieSB1c2VyIGlucHV0LgotPC9wPgotPHA+CQotU2VsZWN0IGEgdG9vbCB3aXRoIHdoaWNoIHRvIGRyYXcgaW4gdGhlIGRyYXdpbmcgYXJlYS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0b29scwotdG8gY2hvb3NlIGZyb20gb24gdGhlIHRvb2xiYXIuICBUbyBjaGFuZ2UgdGhlIGNvbG9yIHNlbGVjdGlvbiwgY2xpY2sgb24gYSBjb2xvciBpbiB0aGUKLXBhbGV0dGUgYmVsb3cgdGhlIGRyYXdpbmcgYXJlYTsgbGVmdC1jbGljayB0byBzZXQgdGhlIGZvcmVncm91bmQgY29sb3IsIHJpZ2h0LWNsaWNrIHRvIHNldCB0aGUKLWJhY2tncm91bmQgY29sb3IuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51IHNlbGVjdCA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+T3RoZXI8L3N0cm9uZz4uICAKLUluIHRoZSA8c3Ryb25nPlNob3cgVmlldzwvc3Ryb25nPiBkaWFsb2csIGV4cGFuZCA8c3Ryb25nPlNXVCBFeGFtcGxlczwvc3Ryb25nPiBhbmQgc2VsZWN0Ci10aGUgdmlldyBuYW1lZCA8c3Ryb25nPlBhaW50PC9zdHJvbmc+LiBBIHZpZXcgY29udGFpbmluZyB0aGUgcGFpbnQgcHJvZ3JhbSB3aWxsIGFwcGVhci4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5QYWludDwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2ljb25zL3BhaW50X2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2ljb25zL3BhaW50X2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTQ1ZGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9pY29ucy9wYWludF9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ3ODc1OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVFBhaW50RXhhbXBsZS5uYW1lID0gU1dUIFBhaW50IEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LlBhaW50RXhhbXBsZS5uYW1lID0gUGFpbnQKLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5QYWludEV4YW1wbGUubmFtZSA9IFBhaW50Ci1sYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgU1dUIGdyYXBoaWNzIG9wZXJhdGlvbnMgaW4gdGhlIGZvcm0gb2YgYSBcCi0JcnVkaW1lbnRhcnkgYml0bWFwIHBhaW50aW5nIHByb2dyYW0uICBUaGUgQWlyYnJ1c2ggVG9vbCBpbXBsZW1lbnRhdGlvbiBhbHNvIFwKLQlkZW1vbnN0cmF0ZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHRpbWVkIEdVSSBvcGVyYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kIFwKLQl0aGF0IGFyZSB0cmlnZ2VyZWQgYnkgdXNlciBpbnB1dC5cblxuXAotCVNlbGVjdCBhIHRvb2wgd2l0aCB3aGljaCB0byBkcmF3IGluIHRoZSBkcmF3aW5nIGFyZWEuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdG9vbHMgXAotCXRvIGNob29zZSBmcm9tIG9uIHRoZSB0b29sYmFyLiAgVG8gY2hhbmdlIHRoZSBjb2xvciBzZWxlY3Rpb24sIGNsaWNrIG9uIGEgY29sb3IgaW4gdGhlIFwKLQlwYWxldHRlIGJlbG93IHRoZSBkcmF3aW5nIGFyZWE6IGxlZnQtY2xpY2sgZm9yIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCByaWdodC1jbGljayBmb3IgdGhlIFwKLQliYWNrZ3JvdW5kIGNvbG9yLlxuXG5cCi0JVXNlcyBTV1QncyBHQyBhbmQgRm9udERpYWxvZywgYW5kIEpGYWNlJ3MgSW5wdXREaWFsb2cgYW5kIGFjdGlvbiBzZXQgc3VwcG9ydC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMWM4ODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludCIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUUGFpbnRFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LlBhaW50UGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwYWludC5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5QYWludEV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL3BhaW50X2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQuUGFpbnRWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5QYWludEV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL3BhaW50X2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTk0MzdmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWludFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIFBhaW50UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgdGhlIFBhaW50IHBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgUGFpbnRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXBsdWdpbi5nZXRMb2coKS5sb2coCi0JCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50Vmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyNTBmNDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogVGhlIHZpZXcgZm9yIHRoZSBwYWludCBhcHBsaWNhdGlvbi4KLSAqIEFsbCByZW5kZXJpbmcgaGFwcGVucyBpbnNpZGUgdGhlIGFyZWEgY3JlYXRlZCBieSBjcmVhdGVQYXJ0Q29udHJvbCgpLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYWludFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JUGFpbnRFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludCB2aWV3LgotCSAqLwotCXB1YmxpYyBQYWludFZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZS4KLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbnN0YW5jZSA9IG5ldyBQYWludEV4YW1wbGUocGFyZW50KTsKLQkJaW5zdGFuY2UuY3JlYXRlR1VJKHBhcmVudCk7Ci0KLQkJLyoqKiBBZGQgdG9vbGJhciBjb250cmlidXRpb25zICoqKi8KLQkJZmluYWwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlJVG9vbEJhck1hbmFnZXIgdG9vbGJhck1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCVRvb2wgdG9vbHNbXSA9IFBhaW50RXhhbXBsZS50b29sczsKLQkJU3RyaW5nIGdyb3VwID0gdG9vbHNbMF0uZ3JvdXA7Ci0JCXRvb2xiYXJNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoZ3JvdXApKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7IGkrKykgewotCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlpZiAoIXRvb2wuZ3JvdXAuZXF1YWxzKGdyb3VwKSkgewotCQkJCXRvb2xiYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJCXRvb2xiYXJNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIodG9vbC5ncm91cCkpOwotCQkJfQotCQkJZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJUGFpbnRBY3Rpb24gYWN0aW9uID0gbmV3IFBhaW50QWN0aW9uKHRvb2wpOwotCQkJdG9vbGJhck1hbmFnZXIuYXBwZW5kVG9Hcm91cChncm91cCwgYWN0aW9uKTsKLQkJCWlmIChpID09IFBhaW50RXhhbXBsZS5EZWZhdWx0X3Rvb2wgfHwgaSA9PSBQYWludEV4YW1wbGUuRGVmYXVsdF9maWxsIHx8IGkgPT0gUGFpbnRFeGFtcGxlLkRlZmF1bHRfbGluZXN0eWxlKSB7Ci0JCQkJYWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0KLQkJaW5zdGFuY2Uuc2V0RGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBEaXNwbGF5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgd2UncmUgdXNpbmcKLQkgKi8KLQlwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gaW5zdGFuY2UuZ2V0RGlzcGxheSgpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWluc3RhbmNlLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQWN0aW9uIHNldCBnbHVlLgotCSAqLwotCWNsYXNzIFBhaW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHJpdmF0ZSBpbnQgc3R5bGU7Ci0JCXByaXZhdGUgUnVubmFibGUgYWN0aW9uOwotCQlwdWJsaWMgUGFpbnRBY3Rpb24oVG9vbCB0b29sKSB7Ci0JCQlzdXBlcigpOwotCQkJU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJCXNldElkKGlkKTsKLQkJCXN0eWxlID0gdG9vbC50eXBlID09IFNXVC5SQURJTyA/IElBY3Rpb24uQVNfUkFESU9fQlVUVE9OIDogSUFjdGlvbi5BU19QVVNIX0JVVFRPTjsKLQkJCWFjdGlvbiA9IHRvb2wuYWN0aW9uOwotCQkJc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmxhYmVsIikpOwotCQkJc2V0VG9vbFRpcFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGlkICsgIi50b29sdGlwIikpOwotCQkJc2V0RGVzY3JpcHRpb24oUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGlkICsgIi5kZXNjcmlwdGlvbiIpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoCi0JCQkJCVBhaW50RXhhbXBsZS5jbGFzcywKLQkJCQkJUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGlkICsgIi5pbWFnZSIpKSk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRTdHlsZSgpIHsgcmV0dXJuIHN0eWxlOyB9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsgYWN0aW9uLnJ1bigpOyB9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjc3MjU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NGIwNTc4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzd3RleGFtcGxlcy5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgc3JjLwotICAgICAgICAgICAgICAgCi1zb3VyY2Uuc3d0ZXhhbXBsZXMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9hZGRyZXNzYm9va19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9hZGRyZXNzYm9va19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjA0YzJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfYWRkcmVzc2Jvb2tfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEFkZHJlc3MgQm9vayBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIEFkZHJlc3MgQm9vazwvaDI+Ci0KLTxwPgotVGhlIEFkZHJlc3NCb29rIGV4YW1wbGUgc2hvd3MgaG93IGEgVGFibGUgY29udHJvbCBjYW4gYmUgdXNlZCB0bwotcHJlc2VudCBpbmZvcm1hdGlvbiBpbiBhIHRhYnVsYXIgZm9ybWF0LiBUaGUgYXBwbGljYXRpb24gY2FuIHNhdmUgYW5kIGxvYWQgZGF0YSAKLWZyb20gYSBmaWxlLCBzb3J0IHRoZSBlbnRyaWVzLCBhbmQgc2VhcmNoIGZvciBzdHJpbmdzIHdpdGhpbiB0aGUgZmllbGRzLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkFkZHJlc3MgQm9vazwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmM0MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQnJvd3NlcjwvaDI+Ci0KLTxwPgotVGhlIEJyb3dzZXIgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuIAotSXQgY29uc2lzdHMgb2YgYSBjb21wb3NpdGUgY29udGFpbmluZyBhIEJyb3dzZXIgd2lkZ2V0IHRvIHJlbmRlciBIVE1MIGFuZCBzb21lCi1hZGRpdGlvbmFsIHdpZGdldHMgdG8gaW1wbGVtZW50IGFjdGlvbnMgY29tbW9ubHkgZm91bmQgb24gYnJvd3NlcnMgKHRvb2xiYXIKLXdpdGggYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCBidXR0b25zLCBzdGF0dXMgYmFyIGV0Yy4pLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5XZWIgQnJvd3Nlcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jbGlwYm9hcmRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY2xpcGJvYXJkX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmU5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jbGlwYm9hcmRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENsaXBib2FyZCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIENsaXBib2FyZDwvaDI+Ci0KLTxwPgotVGhlIENsaXBib2FyZCBleGFtcGxlIHNob3dzIHRoZSB2YXJpb3VzIFNXVCBjbGlwYm9hcmQgdHJhbnNmZXIgdHlwZXMgaW4gdXNlLiAgVGhlIGV4YW1wbGUgY2FuCi1jdXQsIGNvcHkgYW5kIHBhc3RlIHVzaW5nIFRleHQsIFJURiwgSFRNTCBhbmQgRmlsZSB0cmFuc2ZlciB0eXBlcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQuQ2xpcGJvYXJkRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5DbGlwYm9hcmQ8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjk5YTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ29udHJvbHMgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5Db250cm9sczwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVmMjk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDdXN0b20gQ29udHJvbHM8L2gyPgotCi08cD4KLVRoZSBDdXN0b20gQ29udHJvbHMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGVtdWxhdGVkIFNXVCBjb250cm9scy4gCi1JdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlIHVzZXIgCi10byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IGVtdWxhdGVkIGNvbnRyb2wuCi1UaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyBlYWNoIGNvbnRyb2wuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ3VzdG9tQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q3VzdG9tIENvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9kbmRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxYWE1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRHJhZyBhbmQgRHJvcCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIERyYWcgYW5kIERyb3A8L2gyPgotCi08cD4KLVRoZSBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc2hvd3MgdGhlIHZhcmlvdXMgU1dUIGRhdGEgdHJhbnNmZXIgdHlwZXMgaW4gdXNlLiAgVGhlIGV4YW1wbGUgY2FuCi1kcmFnIGFuZCBkcm9wIHVzaW5nIFRleHQsIFJURiwgSFRNTCBhbmQgRmlsZSB0cmFuc2ZlciB0eXBlcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuRE5ERXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5EcmFnIGFuZCBEcm9wPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9maWxldmlld2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyMWNjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEZpbGUgVmlld2VyIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gRmlsZSBWaWV3ZXI8L2gyPgotCi08cD4KLVRoZSBGaWxlIFZpZXdlciBleGFtcGxlIHNob3dzIGhvdyBhIHNpbXBsZSBhcHBsaWNhdGlvbiBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgU1dULgotVGhpcyBhcHBsaWNhdGlvbiBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBuYXZpZ2F0ZSBmaWxlcyBhbmQgZm9sZGVycyBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gYW5kIG1hbmlwdWxhdGUgdGhlbSB1c2luZyBkcmFnIGFuZCBkcm9wLgotSXQgdXNlcyBhbHRlcm5hdGUgdGhyZWFkcyBmb3IgbG9uZyBhY3Rpb25zIGFuZCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgVHJlZSwKLVRhYmxlLCBhbmQgVG9vbGJhciB3aWRnZXRzIGFuZCB0aGUgUHJvZ3JhbSBjbGFzcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyLkZpbGVWaWV3ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+RmlsZSBWaWV3ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hlbGxvd29ybGRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2VjN2E0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSGVsbG8gV29ybGQgRXhhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSGVsbG8gV29ybGQ8L2gyPgotCi08cD4KLVRoZSBIZWxsbyBXb3JsZCBleGFtcGxlcyBhcmUgYSBzZXQgb2YgaW50cm9kdWN0b3J5IGV4YW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gZ2V0IHN0YXJ0ZWQgCi1vbiBjcmVhdGluZyBhbiBhcHBsaWNhdGlvbiB3aXRoIFNXVC4gIFRoZXkgY292ZXIgdGhlIGNyZWF0aW9uIG9mIGEgc2hlbGwsIHRoZSB1c2Ugb2YgZXZlbnQgbGlzdGVuZXJzLCAKLXVzaW5nIGxheW91dHMsIHByb2Nlc3NpbmcgZXZlbnRzIGluIGFuIGV2ZW50IGxvb3AsIGFuZCBkcmF3aW5nIHdpdGggYSBHcmFwaGljcyBDb250ZXh0LgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgMTwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIG9wZW4gYSBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgMjwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhIExhYmVsIGluc2lkZSBvZiB0aGUgU2hlbGwuCi08L3A+Ci0KLTxoND5IZWxsbyBXb3JsZCAzPC9oND4KLTxwPgotVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBsaXN0ZW5lciBtZWNoYW5pc20gdG8gcmVzaXplIHRoZSBMYWJlbAotd2hlbiB0aGUgU2hlbGwgc2l6ZSBjaGFuZ2VzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgNDwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgTGF5b3V0IHRvIHJlc2l6ZSB0aGUgTGFiZWwKLXdoZW4gdGhlIFNoZWxsIHNpemUgY2hhbmdlcy4KLTwvcD4KLQotPGg0PkhlbGxvIFdvcmxkIDU8L2g0PgotPHA+Ci1UaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkKLW9uIGFuIFNXVCBDb250cm9sIHVzaW5nIGEgR3JhcGhpY3MgQ29udGV4dC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZFsxLTVdPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IG9uZSBvZiB0aGUgPHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPiBpdGVtcyBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9ob3ZlcmhlbHBfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ViODliMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSG92ZXIgSGVscCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIEhvdmVyIEhlbHA8L2gyPgotCi08cD4KLVRoZSBIb3ZlciBIZWxwIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBjdXN0b20gdG9vbHRpcHMgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydAotb24gdmFyaW91cyBTV1QgY29udHJvbHMgaW5jbHVkaW5nIEJ1dHRvbnMsIFRhYmxlSXRlbXMsIFRvb2xJdGVtcyBhbmQgVHJlZUl0ZW1zLgotVG8gc2VlIHRoZSBjdXN0b20gdG9vbHRpcHMgaW4gYWN0aW9uLCBob3ZlciBvdmVyIGFuIGl0ZW0gb3IgYnV0dG9uIGluIHRoZSBVSSwgYW5kCi1ub3RpY2UgdGhhdCBpbWFnZXMgYXBwZWFyIGluIHRoZSBsZWZ0LWhhbmQgY29ybmVyIG9mIHRoZSB0b29sdGlwLgotVG8gc2VlIHRoZSBjdXN0b20gaG92ZXIgaGVscCBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJIHVudGlsCi10aGUgdG9vbHRpcCBpcyBkaXNwbGF5ZWQuICBUaGVuLCB3aXRob3V0IG1vdmluZyB0aGUgbW91c2UsIHByZXNzIDxzdHJvbmc+RjE8L3N0cm9uZz4gYW5kIGEgbmV3Ci1TaGVsbCB3aWxsIGJlIHNob3duIHdpdGggdGhlIGV4dGVuZGVkIGhvdmVyIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBVSSBlbGVtZW50LgotPC9wPgkKLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ob3ZlcmhlbHAuSG92ZXJIZWxwPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkhvdmVyIEhlbHA8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ltYWdlYW5hbHl6ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTg0Y2RhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSW1hZ2UgQW5hbHl6ZXIgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBJbWFnZSBBbmFseXplcjwvaDI+Ci0KLTxwPgotVGhlIEltYWdlQW5hbHl6ZXIgZXhhbXBsZSBvcGVucyBpbWFnZSBmaWxlcyBhbmQgZGlzcGxheXMgdGhlaXIgdmlzdWFsIGNvbnRlbnRzIGFuZAotYW4gaW1hZ2UgZGF0YSBzdW1tYXJ5LgotVGhlIHVzZXIgY2FuIG1ha2UgYWRqdXN0bWVudHMgdG8gdmFyaW91cyBlbGVtZW50cyBvZiB0aGUgaW1hZ2Ugc3VjaCBhcyBzY2FsaW5nIGFuZCBBbHBoYQotYmxlbmRpbmcsIGFuZCBjYW4gc2F2ZSB0aGVzZSBjaGFuZ2VzIHRvIGEgZmlsZS4KLTwvcD4KLTxwPgotVGhlIEltYWdlQW5hbHl6ZXIgY2FuIGxvYWQgYW5kIGRpc3BsYXkgaW1hZ2UgZmlsZXMgb2YgdHlwZSBHSUYsIEpQRUcsIEJNUCwgSUNPLCBhbmQgUE5HLgotSWYgYSBsb2FkZWQgZmlsZSBpcyBhbiBpbnRlcmxhY2VkIEdJRiBvciBQTkcsIG9yIGEgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIDxzdHJvbmc+SW5jcmVtZW50YWwgRGlzcGxheTwvc3Ryb25nPiBpcyBzZWxlY3RlZCwKLXRoZW4gdGhlIEltYWdlQW5hbHl6ZXIgd2lsbCBkaXNwbGF5IHRoZSBpbWFnZSBpbmNyZW1lbnRzIGFzIHRoZXkgYXJlIGxvYWRlZC4KLUlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIGFuaW1hdGVkIEdJRiwgdGhlbiB0aGUgPHN0cm9uZz5OZXh0PC9zdHJvbmc+LCA8c3Ryb25nPlByZXZpb3VzPC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5BbmltYXRlPC9zdHJvbmc+IGJ1dHRvbnMgYmVjb21lIGVuYWJsZWQsCi1hbmQgY2FuIGJlIHVzZWQgdG8gY3ljbGUgdGhyb3VnaCBhbmQgYW5pbWF0ZSB0aGUgaW1hZ2VzIGluIHRoZSBmaWxlLiBJZiBhIEdJRiBkZWZpbmVzIGEgYmFja2dyb3VuZCBjb2xvciwKLWFzIG1hbnkgYW5pbWF0ZWQgR0lGcyBkbywgdGhlbiBzZWxlY3RpbmcgPHN0cm9uZz5CYWNrZ3JvdW5kPC9zdHJvbmc+IHdpbGwgdXNlIHRoZSBHSUYncyBiYWNrZ3JvdW5kIGNvbG9yLgotSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3ksIHdoaWNoIGlzIHBvc3NpYmxlIHdpdGggaW1hZ2VzIG9mIHR5cGUgR0lGLCBQTkcsIGFuZCBJQ08sIHRoZW4gc2VsZWN0aW5nIDxzdHJvbmc+RGlzcGxheSBNYXNrPC9zdHJvbmc+IHdpbGwgZHJhdyB0aGUgaW1hZ2UncyB0cmFuc3BhcmVuY3kKLW1hc2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbWFnZS4gWW91IGNhbiBjaGFuZ2UgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIEltYWdlQW5hbHl6ZXIgaW4gb3JkZXIgdG8gc2VlIHRoZSB0cmFuc3BhcmVuY3kgd29yay4KLVRvIHR1cm4gb2ZmIHRyYW5zcGFyZW5jeSwgZGVzZWxlY3QgPHN0cm9uZz5EaXNwbGF5IFRyYW5zcGFyZW5jeTwvc3Ryb25nPi4KLUFmdGVyIGFuIGltYWdlIGlzIGxvYWRlZCwgaXQgY2FuIGJlIHNjYWxlZCB3aXRoIHRoZSA8c3Ryb25nPlNjYWxlPC9zdHJvbmc+IGNvbWJvLCBvciBoYXZlIGFscGhhIHRyYW5zcGFyZW5jeSBhcHBsaWVkIHRvIGl0IHVzaW5nIHRoZSA8c3Ryb25nPkFscGhhLUs8L3N0cm9uZz4gY29tYm8KLWFuZCA8c3Ryb25nPkFscGhhPC9zdHJvbmc+IG1lbnUuIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UmVvcGVuPC9zdHJvbmc+IHJlc3RvcmVzIHRoZSBzY2FsaW5nIGFuZCBhbHBoYSBhdHRyaWJ1dGVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFuZCByZWxvYWRzIHRoZSBjdXJyZW50IGltYWdlIGZpbGUuCi1JZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSwKLTxzdHJvbmc+RmlsZTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+U2F2ZSBNYXNrIEFzLi4uPC9zdHJvbmc+IGNhbiBiZSB1c2VkIHRvIHNhdmUgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IG1hc2suCi08L3A+Ci08cD4KLVdoZW4gU1dUIGxvYWRzIGFuIGltYWdlIGZpbGUsIGFuIGluc3RhbmNlIG9mIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE8L2NvZGU+IGlzIGNyZWF0ZWQgKHRob3VnaCBpbiB0aGUgY2FzZSBvZiBhbiBJQ08gZmlsZSBvcgotbXVsdGktaW1hZ2UgR0lGIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gaW5zdGFuY2VzIGlzIGNyZWF0ZWQpLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSA8Y29kZT5JbWFnZURhdGE8L2NvZGU+Ci1pbnN0YW5jZShzKSBmb3IgdGhlIGN1cnJlbnRseSBsb2FkZWQgaW1hZ2UgZmlsZSwgaW5jbHVkaW5nIHRoZSBwaXhlbCBkYXRhLiBIb3ZlcmluZyBvdmVyIGEgcGl4ZWwgaW4gdGhlIGltYWdlIGRpc3BsYXkgd2lsbCBzaG93IHRoZSBSR0IKLWNvbG9yIGRhdGEgZm9yIHRoYXQgcGl4ZWwuIEZvciBjZXJ0YWluIGltYWdlcywgcGFydGljdWxhcmx5IGFuaW1hdGVkIEdJRnMsIGFkZGl0aW9uYWwgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcjwvY29kZT4KLWluc3RhbmNlIHRoYXQgaXMgdXNlZCB0byBsb2FkIHRoZSBpbWFnZS4gVGhlIEltYWdlQW5hbHl6ZXIgZGlzcGxheXMgdGhpcyBkYXRhIGFzIHdlbGwuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLkltYWdlQW5hbHl6ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SW1hZ2UgQW5hbHl6ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2phdmF2aWV3ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDFlNzczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSmF2YSBTeW50YXggVmlld2VyIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSmF2YSBTeW50YXggVmlld2VyPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBhIHVzZXItZGVmaW5lZCBsaW5lIHN0eWxlciBmb3IgdGhlIFN0eWxlZFRleHQgd2lkZ2V0LgotVGhlIGV4YW1wbGUgcHJvdmlkZXMgYSB0eXBpY2FsIGVkaXRvciBpbnRlcmZhY2UuCi1UbyBzZWUgdGhlIGVmZmVjdCBvZiB0aGUgbGluZSBzdHlsZXIsIG9wZW4gYSAqLmphdmEgZmlsZSwgYW5kCi13aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgZGlzcGxheWVkIGluIHRoZSBlZGl0b3IgYXJlYSwgbm90aWNlIHRoYXQgdGhlIGtleXdvcmRzIGhhdmUgYmVlbiBoaWdobGlnaHRlZC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLkphdmFWaWV3ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SmF2YSBTeW50YXggVmlld2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiYzgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEV4YW1wbGUgTGF1bmNoZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvaDI+Ci0KLTxwPgotVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzLCB3aGljaCBjYW4gZWl0aGVyIGJlIFdvcmtiZW5jaCB2aWV3cyAKLW9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLgotPC9wPgotCi08dWw+Ci08bGk+V29ya2JlbmNoIHZpZXdzIGFyZSBleGFtcGxlcyB0aGF0IGFyZSBpbnRlZ3JhdGVkIGludG8gRWNsaXBzZS4gIFdoZW4gdGhlIGxhdW5jaGVyCi1zdGFydHMgYSBXb3JrYmVuY2ggdmlldywgaXQgaXMgb3BlbmVkIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBlcnNwZWN0aXZlLgotPGxpPlN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLTwvdWw+Ci0KLTxwPgotRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gdGhlIHN0YW5kYWxvbmUgZXhhbXBsZXMgd2l0aG91dCB0aGUgU1dUIEV4YW1wbGUgTGF1bmNoZXIsIAotcmVmZXIgdG8gPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4uCi08L3A+Ci08cD4KLVRoZSBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGFsc28gYmUgbGF1bmNoZWQgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgU1dUIEV4YW1wbGUgCi1MYXVuY2hlci4gIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGNhdGVnb3J5IG9mIHRoZSAKLTxzdHJvbmc+U2hvdyBWaWV3czwvc3Ryb25nPiBkaWFsb2cuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBFeGFtcGxlIExhdW5jaGVyPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51LCBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvc3Ryb25nPiB2aWV3LiAKLUEgdmlldyBjb250YWluaW5nIGEgbGlzdCBvZiBleGFtcGxlcyB3aWxsIGFwcGVhciBpbiB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi1XaGVuIHlvdSBzZWxlY3QgYW4gZXhhbXBsZSBmcm9tIHRoZSBsaXN0IGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGV4YW1wbGUgaXMgZGlzcGxheWVkLgotQ2xpY2sgb24gdGhlIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGJ1dHRvbiB0byBsYXVuY2ggdGhlIGV4YW1wbGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU4OWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBMYXlvdXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gTGF5b3V0czwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgCi11c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4KLVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEKLXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCB0aGUgdW5kZXJseWluZwotY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPkNvZGU8L3N0cm9uZz4gYnV0dG9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuTGF5b3V0RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5MYXlvdXRzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkZWQ5MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCBTdGFuZGFsb25lIEV4YW1wbGVzIFNldHVwPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2gyPgotCi08aDM+QWRkaW5nIFNXVCB0byB5b3VyIHdvcmtzcGFjZTwvaDM+Ci0KLTxvbD4KLTxsaT5Eb3dubG9hZCBTV1QgZm9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLiAgQSBzdGFuZGFsb25lIHZlcnNpb24gb2YgU1dUIGlzIGF2YWlsYWJsZSAKLW9uIHRoZSBzYW1lIGRvd25sb2FkIHBhZ2UgYXMgdGhlIEVjbGlwc2UgU0RLLiAgTG9vayBmb3IgdGhlIHNlY3Rpb24gdGl0bGVkIAotPHN0cm9uZz5TV1QgQmluYXJ5IGFuZCBTb3VyY2U8L3N0cm9uZz4uICBEbyBub3QgZXh0cmFjdCB0aGUgYXJjaGl2ZSBmaWxlLCBqdXN0IHNhdmUgaXQgdG8gZGlzay4KLTxsaT5TZWxlY3QgPHN0cm9uZz5JbXBvcnQuLi48L3N0cm9uZz4gZnJvbSB0aGUgPHN0cm9uZz5GaWxlPC9zdHJvbmc+IG1lbnUuPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5FeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZTwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5TZWxlY3QgYXJjaGl2ZSBmaWxlOjwvc3Ryb25nPiBhbmQgdXNlIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24gdG8gbG9jYXRlIHRoZSBTV1QgCi1zdGFuZGFsb25lIGFyY2hpdmUgeW91IGhhdmUgcHJldmlvdXNseSBkb3dubG9hZGVkLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC9vbD4KLQotPGgzPkltcG9ydGluZyBleGFtcGxlIHNvdXJjZTwvaDM+Ci0KLTxvbD4KLTxsaT5Eb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgRWNsaXBzZSBFeGFtcGxlIFBsdWctaW5zLiAgVGhlIEVjbGlwc2UgRXhhbXBsZSBQbHVnLWlucyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzYW1lCi1kb3dubG9hZCBwYWdlIGFzIHRoZSBFY2xpcHNlIFNESy4gIExvb2sgZm9yIHRoZSBzZWN0aW9uIHRpdGxlZCA8c3Ryb25nPkV4YW1wbGUgUGx1Zy1pbnM8L3N0cm9uZz4uCi1Zb3UgY2FuIGluc3RhbGwgdGhlIGV4YW1wbGVzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHlvdSBpbnN0YWxsZWQgRWNsaXBzZSBvciB5b3UgY2FuIGNob29zZQotYSBkaWZmZXJlbnQgbG9jYXRpb24uICBJZiB5b3UgaW5zdGFsbCB0aGUgZXhhbXBsZXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgRWNsaXBzZSwgdGhlIGV4YW1wbGUgdmlld3MgCi1hbmQgZWRpdG9ycyB3aWxsIHNob3cgdXAgaW4geW91ciBFY2xpcHNlIGVudmlyb25tZW50IChlLmcuIDxzdHJvbmc+V2luZG93cyAmZ3Q7IFNob3cgVmlldyAuLi4gJmd0OyBPdGhlciAuLi4gJmd0OyBTV1QgRXhhbXBsZXM8L3N0cm9uZz4KLUlmIHRoZSBTV1QgZXhhbXBsZSB2aWV3cyBkbyBub3QgYXBwZWFyIHJpZ2h0IGF3YXkgaW4geW91ciBtZW51LCByZXN0YXJ0IGVjbGlwc2Ugd2l0aCB0aGUgPHN0cm9uZz4tY2xlYW48L3N0cm9uZz4gYXJndW1lbnQpLgotVGhpcyBpcyBmaW5lIGJ1dCBpdCBpcyBub3QgbmVjZXNzYXJ5LgotPGxpPlNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IFByb2plY3QgLi4uPC9zdHJvbmc+IGZyb20gdGhlIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiBtZW51LgotPGxpPlNlbGVjdCA8c3Ryb25nPkphdmEgUHJvamVjdDwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5HaXZlIHRoZSBqYXZhIHByb2plY3QgYSBuYW1lIHN1Y2ggYXMgIlNXVCBFeGFtcGxlcyIuPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5DcmVhdGUgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZTwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+QnJvd3NlIC4uLjwvc3Ryb25nPiAKLWJ1dHRvbiB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnk6Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Y29kZT5lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLnNvdXJjZV8zLjEuMC9zcmMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzXzMuMS4wPC9jb2RlPgotPGxpPkNsaWNrIG9uIHRoZSA8c3Ryb25nPk5leHQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+UHJvamVjdHM8L3N0cm9uZz4gdGFiIGFuZCBjbGljayBvbiB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+UGxhY2UgYSBjaGVjayBiZXNpZGUgPHN0cm9uZz5vcmcuZWNsaXBzZS5zd3Q8L3N0cm9uZz4gYW5kIGNsaWNrIG9uIHRoZSA8c3Ryb25nPk9LPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPkNsaWNrIG9uIHRoZSA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvb2w+Ci0KLTxwPkF0IHRoaXMgcG9pbnQgeW91ciBTV1QgZXhhbXBsZXMgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IGVycm9ycy4gIENoZWNrIHRoZSA8c3Ryb25nPlByb2JsZW1zPC9zdHJvbmc+IAotdmlldyBmb3IgZXJyb3JzLiAgSWYgeW91IGdldCBhbiBlcnJvciBsaWtlICI8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBub3QgZm91bmQiIGl0IG1lYW5zIAoteW91IGhhdmUgbm90IGNvbmZpZ3VyZWQgYSBKUkUuICBHbyB0byB0aGUgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlByZWZlcmVuY2VzIC4uLjwvc3Ryb25nPiBkaWFsb2cKLWFuZCBzZWxlY3QgdGhlIDxzdHJvbmc+SmF2YTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+SW5zdGFsbGVkIEpSRXM8L3N0cm9uZz4gcHJlZmVyZW5jZSBwYWdlLiAgRW5zdXJlIHRoYXQgYSBKUkUgaXMgaW5zdGFsbGVkIAotYW5kIHRoYXQgdGhlIHBhdGggdG8gdGhlIEpSRSBpcyBjb3JyZWN0LjwvcD4KLQotPGgzPjxhIE5BTUU9IlJ1biI+PC9hPlJ1bm5pbmcgdGhlIEV4YW1wbGU8L2gzPgotCi08cD5Ob3cgeW91IGNhbiBydW4gdGhlIFNXVCBzdGFuZGFsb25lIGV4YW1wbGVzLgotCi08b2w+Ci08bGk+T3BlbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZS4KLTxsaT5JbiB0aGUgUGFja2FnZXMgdmlldywgc2VsZWN0IHRoZSBtYWluIGNsYXNzIHRoYXQgeW91IHdhbnQgdG8gcnVuLiAgCi0gICAgRm9yIGV4YW1wbGUsIHRoZSBtYWluIGNsYXNzIGZvciB0aGUgQWRkcmVzcyBCb29rIGV4YW1wbGUgaXMgCi0gICAgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rPC9jb2RlPi4KLTxsaT5TZWxlY3QgPHN0cm9uZz5SdW48L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlJ1biBBcy4uLjwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+SmF2YSBBcHBsaWNhdGlvbjwvc3Ryb25nPiBmcm9tIHRoZSBtYWluIG1lbnUuCi08L29sPgotCi0KLTxoMz5FeGFtcGxlcyBPdmVydmlldzwvaDM+Ci08cD4KLUNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBpbmRpdmlkdWFsIGV4YW1wbGUgZm9yIHRoZSBuYW1lIG9mCi1pdHMgbWFpbiBjbGFzcyBhbmQgYWRkaXRpb25hbCBkZXRhaWxzLgotVGhlIGZvbGxvd2luZyBleGFtcGxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnN3dGV4YW1wbGVzLmphcjwvY29kZT46Ci08L3A+Ci08dWw+Ci08bGk+PGEgaHJlZj0ic3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwiPkFkZHJlc3MgQm9vazwvYT4KLTxsaT48YSBocmVmPSJzd3RfYnJvd3Nlcl9leC5odG1sIj5Ccm93c2VyIEV4YW1wbGU8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2NsaXBib2FyZF9leC5odG1sIj5DbGlwYm9hcmQ8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2NvbnRyb2xzX2V4Lmh0bWwiPkNvbnRyb2xzPC9hPgotPGxpPjxhIGhyZWY9InN3dF9jdXN0b21jb250cm9sc19leC5odG1sIj5DdXN0b20gQ29udHJvbHM8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2RuZF9leC5odG1sIj5EcmFnIGFuZCBEcm9wIEV4YW1wbGU8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2ZpbGV2aWV3ZXJfZXguaHRtbCI+RmlsZSBWaWV3ZXI8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2hlbGxvd29ybGRfZXguaHRtbCI+SGVsbG8gV29ybGQgWzEtNV08L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2hvdmVyaGVscF9leC5odG1sIj5Ib3ZlciBIZWxwPC9hPgotPGxpPjxhIGhyZWY9InN3dF9pbWFnZWFuYWx5emVyX2V4Lmh0bWwiPkltYWdlIEFuYWx5emVyPC9hPgotPGxpPjxhIGhyZWY9InN3dF9qYXZhdmlld2VyX2V4Lmh0bWwiPkphdmEgU3ludGF4IFZpZXdlcjwvYT4KLTxsaT48YSBocmVmPSJzd3RfbGF5b3V0X2V4Lmh0bWwiPkxheW91dHM8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X3BhaW50X2V4Lmh0bWwiPlBhaW50IEV4YW1wbGU8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X3RleHRlZGl0b3JfZXguaHRtbCI+VGV4dCBFZGl0b3I8L2E+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNGNmNWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gUGFpbnQgVG9vbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gUGFpbnQgVG9vbDwvaDI+Ci0KLTxwPgkKLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhCi1ydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBQYWludCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gCi1kZW1vbnN0cmF0ZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHRpbWVkIEdVSSBvcGVyYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kIAotdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHVzZXIgaW5wdXQuCi08L3A+Ci08cD4JCi1TZWxlY3QgYSB0b29sIHdpdGggd2hpY2ggdG8gZHJhdyBpbiB0aGUgZHJhd2luZyBhcmVhLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzCi10byBjaG9vc2UgZnJvbSBvbiB0aGUgdG9vbGJhci4gIFRvIGNoYW5nZSB0aGUgY29sb3Igc2VsZWN0aW9uLCBjbGljayBvbiBhIGNvbG9yIGluIHRoZQotcGFsZXR0ZSBiZWxvdyB0aGUgZHJhd2luZyBhcmVhOyBsZWZ0LWNsaWNrIHRvIHNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciwgcmlnaHQtY2xpY2sgdG8gc2V0IHRoZQotYmFja2dyb3VuZCBjb2xvci4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LlBhaW50RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5QYWludDwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X3RleHRlZGl0b3JfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNjZTliMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X3RleHRlZGl0b3JfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIFRleHQgRWRpdG9yIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gVGV4dCBFZGl0b3I8L2gyPgotCi08cD4KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBhIFN0eWxlZFRleHQgd2lkZ2V0IHRvIGltcGxlbWVudAotYSB0ZXh0IGVkaXRvciB3aXRoIGZvcm1hdHRpbmcgc3VwcG9ydC4KLVRoZSBleGFtcGxlIGhhcyBhIHR5cGljYWwgdGV4dCBlZGl0b3IgaW50ZXJmYWNlLgotVGhlIDxzdHJvbmc+RWRpdDwvc3Ryb25nPiBtZW51IGNvbnRhaW5zIDxzdHJvbmc+Q3V0PC9zdHJvbmc+LCA8c3Ryb25nPkNvcHk8L3N0cm9uZz4sIDxzdHJvbmc+UGFzdGU8L3N0cm9uZz4gYW5kIDxzdHJvbmc+U2V0IEZvbnQ8L3N0cm9uZz4gaXRlbXMuICBUaGUgdG9vbGJhcgotcHJvdmlkZXMgYSBib2xkIHRleHQgdG9nZ2xlLCB0aHJlZSBjb2xvdXIgdG9vbHMsIGFuZCBhIHJlc2V0IGJ1dHRvbiwgYWxsIG9mIHdoaWNoIG9wZXJhdGUgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3IuVGV4dEVkaXRvcjwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5UZXh0IEVkaXRvcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+U3RhbmRhbG9uZTwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgzOGY1Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RTdGFuZGFsb25lRXhhbXBsZVNldC5uYW1lID0gU1dUIFN0YW5kYWxvbmUgRXhhbXBsZXMgUGx1Z2luCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5uYW1lID0gU3RhbmRhbG9uZQotbGF1bmNoY2F0ZWdvcnkuU1dUU3RhbmRhbG9uZUV4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBpbmRlcGVuZGFudCBcCi0Jb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0uCi0KLWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2submFtZSA9IEFkZHJlc3MgQm9vawotbGF1bmNoaXRlbS5BZGRyZXNzQm9vay5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgQWRkcmVzc0Jvb2sgZXhhbXBsZSBzaG93cyBob3cgdGhlIFRhYmxlIGNvbnRyb2wgY2FuIGJlIHVzZWQgdG8gXAotCXByZXNlbnQgaW5mb3JtYXRpb24gaW4gYSB0YWJ1bGFyIGZvcm1hdC5cblxuXAotCVRoZSBhcHBsaWNhdGlvbiBjYW4gc2F2ZSBhbmQgbG9hZCBkYXRhIGZyb20gYSBmaWxlLCBzb3J0IHRoZSBlbnRyaWVzLCBhbmQgXAotCXNlYXJjaCBmb3Igc3RyaW5ncyB3aXRoaW4gdGhlIGZpZWxkcy4KLQotbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5uYW1lID0gQnJvd3NlcgotbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LlxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSBjb21wb3NpdGUgY29udGFpbmluZyBhIEJyb3dzZXIgd2lkZ2V0IHRvIHJlbmRlciBIVE1MLiBcCi0JQWRkaXRpb25hbCB3aWRnZXRzIGFsbG93IHRoZSB1c2VyIHRvIHBlcmZvcm0gdHlwaWNhbCBicm93c2VyIGFjdGlvbnMgKGZvciBleGFtcGxlLCBuYXZpZ2F0ZSB0byBhIHBhcnRpY3VsYXIgVVJMLCBnbyBiYWNrLCBmb3J3YXJkLCByZWZyZXNoIGFuZCBzdG9wKS4KLQotbGF1bmNoaXRlbS5DbGlwYm9hcmQubmFtZSA9IENsaXBib2FyZAotbGF1bmNoaXRlbS5DbGlwYm9hcmQuZGVzY3JpcHRpb24gPSBcCi0JVGhlIENsaXBib2FyZCBleGFtcGxlIHNob3dzIHRoZSB2YXJpb3VzIFNXVCBjbGlwYm9hcmQgdHJhbnNmZXIgdHlwZXMgaW4gdXNlLgotCi1sYXVuY2hpdGVtLkNvbnRyb2xFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMgRXhhbXBsZQotbGF1bmNoaXRlbS5Db250cm9sRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgQ29udHJvbHMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgY29udHJvbHMuIFxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KLQotbGF1bmNoaXRlbS5ETkQubmFtZSA9IERyYWcgYW5kIERyb3AKLWxhdW5jaGl0ZW0uRE5ELmRlc2NyaXB0aW9uID0gXAotCVRoZSBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc2hvd3MgdGhlIHZhcmlvdXMgU1dUIGRyYWcgYW5kIGRyb3AgdHJhbnNmZXIgdHlwZXMgaW4gdXNlLgotCQotbGF1bmNoaXRlbS5GaWxlVmlld2VyLm5hbWUgPSBGaWxlIFZpZXdlcgotbGF1bmNoaXRlbS5GaWxlVmlld2VyLmRlc2NyaXB0aW9uID0gXAotCVRoZSBGaWxlIFZpZXdlciBleGFtcGxlIHNob3dzIGhvdyBhIHNpbXBsZSBhcHBsaWNhdGlvbiBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgU1dULlxuXG5cCi0JVGhpcyBhcHBsaWNhdGlvbiBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBuYXZpZ2F0ZSBmaWxlcyBhbmQgZm9sZGVycyBhbmQgbWFuaXB1bGF0ZSB0aGVtIHZpYSBEcmFnIGFuZCBEcm9wLiAgXAotCUl0IGluY2x1ZGVzIHRoZSB1c2Ugb2YgYWx0ZXJuYXRlIHRocmVhZHMgZm9yIGxvbmcgYWN0aW9ucyBhbmQgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIFRyZWUsIFwKLQlUYWJsZSwgVG9vbGJhciBhbmQgUHJvZ3JhbS4KLQotbGF1bmNoaXRlbS5Ib3ZlckhlbHAubmFtZSA9IEhvdmVyIEhlbHAKLWxhdW5jaGl0ZW0uSG92ZXJIZWxwLmRlc2NyaXB0aW9uID0gXAotCVRoZSBIb3ZlciBIZWxwIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBjdXN0b20gdG9vbHRpcHMgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydCBcCi0Jb24gYSBudW1iZXIgb2YgZGlmZmVyZW50IFNXVCBjb250cm9scyBpbmNsdWRpbmcgQnV0dG9ucywgVGFibGVJdGVtcywgVG9vbEl0ZW1zIGFuZCBUcmVlSXRlbXMuXG5cblwKLQlUaGUgZXhhbXBsZSBpbXBsZW1lbnRzIGl0cyBvd24gdG9vbHRpcCBhbmQgaG92ZXIgaGVscCBzdXBwb3J0LiAgXAotCVRvIHNlZSB0aGUgY3VzdG9tIHRvb2x0aXBzIGluIGFjdGlvbiwgaG92ZXIgb3ZlciBhbiBpdGVtIG9yIGJ1dHRvbiBpbiB0aGUgVUkuICBcCi0JQW4gaW1hZ2UgYXBwZWFycyBpbiB0aGUgbGVmdC1oYW5kIGNvcm5lciBvZiB0aGUgdG9vbHRpcC5cblxuXAotCVRvIHNlZSB0aGUgY3VzdG9tIGhvdmVyIGhlbHAgaW4gYWN0aW9uLCBob3ZlciBvdmVyIGFuIGl0ZW0gb3IgYnV0dG9uIGluIHRoZSBVSSB1bnRpbCBcCi0JdGhlIHRvb2x0aXAgaXMgZGlzcGxheWVkLiAgV2l0aG91dCBtb3ZpbmcgdGhlIG1vdXNlLCBoaXQgRjEuICBBIG5ldyBTaGVsbCB3aWxsIHBvcCB1cCB3aXRoIHRoZSBcCi0JZXh0ZW5kZWQgaG92ZXIgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhlIFVJIGVsZW1lbnQgaW4gcXVlc3Rpb24KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMS5uYW1lID0gSGVsbG8gV29ybGQgKDEpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQxLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIG9wZW4gYSBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQyLm5hbWUgPSBIZWxsbyBXb3JsZCAoMikKLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDIuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byBkaXNwbGF5IGEgTGFiZWwgaW5zaWRlIHRoZSBTaGVsbC4KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5uYW1lID0gSGVsbG8gV29ybGQgKDMpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQzLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVzaXplIHRoZSBMYWJlbCBcCi0Jd2hlbiB0aGUgU2hlbGwgcmVzaXplcyB1c2luZyBhIExpc3RlbmVyIG1lY2hhbmlzbS4KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNC5uYW1lID0gSGVsbG8gV29ybGQgKDQpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQ0LmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVzaXplIHRoZSBMYWJlbCBcCi0Jd2hlbiB0aGUgU2hlbGwgcmVzaXplcyB1c2luZyBhIExheW91dC4KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5uYW1lID0gSGVsbG8gV29ybGQgKDUpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQ1LmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZHJhdyBkaXJlY3RseSBvbiBhbiBTV1QgQ29udHJvbCB1c2luZyBhIGdyYXBoaWMgY29udGV4dC4KLQotbGF1bmNoaXRlbS5JbWFnZUFuYWx5emVyLm5hbWUgPSBJbWFnZSBBbmFseXplcgotbGF1bmNoaXRlbS5JbWFnZUFuYWx5emVyLmRlc2NyaXB0aW9uID0gXAotCVRoZSBJbWFnZUFuYWx5emVyIG9wZW5zIGltYWdlIGZpbGVzIGFuZCBkaXNwbGF5cyB0aGUgdmlzdWFsIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFsb25nIHdpdGggYSBcCi0Jc3VtbWFyeSBvZiB0aGUgZGF0YSBpbiB0aGUgaW1hZ2UgZmlsZS5cblxuXAotCVRoZSB1c2VyIGNhbiBtYWtlIGFkanVzdG1lbnRzIHRvIHZhcmlvdXMgZWxlbWVudHMgb2YgdGhlIGltYWdlIHN1Y2ggYXMgc2NhbGluZyBhbmQgQWxwaGEgXAotCWJsZW5kaW5nIGFuZCBjYW4gc2F2ZSB0aGVzZSBjaGFuZ2VzIHRvIGEgZmlsZS5cblxuXAotCVRoZSBJbWFnZUFuYWx5emVyIHdpbGwgbG9hZCBhbmQgZGlzcGxheSBpbWFnZSBmaWxlcyBvZiB0eXBlIEdJRiwgSlBFRywgQk1QLCBJQ08sIFBORywgYW5kIFRJRkYuICBcCi0JVG8gb3BlbiBhIGZpbGUsIHVzZSB0aGUgRmlsZS0+T3Blbi4uLiBtZW51IGl0ZW0sIGFuZCBzZWxlY3QgdGhlIGltYWdlIGZpbGUgaW4gdGhlIEZpbGVEaWFsb2cuXG5cblwKLQlJZiB0aGUgZmlsZSBpcyBhbiBpbnRlcmxhY2VkIEdJRiBvciBQTkcgb3IgYSBwcm9ncmVzc2l2ZSBKUEVHLCBhbmQgSW5jcmVtZW50YWwgRGlzcGxheSBpcyBzZWxlY3RlZCwgXAotCXRoZW4gdGhlIEltYWdlQW5hbHl6ZXIgZGlzcGxheXMgdGhlIGltYWdlIGluY3JlbWVudHMgYXMgdGhleSBhcmUgYmVpbmcgbG9hZGVkLlxuXG5cCi0JSWYgdGhlIGZpbGUgY29udGFpbnMgYW4gYW5pbWF0ZWQgR0lGLCB0aGVuIHRoZSBOZXh0LCBQcmV2aW91cywgYW5kIEFuaW1hdGUgYnV0dG9ucyBiZWNvbWUgZW5hYmxlZCwgXAotCWFuZCB0aGV5IGNhbiBiZSB1c2VkIHRvIGN5Y2xlIHRocm91Z2ggdGhlIGltYWdlcyBpbiB0aGUgZmlsZSwgb3IgYW5pbWF0ZSB0aGVtLiBJZiBhIEdJRiBkZWZpbmVzIGEgYmFja2dyb3VuZCBjb2xvciwgXAotCWFzIG1hbnkgYW5pbWF0ZWQgR0lGcyBkbywgc2VsZWN0aW5nIEJhY2tncm91bmQgd2lsbCB1c2UgdGhlIEdJRidzIGJhY2tncm91bmQgY29sb3IuXG5cblwKLQlJZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSAocG9zc2libGUgd2l0aCBHSUYsIFBORywgb3IgSUNPKSwgdGhlbiBzZWxlY3RpbmcgRGlzcGxheSBNYXNrIHdpbGwgZHJhdyB0aGUgaW1hZ2UncyB0cmFuc3BhcmVuY3kgXAotCW1hc2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbWFnZS4gWW91IGNhbiBjaGFuZ2UgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIEltYWdlQW5hbHl6ZXIgdG8gc2VlIHRoZSB0cmFuc3BhcmVuY3kgd29yay4gXAotCVRvIHR1cm4gb2ZmIHRoZSB0cmFuc3BhcmVuY3ksIGRlc2VsZWN0IERpc3BsYXkgVHJhbnNwYXJlbmN5LlxuXG5cCi0JQWZ0ZXIgYW4gaW1hZ2UgaXMgbG9hZGVkLCBpdCBjYW4gYmUgc2NhbGVkIG9yIGhhdmUgYWxwaGEgdHJhbnNwYXJlbmN5IGFwcGxpZWQsIHVzaW5nIHRoZSBTY2FsZSBhbmQgQWxwaGEtSyBjb21ib3MsIFwKLQlhbmQgdGhlIEFscGhhIG1lbnUuIEZpbGUtPlJlb3BlbiByZXN0b3JlcyBzY2FsaW5nIGFuZCBBbHBoYSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcyBhbmQgcmVsb2FkcyB0aGUgY3VycmVudCBpbWFnZSBmaWxlLlxuXG5cCi0JRmlsZS0+U2F2ZSBBcy4uLiBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZSBjdXJyZW50bHkgbG9hZGVkIGltYWdlIHRvIGFub3RoZXIgdHlwZSBvZiBpbWFnZSBmaWxlLiBJZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSwgXAotCUZpbGUtPlNhdmUgTWFzayBBcy4uLiBzYXZlcyB0aGUgaW1hZ2UncyB0cmFuc3BhcmVuY3kgbWFzay5cblxuXAotCVdoZW4gU1dUIGxvYWRzIGFuIGltYWdlIGZpbGUsIGFuIGluc3RhbmNlIG9mIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGEgaXMgY3JlYXRlZC4gKEluIHRoZSBjYXNlIG9mIGFuIElDTyBmaWxlIG9yIFwKLQltdWx0aS1pbWFnZSBHSUYsIGFuIGFycmF5IG9mIEltYWdlRGF0YSBpbnN0YW5jZXMgaXMgY3JlYXRlZCkuIFRoZSBJbWFnZUFuYWx5emVyIGRpc3BsYXlzIGFsbCBvZiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIEltYWdlRGF0YSBcCi0JaW5zdGFuY2UocykgZm9yIHRoZSBjdXJyZW50bHkgbG9hZGVkIGltYWdlIGZpbGUsIGluY2x1ZGluZyB0aGUgcGl4ZWwgZGF0YS4gSG92ZXJpbmcgb3ZlciBhIHBpeGVsIGluIHRoZSBpbWFnZSBkaXNwbGF5IHdpbGwgc2hvdyB0aGUgUkdCIFwKLQljb2xvciBkYXRhIGZvciB0aGF0IHBpeGVsLiBGb3IgY2VydGFpbiBpbWFnZXMgKHBhcnRpY3VsYXJseSBhbmltYXRlZCBHSUZzKSBhZGRpdGlvbmFsIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXIgXAotCWluc3RhbmNlIHVzZWQgdG8gbG9hZCB0aGUgaW1hZ2UuIFRoZSBJbWFnZUFuYWx5emVyIGRpc3BsYXlzIHRoaXMgZGF0YSBhcyB3ZWxsLgotCi1sYXVuY2hpdGVtLkphdmFWaWV3ZXIubmFtZSA9IEphdmEgU3ludGF4IFZpZXdlcgotbGF1bmNoaXRlbS5KYXZhVmlld2VyLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGltcGxlbWVudCBhIHVzZXItZGVmaW5lZCBsaW5lIHN0eWxlciBmb3IgdGhlIFN0eWxlZFRleHQgd2lkZ2V0LlxuXG5cCi0JVGhlIGV4YW1wbGUgcHJvdmlkZXMgYSB0eXBpY2FsIGVkaXRvciBpbnRlcmZhY2UuICBcCi0JVG8gc2VlIHRoZSBlZmZlY3Qgb2YgdGhlIGxpbmUgc3R5bGVyLCBvcGVuIGEgKi5qYXZhIGZpbGUuICBcCi0JV2hlbiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXJlIGRpc3BsYXllZCBpbiB0aGUgZWRpdG9yIGFyZWEsIG5vdGljZSB0aGF0IHRoZSBrZXl3b3JkcyBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQuCi0KLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5uYW1lID0gTGF5b3V0IEV4YW1wbGUKLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIFxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSBcCi0JdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBsYXlvdXQuIFwKLQlUaGUgdXNlciBjYW4gaW5zZXJ0IHdpZGdldHMgaW50byBhIGxheW91dCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxheW91dCBkYXRhIFwKLQl1c2luZyBhIHByb3BlcnR5IHNoZWV0LiAgV2hlbiB0aGUgdXNlciBoYXMgYSBzdWl0YWJsZSBhcnJhbmdlbWVudCwgY29kZSBjYW4gYmUgXAotCWdlbmVyYXRlZCBieSBjbGlja2luZyBvbiB0aGUgQ29kZSBidXR0b24uCi0KLWxhdW5jaGl0ZW0uQWR2YW5jZWRHcmFwaGljcy5uYW1lID0gQWR2YW5jZWQgR3JhcGhpY3MKLWxhdW5jaGl0ZW0uQWR2YW5jZWRHcmFwaGljcy5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYWR2YW5jZWQgZ3JhcGhpY3Mgb3BlcmF0aW9ucy4KLQotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLm5hbWUgPSBUZXh0IEVkaXRvcgotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgdG8gaW1wbGVtZW50IFwKLQlhIHRleHQgZWRpdG9yIHdpdGggZm9ybWF0dGluZyBzdXBwb3J0LlxuXG5cCi0JVGhlIGV4YW1wbGUgaGFzIGEgdHlwaWNhbCB0ZXh0IGVkaXRvciBpbnRlcmZhY2UuICBcCi0JVGhlIEVkaXQgbWVudSBjb250YWlucyBDdXQsIENvcHksIFBhc3RlIGFuZCBTZXQgRm9udCBpdGVtcyBhbmQgdGhlIHRvb2xiYXIgXAotCXByb3ZpZGVzIGEgYm9sZCB0ZXh0IHRvZ2dsZSwgdGhyZWUgY29sb3VyIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbiB0aGUgY3VycmVudCBcCi0Jc2VsZWN0aW9uLCBhbmQgYSByZXNldCB0byBkZWZhdWx0cyBidXR0b24gdGhhdCBhbHNvIG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDM5NzMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIEZpbGUgd3JpdHRlbiBieSBQREUgMS4wIC0tPgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUU3RhbmRhbG9uZUV4YW1wbGVTZXQubmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSIiPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotPC9yZXF1aXJlcz4KLQotPCEtLSBSdW50aW1lIC0tPgotPHJ1bnRpbWU+Ci0gICA8bGlicmFyeSBuYW1lPSJzd3RleGFtcGxlcy5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICA8L2xpYnJhcnk+Ci08L3J1bnRpbWU+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgPGNhdGVnb3J5Ci0gICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUU3RhbmRhbG9uZUV4YW1wbGVzLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5Ij4KLSAgIDwvY2F0ZWdvcnk+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2submFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5BZGRyZXNzQm9vay5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vay5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vay5BZGRyZXNzQm9vayI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZC5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQuQ2xpcGJvYXJkRXhhbXBsZSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uRE5ELm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uRE5ELmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmRuZC5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuRE5ERXhhbXBsZSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkZpbGVWaWV3ZXIuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlci5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyLkZpbGVWaWV3ZXIiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhvdmVySGVscC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhvdmVySGVscC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ob3ZlcmhlbHAuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwLkhvdmVySGVscCI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkMS5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQxIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQyLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDIiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQzLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDMuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDMuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkMyI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkNC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkNC5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQ0Ij4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQ1LmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ1LnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkltYWdlQW5hbHl6ZXIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5JbWFnZUFuYWx5emVyLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaW1hZ2VhbmFseXplci5JbWFnZUFuYWx5emVyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5KYXZhVmlld2VyLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmphdmF2aWV3ZXIuSmF2YVZpZXdlciI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uVGV4dEVkaXRvci5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLlRleHRFZGl0b3IuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvci5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yLlRleHRFZGl0b3IiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5BZHZhbmNlZEdyYXBoaWNzLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQWR2YW5jZWRHcmFwaGljcyIKLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjUyZTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19hZGRyZXNzYm9vay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTGFzdF9uYW1lID0gTGFzdCBOYW1lCi1GaXJzdF9uYW1lID0gRmlyc3QgTmFtZQotQnVzaW5lc3NfcGhvbmUgPSBCdXNpbmVzcyBQaG9uZQotSG9tZV9waG9uZSA9IEhvbWUgUGhvbmUKLUVtYWlsID0gRW1haWwKLUZheCA9IEZheAotQ2xvc2Vfc2F2ZSA9IFRoZSBhZGRyZXNzIGJvb2sgY29udGVudHMgaGF2ZSBjaGFuZ2VkLlxuRG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcz8KLU5ld190aXRsZSA9IFVudGl0bGVkCi1Db2x1bW4gPSBDb2x1bW46Ci1Cb29rX2V4dGVuc2lvbiA9IC5hZHIKLUJvb2tfZmlsdGVyX25hbWUgPSBBZGRyZXNzIEJvb2tzCi1BbGxfZmlsdGVyX25hbWUgPSBBbGwgRmlsZXMKLUZpbGUgPSBGaWxlIAotRG9lc19ub3RfZXhpc3QgPSBkb2VzIG5vdCBleGlzdC4KLUZpbGVfbm90X2ZvdW5kID0gRmlsZSBub3QgZm91bmQ6Ci1JT19lcnJvcl9yZWFkID0gSU8gZXJyb3IgcmVhZGluZyB0ZXh0IGZpbGU6Ci1JT19lcnJvcl93cml0ZSA9IElPIGVycm9yIHdyaXRpbmcgdGV4dCBmaWxlOgotSU9fZXJyb3JfY2xvc2UgPSBJTyBlcnJvciBjbG9zaW5nIHRleHQgZmlsZToKLVRpdGxlX2JhciA9IEFkZHJlc3MgQm9vayAtIAotU2F2ZV9hc190aXRsZSA9IFNhdmUgQXMKLVF1ZXJ5X292ZXJ3cml0ZSA9IGFscmVhZHkgZXhpc3RzLlxuRG8geW91IHdhbnQgdG8gcmVwbGFjZSBpdD8KLUZpbGVfbWVudV90aXRsZSA9ICZGaWxlCi1OZXdfY29udGFjdCA9ICZOZXcgQ29udGFjdC4uLlx0Q3RybCtOCi1FZGl0X2NvbnRhY3QgPSAmRWRpdCBDb250YWN0Li4uXHRDdHJsK0UKLU5ld19hZGRyZXNzX2Jvb2sgPSBOZXcgQWRkcmVzcyAmQm9va1x0Q3RybCtCCi1PcGVuX2FkZHJlc3NfYm9vayA9ICZPcGVuIEFkZHJlc3MgQm9vay4uLlx0Q3RybCtPCi1TYXZlX2FkZHJlc3NfYm9vayA9ICZTYXZlIEFkZHJlc3MgQm9va1x0Q3RybCtTCi1TYXZlX2Jvb2tfYXMgPSBTYXZlICZBZGRyZXNzIEJvb2sgQXMuLi5cdEN0cmwrQQotRXhpdCA9IEUmeGl0Ci1FZGl0X21lbnVfdGl0bGUgPSAmRWRpdAotRWRpdCA9ICZFZGl0Li4uXHRDdHJsK0UKLUNvcHkgPSAmQ29weVx0Q3RybCtDCi1QYXN0ZSA9ICZQYXN0ZVx0Q3RybCtWCi1EZWxldGUgPSBEZSZsZXRlXHREZWwKLVNvcnQgPSAmU29ydAotU2VhcmNoX21lbnVfdGl0bGUgPSAmU2VhcmNoCi1GaW5kID0gJkZpbmQuLi5cdEN0cmwrRgotRmluZF9uZXh0ID0gRmluZCAmTmV4dC4uLlx0RjMKLVBvcF91cF9uZXcgPSAmTmV3Li4uCi1Qb3BfdXBfZWRpdCA9ICZFZGl0Li4uCi1Qb3BfdXBfY29weSA9ICZDb3B5Ci1Qb3BfdXBfcGFzdGUgPSAmUGFzdGUKLVBvcF91cF9kZWxldGUgPSAmRGVsZXRlCi1Qb3BfdXBfZmluZCA9ICZGaW5kLi4uCi1IZWxwX21lbnVfdGl0bGUgPSAmSGVscAotQWJvdXQgPSAmQWJvdXQgQWRkcmVzcyBCb29rLi4uCi1BYm91dF8xID0gQWJvdXQgCi1BYm91dF8yID0gXG52ZXJzaW9uIDEuMAotT0sgPSBPSwotQ2FuY2VsID0gQ2FuY2VsCi1TZWFyY2hfZGlhbG9nX3RpdGxlID0gRmluZAotRGlhbG9nX2ZpbmRfd2hhdCA9IEZpJm5kIHdoYXQ6Ci1EaWFsb2dfbWF0Y2hfY2FzZSA9IE1hdGNoICZjYXNlCi1EaWFsb2dfbWF0Y2hfd29yZCA9IE1hdGNoICZ3aG9sZSB3b3JkCi1EaWFsb2dfZGlyZWN0aW9uID0gRGlyZWN0aW9uCi1EaWFsb2dfZGlyX3VwID0gJlVwCi1EaWFsb2dfZGlyX2Rvd24gPSAmRG93bgotRGlhbG9nX2ZpbmQgPSAmRmluZAotQ2Fubm90X2ZpbmQgPSBDYW5ub3QgZmluZCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2Jyb3dzZXIucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc3OTkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgQnJvd3NlcgotCi1CYWNrCQkJCT0gQmFjawotQnJvd3Nlck5vdENyZWF0ZWQJPSBFcnJvciAtIFRoZSBCcm93c2VyIHdpZGdldCBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkLiBQbGVhc2UgY2hlY2sgdGhlIEJyb3dzZXIgd2lkZ2V0IGlzIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLiBTdXBwb3J0ZWQgcGxhdGZvcm1zIGFuZCBzb2Z0d2FyZSByZXF1aXJlbWVudHMgZm9yIHRoZSBCcm93c2VyIHdpZGdldCBhcmUgbGlzdGVkIG9uIHRoZSBTV1QgRkFRIHdlYiBwYWdlLgotRm9yd2FyZAkJCQk9IEZvcndhcmQKLVN0b3AJCQkJPSBTdG9wCi1SZWZyZXNoCQkJCT0gUmVmcmVzaAotR28JCQkJCT0gR28KLVN0YXJ0dXAJCQkJPSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2NvbnRyb2wucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTMzODViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gU1dUIENvbnRyb2xzCi1jdXN0b20ud2luZG93LnRpdGxlID0gU1dUIEN1c3RvbSBDb250cm9scwotCi1UZXh0X0J1dHRvbnMJCT0gVGV4dCBCdXR0b25zCi1TaXplIAkJCQk9IFNpemUKLUFsaWdubWVudAkJCT0gQWxpZ25tZW50Ci1MZWZ0CQkJCT0gTGVmdAotUmlnaHQJCQkJPSBSaWdodAotVXAJCQkJCT0gVXAKLURvd24JCQkJPSBEb3duCi1DZW50ZXIJCQkJPSBDZW50ZXIKLU9uZQkJCQkJPSBPbmUKLVR3bwkJCQkJPSBUd28KLVRocmVlCQkJCT0gVGhyZWUKLUltYWdlX0J1dHRvbnMJCT0gSW1hZ2UgQnV0dG9ucwotQ29udHJvbF9FeGFtcGxlCQk9IENvbnRyb2wgRXhhbXBsZQotUGFyYW1ldGVycwkJCT0gUGFyYW1ldGVycwotT3RoZXIJCQkJPSBPdGhlcgotRW5hYmxlZAkJCQk9IEVuYWJsZWQKLVZpc2libGUJCQkJPSBWaXNpYmxlCi1QcmVmZXJyZWQgCQkJPSBQcmVmZXJyZWQKLVN0eWxlcwkgCQkJPSBTdHlsZXMKLU1lbnVfU3R5bGVzCSAJCT0gTWVudSBTdHlsZXMKLU1lbnVJdGVtX1N0eWxlcwkgCT0gTWVudUl0ZW0gU3R5bGVzCi1MaXN0ZW5lcnMJCQk9IExpc3RlbmVycwotU2VsZWN0X0xpc3RlbmVycwk9IFNlbGVjdCBMaXN0ZW5lcnMKLUxpc3RlbgkJCQk9IExpc3RlbgotQ2xlYXIJCQkJPSBDbGVhcgotU2V0X0dldAkJCQk9IFNldC9HZXQgQVBJCi1QYXJhbWV0ZXJfSW5mbwkJPSB7MH0gICBlLmcuIHsxfSAKLUluZm9faW50CQkJPSA0Ci1JbmZvX2ludEEJCQk9IDAsMSwyCi1JbmZvX2xvbmcJCQk9IDQKLUluZm9fbG9uZ0EJCQk9IDAsMSwyCi1JbmZvX2NoYXIJCQk9IGMKLUluZm9fY2hhckEJCQk9IGEsYixjCi1JbmZvX2Jvb2xlYW4JCT0gdHJ1ZQotSW5mb19ib29sZWFuQQkJPSB0cnVlLHRydWUsZmFsc2UKLUluZm9fU3RyaW5nCQkJPSBoZWxsbwotSW5mb19TdHJpbmdBCQk9IGhlbGxvLHRoZXJlCi1JbmZvX1BvaW50CQkJPSAwLDAKLUluZm9fVGFiSXRlbQkJPSBUYWIgMAotSW5mb19UYWJJdGVtQQkJPSBUYWIgMCxUYWIgMgotSW5mb19UYWJsZUl0ZW0JCT0gSW5kZXg6MgotSW5mb19UYWJsZUl0ZW1BCQk9IEluZGV4OjIsSW5kZXg6NAotSW5mb19UcmVlSXRlbQkJPSBOb2RlIDEKLUluZm9fVHJlZUl0ZW1BCQk9IE5vZGUgMSxOb2RlIDMKLVNlbGVjdF9BbGwJCQk9IFNlbGVjdCBBbGwKLURlc2VsZWN0X0FsbAkJPSBEZXNlbGVjdCBBbGwKLU9LCQkJCQk9IE9LCi1GaWxsRGFtYWdlCQkJPSBGaWxsIERhbWFnZWQgQXJlYSBXaXRoIENvbG9yCi1UaXRsZV9UZXh0CQkJPSBUaXRsZSBUZXh0Ci1UZXh0X0xhYmVscwkJCT0gVGV4dCBMYWJlbHMKLUltYWdlX0xhYmVscwkJPSBJbWFnZSBMYWJlbHMKLUN1c3RvbV9MYWJlbHMJCT0gQ3VzdG9tIExhYmVscwotQ3VzdG9tX0NvbWJvCQk9IEN1c3RvbSBDb21ibwotT25lX1R3b19UaHJlZQkJPSBPbmUgVHdvIFRocmVlCi1UZXh0X1Rvb2xCYXIgCQk9IFRleHQgVG9vbEJhcgotSW1hZ2VfVG9vbEJhciAJCT0gSW1hZ2UgVG9vbEJhcgotSW1hZ2VUZXh0X1Rvb2xCYXIJPSBJbWFnZSBhbmQgVGV4dCBUb29sQmFyCi1NYXhpbXVtCQkJCT0gTWF4aW11bQotTWluaW11bQkJCQk9IE1pbmltdW0KLVNlbGVjdGlvbgkJCT0gU2VsZWN0aW9uCi1JbmNyZW1lbnQJCQk9IEluY3JlbWVudAotUGFnZV9JbmNyZW1lbnQJCT0gUGFnZSBJbmNyZW1lbnQKLVRodW1iCQkJCT0gVGh1bWIKLURpZ2l0cwkJCQk9IERpZ2l0cwotVHJlZV9XaXRoX0ltYWdlcwk9IFRyZWUgV2l0aCBJbWFnZXMKLURpYWxvZ19UeXBlCQkJPSBEaWFsb2cgVHlwZQotQ3JlYXRlX0RpYWxvZwkJPSBDcmVhdGUgRGlhbG9nCi1CdXR0b25fU3R5bGVzCQk9IEJ1dHRvbiBTdHlsZXMKLUljb25fU3R5bGVzCQkJPSBJY29uIFN0eWxlcwotTW9kYWxfU3R5bGVzCQk9IE1vZGFsIFN0eWxlcwotRmlsZV9EaWFsb2dfU3R5bGVzCT0gRmlsZSBEaWFsb2cgU3R5bGVzCi1JdGVtX1N0eWxlcwkJCT0gSXRlbSBTdHlsZXMKLURpYWxvZ19SZXN1bHQJCT0gRGlhbG9nIFJlc3VsdAotQ29sb3JEaWFsb2cJCQk9IENvbG9yRGlhbG9nCi1EaXJlY3RvcnlEaWFsb2cJCT0gRGlyZWN0b3J5RGlhbG9nCi1GaWxlRGlhbG9nCQkJPSBGaWxlRGlhbG9nCi1Gb250RGlhbG9nCQkJPSBGb250RGlhbG9nCi1QcmludERpYWxvZwkJCT0gUHJpbnREaWFsb2cKLU1lc3NhZ2VCb3gJCQk9IE1lc3NhZ2VCb3gKLU11bHRpX2xpbmUJCQk9IEEgbXVsdGkgbGluZSB0ZXh0IHdpZGdldC4KLUV4YW1wbGVfc3RyaW5nCQk9IFRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuCi1IZWFkZXJfVmlzaWJsZQkJPSBIZWFkZXIgVmlzaWJsZQotTGluZXNfVmlzaWJsZQkJPSBMaW5lcyBWaXNpYmxlCi1Nb3ZlYWJsZV9Db2x1bW5zCT0gTW92ZWFibGUgQ29sdW1ucwotTXVsdGlwbGVfQ29sdW1ucwk9IE11bHRpcGxlIENvbHVtbnMKLUxvY2tlZAkJCQk9IExvY2tlZAotQ29tYm9fY2hpbGQJCQk9IENvbWJvIENoaWxkCi1Ob2RlXzEJCQkJPSBOb2RlIDEKLU5vZGVfMgkJCQk9IE5vZGUgMgotTm9kZV8zCQkJCT0gTm9kZSAzCi1Ob2RlXzQJCQkJPSBOb2RlIDQKLU5vZGVfMV8xCQkJPSBOb2RlIDEuMQotTm9kZV8yXzEJCQk9IE5vZGUgMi4xCi1Ob2RlXzNfMQkJCT0gTm9kZSAzLjEKLU5vZGVfMl8yCQkJPSBOb2RlIDIuMgotTm9kZV8yXzJfMQkJCT0gTm9kZSAyLjIuMQotUGFyZW50CQkJCT0gUGFyZW50Ci1Ob19QYXJlbnQJCQk9IE5vIFBhcmVudAotRGVjb3JhdGlvbl9TdHlsZXMJPSBEZWNvcmF0aW9uIFN0eWxlcwotQ3JlYXRlX1NoZWxsCQk9IENyZWF0ZSBTaGVsbAotQ2xvc2VfQWxsX1NoZWxscwk9IENsb3NlIEFsbCBTaGVsbHMKLVB1c2gJCQkJPSBQdXNoCi1SYWRpbwkJCQk9IFJhZGlvCi1DaGVjawkJCQk9IENoZWNrCi1DYXNjYWRlCQkJCT0gQ2FzY2FkZQotRHJvcF9Eb3duCQkJPSBEcm9wIERvd24KLUltYWdlc19mYWlsZWQJCT0gV2FybmluZzogRmFpbGVkIHRvIGxvYWQgaW1hZ2VzCi1yZWFkbWVfdHh0CQkJPSByZWFkbWUudHh0Ci1JbmRleAkJCQk9IEluZGV4OgotVGl0bGUJCQkJPSBUaXRsZToKLUNsb3NlCQkJCT0gQ2xvc2UKLVJlc3VsdAkJCQk9IFJlc3VsdDogezB9Ci1GaWx0ZXJOYW1lXzAJCT0gVGV4dCBGaWxlcwotRmlsdGVyTmFtZV8xCQk9IEJhdGNoIEZpbGVzCi1GaWx0ZXJOYW1lXzIJCT0gRG9jIEZpbGVzCi1GaWx0ZXJOYW1lXzMJCT0gQWxsIEZpbGVzCi1UYWJsZVRpdGxlXzAJCT0gTmFtZQotVGFibGVUaXRsZV8xCQk9IFR5cGUKLVRhYmxlVGl0bGVfMgkJPSBTaXplCi1UYWJsZVRpdGxlXzMJCT0gTW9kaWZpZWQKLVRhYmxlTGluZTBfMAkJPSA8ZW1wdHk+Ci1UYWJsZUxpbmUwXzEJCT0gY2xhc3NlcwotVGFibGVMaW5lMF8yCQk9IDAKLVRhYmxlTGluZTBfMwkJPSB0b2RheQotVGFibGVMaW5lMV8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTFfMQkJPSBkYXRhYmFzZXMKLVRhYmxlTGluZTFfMgkJPSAyNTU2Ci1UYWJsZUxpbmUxXzMJCT0gdG9tb3Jyb3cKLVRhYmxlTGluZTJfMAkJPSA8ZW1wdHk+Ci1UYWJsZUxpbmUyXzEJCT0gaW1hZ2VzCi1UYWJsZUxpbmUyXzIJCT0gOTE1NzEKLVRhYmxlTGluZTJfMwkJPSB5ZXN0ZXJkYXkKLUxpc3REYXRhMF8wCQkJPSBMaW5lIDEKLUxpc3REYXRhMF8xCQkJPSBMaW5lIDIKLUxpc3REYXRhMF8yCQkJPSBMaW5lIDMKLUxpc3REYXRhMF8zCQkJPSBMaW5lIDQKLUxpc3REYXRhMF80CQkJPSBMaW5lIDUKLUxpc3REYXRhMF81CQkJPSBMaW5lIDYKLUxpc3REYXRhMF82CQkJPSBMaW5lIDcKLUxpc3REYXRhMF83CQkJPSBMaW5lIDgKLUxpc3REYXRhMF84CQkJPSBMb25nZXN0IExpbmUgSW4gTGlzdAotTGlzdERhdGExXzAJCQk9IEFwcGxlcwotTGlzdERhdGExXzEJCQk9IE9yYW5nZXMKLUxpc3REYXRhMV8yCQkJPSBCYW5hbmFzCi1MaXN0RGF0YTFfMwkJCT0gR3JhcGVmcnVpdAotTGlzdERhdGExXzQJCQk9IFBlYWNoZXMKLUxpc3REYXRhMV81CQkJPSBLaXdpCi1MaXN0RGF0YTFfNgkJCT0gQXByaWNvdHMKLUxpc3REYXRhMV83CQkJPSBTdHJhd2JlcnJpZXMKLUxpc3REYXRhMV84CQkJPSBUaGUgTG9uZ2VzdCBTdHJpbmcKLURyb3BEb3duRGF0YV8wCQk9IEFwcGxlcwotRHJvcERvd25EYXRhXzEJCT0gT3JhbmdlcwotRHJvcERvd25EYXRhXzIJCT0KLURyb3BEb3duRGF0YV8zCQk9IEdyYXBlZnJ1aXQKLURyb3BEb3duRGF0YV80CQk9IFBlYWNoZXMKLURyb3BEb3duRGF0YV81CQk9IEtpd2kKLURyb3BEb3duRGF0YV82CQk9Ci1Ecm9wRG93bkRhdGFfNwkJPSBTdHJhd2JlcnJpZXMKLURyb3BEb3duRGF0YV84CQk9IFRoZSBMb25nZXN0IFN0cmluZwotQ29sb3JzIAkJCQk9IENvbG9ycyBhbmQgRm9udAotVGFibGVfSXRlbV9Db2xvcnMJPSBSb3cgMCBDb2xvcnMgYW5kIEZvbnQKLVRyZWVfSXRlbV9Db2xvcnMJPSBOb2RlIDEgQ29sb3JzIGFuZCBGb250Ci1JdGVtX0ZvbnQJCQk9IEl0ZW0gRm9udCAuLi4KLUJhY2tncm91bmRfQ29sb3IJPSBCYWNrZ3JvdW5kIENvbG9yCi1Gb3JlZ3JvdW5kX0NvbG9yCT0gRm9yZWdyb3VuZCBDb2xvcgotRm9udAkJCQk9ICZGb250Li4uCi1EZWZhdWx0cwkJCT0gJkRlZmF1bHRzCi1XcmFwX1RleHQJCQk9IEphY2sgYW5kIEppbGwgd2VudCB1cCB0aGUgaGlsbCB0byBmZXRjaCBhIHBhaWwgb2Ygd2F0ZXIsIFwKLQkJCQkJICBKYWNrIGZlbGwgZG93biBhbmQgYnJva2UgaGlzIGNyb3duIGFuZCBKaWxsIGNhbWUgdHVtYmxpbmcgYWZ0ZXIhCi1Gb3JlZ3JvdW5kX1N0eWxlCT0gRm9yZWdyb3VuZCBTdHlsZQotQmFja2dyb3VuZF9TdHlsZSAJPSBCYWNrZ3JvdW5kIFN0eWxlCi1TdHlsZWRUZXh0X1N0eWxlcwk9IFRleHQgU3R5bGVzCi1TdHlsZWRUZXh0X1N0eWxlX0luc3RydWN0aW9ucwk9IFNlbGVjdCB0ZXh0LCB0aGVuIHN0eWxlLgotQm9sZAkJCQk9IEJvbGQKLUl0YWxpYwkJCQk9IEl0YWxpYwotVW5kZXJsaW5lCQk9IFVuZGVybGluZQotU3RyaWtlb3V0CQk9IFN0cmlrZW91dAotRmlsbAkJCQk9IEhvcml6b250YWwgRmlsbAotVGFiSXRlbTFfMAkJCT0gVGFiIDAKLVRhYkl0ZW0xXzEJCQk9IFRhYiAxCi1UYWJJdGVtMV8yCQkJPSBUYWIgMgotVGFiSXRlbV9jb250ZW50CQk9IFRhYkl0ZW0gQ29udGVudAotQ1RhYkl0ZW0xXzAJCQk9IENUYWJJdGVtIDAKLUNUYWJJdGVtMV8xCQkJPSBDVGFiSXRlbSAxCi1DVGFiSXRlbTFfMgkJCT0gQ1RhYkl0ZW0gMiBoYXMgYSBsb25nIG5hbWUKLUNJdGVtX0NvbG9ycwkJPSBDVGFiSXRlbSBDb2xvcnMKLUNUYWJJdGVtX2NvbnRlbnQJPSBDVGFiSXRlbSBDb250ZW50Ci1TZXRfU2ltcGxlX1RhYnMJCT0gU2ltcGxlIFRhYnMKLVNldF9TaW5nbGVfVGFicwkJPSBTaW5nbGUgVGFiCi1TZXRfTWluX1Zpc2libGUgICAgID0gTWluaW1pemUKLVNldF9NYXhfVmlzaWJsZSAgICAgPSBNYXhpbWl6ZQotU2V0X1Vuc2VsZWN0ZWRfQ2xvc2VfVmlzaWJsZSA9IENsb3NlIG9uIFVuc2VsZWN0ZWQgVGFicwotU2V0X1Vuc2VsZWN0ZWRfSW1hZ2VfVmlzaWJsZSA9IEltYWdlIG9uIFVuc2VsZWN0ZWQgVGFicwotU2VsZWN0aW9uX0ZvcmVncm91bmRfQ29sb3IgPSBTZWxlY3Rpb24gRm9yZWdyb3VuZCBDb2xvcgotU2VsZWN0aW9uX0JhY2tncm91bmRfQ29sb3IgPSBTZWxlY3Rpb24gQmFja2dyb3VuZCBDb2xvcgotU2V0X0ltYWdlCQkJPSBTZXQgSW1hZ2UKLVRhYmxlVHJlZV9jb2x1bW4JPSBDb2x1bW4KLU1lbnVJdGVtX0N1dAkJPSBDdSZ0CUN0cmwrWAotTWVudUl0ZW1fQ29weQkJPSAmQ29weQlDdHJsK0MKLU1lbnVJdGVtX1Bhc3RlCQk9ICZQYXN0ZQlDdHJsK1YKLU1lbnVJdGVtX1NlbGVjdEFsbAk9IFNlbGVjdCAmQWxsCUN0cmwrQQotT3JpZW50YXRpb24gCQk9IE9yaWVudGF0aW9uCi1EZWZhdWx0IAkJCT0gRGVmYXVsdCAoSW5oZXJpdCkKLUltYWdlcwkJCQk9IEltYWdlcwotQWNjZWxlcmF0b3JzCQk9IEFjY2VsZXJhdG9ycwotTW5lbW9uaWNzCQkJPSBNbmVtb25pY3MKLVN1Yk1lbnUJCQkJPSBTdWItTWVudQotU3ViU3ViTWVudQkJCT0gU3ViLVN1Yi1NZW51Ci0xUmFkaW8JCQkJPSBSYWRpbzEKLTJSYWRpbwkJCQk9IFJhZGlvMgotMVJhZGlvV2l0aE1uZW1vbmljCT0gUmFkaW8mMQotMlJhZGlvV2l0aE1uZW1vbmljCT0gUmFkaW8mMgotUHVzaFdpdGhNbmVtb25pYwk9ICZQdXNoCi1SYWRpb1dpdGhNbmVtb25pYwk9ICZSYWRpbwotQ2hlY2tXaXRoTW5lbW9uaWMJPSAmQ2hlY2sKLUNhc2NhZGVXaXRoTW5lbW9uaWMJPSBDJmFzY2FkZQotUG9wdXBNZW51SGVyZQkJPSBQb3B1cCBNZW51IEhlcmUKLUxpbmtUZXh0PVZpc2l0IHRoZSA8QSBIUkVGPVwid3d3LmVjbGlwc2Uub3JnXCI+RWNsaXBzZS5vcmc8L0E+IHByb2plY3QgYW5kIHRoZSA8QSBIUkVGPVwid3d3LmVjbGlwc2Uub3JnXFxzd3QiPlNXVDwvQT4gaG9tZXBhZ2UuCi1Ub29sdGlwCQkJCT0gVG9vbHRpcDogIHswfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19maWxldmlld2VyLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5NDJlMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRpdGxlID0gU1dUIEZpbGVWaWV3ZXIgLSB7MH0KLQotbWVudS5GaWxlLnRleHQgPSAmRmlsZQotbWVudS5GaWxlLkNsb3NlLnRleHQgPSAmQ2xvc2UKLW1lbnUuRmlsZS5TaW11bGF0ZU9ubHkudGV4dCA9IFNpbXVsYXRlIEZpbGUgT3BlcmF0aW9ucwotbWVudS5IZWxwLnRleHQgPSAmSGVscAotbWVudS5IZWxwLkFib3V0LnRleHQgPSAmQWJvdXQKLQotdG9vbC5DdXQudGlwdGV4dCA9IEN1dAotdG9vbC5Db3B5LnRpcHRleHQgPSBDb3B5Ci10b29sLkRlbGV0ZS50aXB0ZXh0ID0gRGVsZXRlCi10b29sLlBhcmVudC50aXB0ZXh0ID0gUGFyZW50Ci10b29sLlBhc3RlLnRpcHRleHQgPSBQYXN0ZQotdG9vbC5QcmludC50aXB0ZXh0ID0gUHJpbnQKLXRvb2wuUmVmcmVzaC50aXB0ZXh0ID0gUmVmcmVzaAotdG9vbC5SZW5hbWUudGlwdGV4dCA9IFJlbmFtZQotdG9vbC5TZWFyY2gudGlwdGV4dCA9IFNlYXJjaAotCi1kZXRhaWxzLkFsbEZvbGRlcnMudGV4dCA9IEFsbCBGb2xkZXJzCi1kZXRhaWxzLkNvbnRlbnRzT2YudGV4dCA9IENvbnRlbnRzIG9mICcnezB9JycKLWRldGFpbHMuRmlsZVNpemUudGV4dCA9IHswfSBieXRlcwotZGV0YWlscy5EaXJOdW1iZXJPZk9iamVjdHMudGV4dCA9IHswfSBvYmplY3QocykKLWRldGFpbHMuTnVtYmVyT2ZTZWxlY3RlZEZpbGVzLnRleHQgPSB7MH0gb2JqZWN0KHMpIHNlbGVjdGVkCi0KLXRhYmxlLk5hbWUudGl0bGUgPSBOYW1lCi10YWJsZS5TaXplLnRpdGxlID0gU2l6ZQotdGFibGUuVHlwZS50aXRsZSA9IFR5cGUKLXRhYmxlLk1vZGlmaWVkLnRpdGxlID0gTW9kaWZpZWQKLQotZmlsZXR5cGUuVW5rbm93biA9IHswfSBGaWxlCi1maWxldHlwZS5Ob25lID0gRmlsZQotZmlsZXR5cGUuRm9sZGVyID0gRm9sZGVyCi1maWxlc2l6ZS5LQiA9IHswfSBrYgotCi1kaWFsb2cuQWJvdXQudGl0bGUgPSBBYm91dCBTV1QgRmlsZVZpZXdlcgotZGlhbG9nLkFib3V0LmRlc2NyaXB0aW9uID0gU1dUIEZpbGVWaWV3ZXJcblxuVmVyc2lvbjogMC45XG5cblJ1bm5pbmcgb246IHswfQotCi1kaWFsb2cuTm90SW1wbGVtZW50ZWQudGl0bGUgPSBOb3QgSW1wbGVtZW50ZWQKLWRpYWxvZy5BY3Rpb25Ob3RJbXBsZW1lbnRlZC5kZXNjcmlwdGlvbiA9IFNvcnJ5ISAgVGhlIGFjdGlvbiB5b3Ugc2VsZWN0ZWQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLgotCi1kaWFsb2cuRmFpbGVkQ29weS50aXRsZSA9IENvcHkgRmlsZXMgRXJyb3IKLWRpYWxvZy5GYWlsZWRDb3B5LmRlc2NyaXB0aW9uID0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gY29weSAiezB9IiB0byAiezF9Ii4KLQotZGlhbG9nLkZhaWxlZERlbGV0ZS50aXRsZSA9IERlbGV0ZSBGaWxlcyBFcnJvcgotZGlhbG9nLkZhaWxlZERlbGV0ZS5kZXNjcmlwdGlvbiA9IEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGRlbGV0ZSAiezB9Ii4KLQotcHJvZ3Jlc3NEaWFsb2cuY2FuY2VsQnV0dG9uLnRleHQgPSBDYW5jZWwKLXByb2dyZXNzRGlhbG9nLkNvcHkudGl0bGUgPSBDb3B5IEZpbGVzCi1wcm9ncmVzc0RpYWxvZy5Db3B5LmRlc2NyaXB0aW9uID0gQ29weWluZyBmaWxlcy4KLXByb2dyZXNzRGlhbG9nLkNvcHkub3BlcmF0aW9uID0gQ29weWluZy4uLiB7MH0KLXByb2dyZXNzRGlhbG9nLk1vdmUudGl0bGUgPSBNb3ZlIEZpbGVzCi1wcm9ncmVzc0RpYWxvZy5Nb3ZlLmRlc2NyaXB0aW9uID0gTW92aW5nIGZpbGVzLgotcHJvZ3Jlc3NEaWFsb2cuRGVsZXRlLm9wZXJhdGlvbiA9IERlbGV0aW5nLi4uIHswfQotCi1zaW11bGF0ZS5Db3B5RnJvbVRvLnRleHQgPSBTaW11bGF0ZWQgY29weSBmcm9tICJ7MH0iIHRvICJ7MX0iLgotc2ltdWxhdGUuRGlyZWN0b3JpZXNDcmVhdGVkLnRleHQgPSBTaW11bGF0ZWQgZGlyZWN0b3JpZXMgY3JlYXRlZCBmb3IgInswfSIuCi1zaW11bGF0ZS5EZWxldGUudGV4dCA9IFNpbXVsYXRlZCBkZWxldGUgb2YgInswfSIuCi0KLWVycm9yLkZhaWxlZExhdW5jaC5tZXNzYWdlID0gQ291bGQgbm90IGxhdW5jaCAiezB9IgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ncmFwaGljcy5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ncmFwaGljcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NjI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfZ3JhcGhpY3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFkdmFuY2VkR3JhcGhpY3M9QWR2YW5jZWQgR3JhcGhpY3MKLVNXVEdyYXBoaWNzPVNXVCBHcmFwaGljcwotV2FybmluZz1XYXJuaW5nCi1MaWJOb3RGb3VuZD1HcmFwaGljcyBsaWJyYXJ5IG5vdCBmb3VuZC4KLVNldHRpbmdzPVNldHRpbmdzCi1QbGF5PVBsYXkKLVBhdXNlPVBhdXNlCi1CYWNrZ3JvdW5kPUJhY2tncm91bmQKLURvdWJsZUJ1ZmZlcj1Eb3VibGUgQnVmZmVyCi1XaGl0ZT1XaGl0ZQotQmxhY2s9QmxhY2sKLVJlZD1SZWQKLUdyZWVuPUdyZWVuCi1CbHVlPUJsdWUKLUN1c3RvbUNvbG9yPUN1c3RvbSBDb2xvcgotQW5pbWF0aW9uPUFuaW1hdGlvbgotU3RhclBvbHlnb249U3RhciBQb2x5Z29uCi1MaW5lPUxpbmUKLUJsYWNrSG9sZT1CbGFjayBIb2xlCi1GaWxsUnVsZT1GaWxsIFJ1bGU6Ci1Qb2x5Z29ucz1Qb2x5Z29ucwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19oZWxsb3dvcmxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hlbGxvd29ybGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0MGExOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hlbGxvd29ybGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUhlbGxvX3dvcmxkID0gSGVsbG8gV29ybGQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hvdmVyaGVscC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ob3ZlcmhlbHAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjYTYzZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hvdmVyaGVscC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIDogezB9Ci0KLVRvb2xJdGVtLnRleHQgPSBUb29sSXRlbSB7MH0KLVRvb2xJdGVtLnRvb2x0aXAgPSBUb29sdGlwIGZvciB7MH0uIFRyeSBGMSBvbiBtZS4KLVRvb2xJdGVtLmhlbHAgPSBIZWxwIHRleHQgZm9yIHswfS4KLQotVGFibGVJdGVtLnRleHQgPSBUYWJsZUl0ZW0gezB9Ci1UYWJsZUl0ZW0udG9vbHRpcCA9IFRvb2x0aXAgZm9yIHswfS4gVHJ5IEYxIG9uIG1lLgotVGFibGVJdGVtLmhlbHAgPSBIZWxwIHRleHQgZm9yIHswfS4KLQotVHJlZUl0ZW0udGV4dCA9IFRyZWVJdGVtIHswfQotVHJlZUl0ZW0udG9vbHRpcCA9IFRvb2x0aXAgZm9yIHswfS4gVHJ5IEYxIG9uIG1lLgotVHJlZUl0ZW0uaGVscCA9IEhlbHAgdGV4dCBmb3IgezB9LgotCi1IZWxsby50ZXh0ID0gSGVsbG8KLUhlbGxvLnRvb2x0aXAgPSBHcmVldGluZ3MhCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ltYWdlcy5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19pbWFnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViZGM4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ltYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUltYWdlX2FuYWx5emVyIAkJCQk9IEltYWdlIEFuYWx5emVyCi1Ob25lIAkJCQkJCT0gTm9uZQotV2hpdGUgCQkJCQkJPSBXaGl0ZQotQmxhY2sgCQkJCQkJPSBCbGFjawotUmVkIAkJCQkJCT0gUmVkCi1HcmVlbiAJCQkJCQk9IEdyZWVuCi1CbHVlIAkJCQkJCT0gQmx1ZQotWF9zY2FsZSAJCQkJCT0gWCBTY2FsZQotWV9zY2FsZSAJCQkJCT0gWSBTY2FsZQotQWxwaGFfSyAJCQkJCT0gQWxwaGEtSwotRGlzcGxheSAJCQkJCT0gRGlzcGxheQotSW5jcmVtZW50YWwgCQkJCT0gSW5jcmVtZW50YWwKLVRyYW5zcGFyZW50IAkJCQk9IFRyYW5zcGFyZW50Ci1UcmFuc3BhcmVudF9sYyAJCQkJPSB0cmFuc3BhcmVudAotTWFzayAJCQkJCQk9IE1hc2sKLUJhY2tncm91bmQgCQkJCQk9IEJhY2tncm91bmQKLUFuaW1hdGlvbiAJCQkJCT0gQW5pbWF0aW9uCi1QcmV2aW91cyAJCQkJCT0gPCAmUHJldmlvdXMKLU5leHQgCQkJCQkJPSAmTmV4dCA+Ci1BbmltYXRlIAkJCQkJPSAmQW5pbWF0ZQotVHlwZV9pbml0aWFsIAkJCQk9IFR5cGU6Ci1UeXBlX3N0cmluZyAJCQkJPSBUeXBlOiB7MH0KLVR5cGVfaW5kZXggCQkJCQk9IFR5cGU6IHswfSBbezEsbnVtYmVyLGludGVnZXJ9IG9mIHsyLG51bWJlcixpbnRlZ2VyfV0KLVNpemVfaW5pdGlhbCAJCQkJPSBTaXplOgotU2l6ZV92YWx1ZSAJCQkJCT0gU2l6ZTogezAsbnVtYmVyLGludGVnZXJ9IHggezEsbnVtYmVyLGludGVnZXJ9Ci1EZXB0aF9pbml0aWFsIAkJCQk9IERlcHRoOgotRGVwdGhfdmFsdWUgCQkJCT0gRGVwdGg6IHswfQotVHJhbnNwYXJlbnRfcGl4ZWxfaW5pdGlhbCAJPSBUcmFuc3BhcmVudCBwaXhlbDoKLVRyYW5zcGFyZW50X3BpeGVsX3ZhbHVlCQk9IFRyYW5zcGFyZW50IHBpeGVsOiB7MH0KLVRpbWVfdG9fbG9hZF9pbml0aWFsIAkJPSBUaW1lIHRvIGxvYWQ6Ci1UaW1lX3RvX2xvYWRfdmFsdWUJCQk9IFRpbWUgdG8gbG9hZDogezB9IG1zCi1BbmltYXRpb25fc2l6ZV9pbml0aWFsIAkJPSBBbmltYXRpb24gc2l6ZToKLUFuaW1hdGlvbl9zaXplX3ZhbHVlIAkJPSBBbmltYXRpb24gc2l6ZTogezAsbnVtYmVyLGludGVnZXJ9IHggezEsbnVtYmVyLGludGVnZXJ9Ci1CYWNrZ3JvdW5kX3BpeGVsX2luaXRpYWwgCT0gQmFja2dyb3VuZCBwaXhlbDoKLUJhY2tncm91bmRfcGl4ZWxfdmFsdWUgCQk9IEJhY2tncm91bmQgcGl4ZWw6IHswfQotSW1hZ2VfbG9jYXRpb25faW5pdGlhbCAJCT0gSW1hZ2UgbG9jYXRpb246Ci1JbWFnZV9sb2NhdGlvbl92YWx1ZSAJCT0gSW1hZ2UgbG9jYXRpb246ICh7MCxudW1iZXIsaW50ZWdlcn0sIHsxLG51bWJlcixpbnRlZ2VyfSkKLURpc3Bvc2FsX2luaXRpYWwgCQkJPSBEaXNwb3NhbDoKLURpc3Bvc2FsX3ZhbHVlIAkJCQk9IERpc3Bvc2FsOiB7MCxudW1iZXIsaW50ZWdlcn0gKHsxfSkKLURlbGF5X2luaXRpYWwgCQkJCT0gRGVsYXk6Ci1EZWxheV92YWx1ZSAJCQkJPSBEZWxheTogezAsbnVtYmVyLGludGVnZXJ9IG1zICh1c2luZyB7MSxudW1iZXIsaW50ZWdlcn0gbXMpCi1EZWxheV91c2VkIAkJCQkJPSBEZWxheTogezAsbnVtYmVyLGludGVnZXJ9IG1zCi1SZXBlYXRzX2luaXRpYWwgCQkJPSBSZXBlYXRzOgotUmVwZWF0c192YWx1ZSAJCQkJPSBSZXBlYXRzOiB7MCxudW1iZXIsaW50ZWdlcn0KLVJlcGVhdHNfZm9yZXZlciAJCQk9IFJlcGVhdHM6IHswLG51bWJlcixpbnRlZ2VyfSAoZm9yZXZlcikKLVBhbGV0dGVfaW5pdGlhbCAJCQk9IFBhbGV0dGU6Ci1QYWxldHRlX2RpcmVjdCAJCQkJPSBQYWxldHRlOiBEaXJlY3QKLVBhbGV0dGVfdmFsdWUgCQkJCT0gUGFsZXR0ZSBzaXplOiB7MCxudW1iZXIsaW50ZWdlcn0KLVBpeGVsX2RhdGFfaW5pdGlhbCAJCQk9IFBpeGVsIGRhdGE6Ci1QaXhlbF9kYXRhX3ZhbHVlIAkJCT0gUGl4ZWwgZGF0YTogIEJ5dGVzIHBlciBsaW5lOiB7MCxudW1iZXIsaW50ZWdlcn0gIFwKLQkJCQkJCQkgIFNjYW5saW5lIHBhZDogezEsbnVtYmVyLGludGVnZXJ9IHsyfQotRmlsZSAJCQkJCQk9ICZGaWxlCi1PcGVuRmlsZSAJCQkJCT0gJk9wZW4gRmlsZS4uLlx0Q3RybCtPCi1PcGVuVVJMCQkJCQkJPSBPcGVuICZVUkwuLi5cdEN0cmwrVQotUmVvcGVuIAkJCQkJCT0gJlJlb3BlbgotU2F2ZSAJCQkJCQk9ICZTYXZlXHRDdHJsK1MKLVNhdmVfYXMgCQkJCQk9IFNhdmUgJkFzLi4uCi1TYXZlX21hc2tfYXMgCQkJCT0gU2F2ZSAmTWFzayBBcy4uLgotUHJpbnQgCQkJCQkJPSAmUHJpbnRcdEN0cmwrUAotRXhpdCAJCQkJCQk9IEUmeGl0Ci1BbHBoYSAJCQkJCQk9IEFscGhhCi1PcGVuVVJMRGlhbG9nCQkJCT0gT3BlbiBVUkwKLUVudGVyVVJMCQkJCQk9IEVudGVyIHRoZSBVUkwgZm9yIGFuIGltYWdlIChibXAsIGdpZiwgaWNvLCBqcGcsIGpwZWcsIHBuZyk6Ci1BbGxfaW1hZ2VzIAkJCQkJPSBBbGwgSW1hZ2UgRmlsZXMKLUxvYWRpbmdfbGMgCQkJCQk9IGxvYWRpbmcKLVNhdmluZ19sYyAJCQkJCT0gc2F2aW5nCi1Vbmtub3duX2V4dGVuc2lvbiAJCQk9IFVua25vd24gZmlsZSBleHRlbnNpb246IHswfVxuUGxlYXNlIHVzZSBibXAsIGdpZiwgaWNvLCBcCi0JCQkJCQkJICBqcGcsIGpwZWcsIG9yIHBuZy4KLU92ZXJ3cml0ZSAJCQkJCT0gT3ZlcndyaXRlIHswfT8KLVNhdmVfYWxsCQkJCQk9IFNhdmUgYWxsIHswfSBpbWFnZXMgaW50byBhIG11bHRpLWltYWdlIGZpbGU/Ci1BbmFseXplcl9vbiAJCQkJPSBJbWFnZSBBbmFseXplciBvbjogezB9Ci1SZWxvYWRpbmdfbGMgCQkJCT0gcmVsb2FkaW5nCi1Db2xvcl9hdCAJCQkJCT0gSW1hZ2UgY29sb3IgYXQgKHswLG51bWJlcixpbnRlZ2VyfSwgezEsbnVtYmVyLGludGVnZXJ9KSBcCi0JCQkJCQkJICAtIHBpeGVsIHsyLG51bWJlcixpbnRlZ2VyfSBbMHh7M31dIC0gaXMgezR9IFsweHs1fV0gezZ9Ci1SR0IJCQkJCQkJPSBSR0IgJ3snezB9LCB7MX0sIHsyfSd9JwotUkdCQQkJCQkJCT0gUkdCQSAneyd7MH0sIHsxfSwgezJ9LCB7M30nfScKLUNvbG9yX2F0X3RyYW5zcGFyZW50CQk9ICh0cmFuc3BhcmVudCkKLUNyZWF0aW5nX2ltYWdlIAkJCQk9IENyZWF0aW5nIGltYWdlICMgezAsbnVtYmVyLGludGVnZXJ9IGZyb20gCi1PSwkJCQkJCQk9IE9LCi1DYW5jZWwJCQkJCQk9IENhbmNlbAotU3RvcCAJCQkJCQk9ICZTdG9wCi1DcmVhdGluZ19mcm9tIAkJCQk9IENyZWF0aW5nIGltYWdlIHJlYWQgZnJvbQotUGFsZXR0ZV9kaXJlY3QgCQkJCT0gUGFsZXR0ZTogRGlyZWN0Ci1QYWxldHRlX3NpemUgCQkJCT0gUGFsZXR0ZSBzaXplOiB7MCxudW1iZXIsaW50ZWdlcn0KLUJ5dGVzX3Blcl9saW5lIAkJCQk9IEJ5dGVzIHBlciBsaW5lOgotU2NhbmxpbmVfcGFkIAkJCQk9IFNjYW5saW5lIHBhZDoKLVByaW50aW5nX2Vycm9yCQkJCT0gUHJpbnRpbmcgZXJyb3I6IAotRXJyb3IgCQkJCQkJPSBFcnJvciB7MH0gZmlsZVxuezF9XG5cbgotUGl4ZWxzX3Blcl9ieXRlIAkJCT0gcGl4ZWxzIHBlciBieXRlCi1CeXRlX3Blcl9waXhlbCAJCQkJPSBieXRlIHBlciBwaXhlbAotQnl0ZXNfcGVyX3BpeGVsIAkJCT0gYnl0ZXMgcGVyIHBpeGVsCi1VbnN1cHBvcnRlZF9sYyAJCQkJPSB1bnN1cHBvcnRlZAotTm9uZV9sYyAJCQkJCT0gbm9uZQotQmFja2dyb3VuZF9sYyAJCQkJPSBiYWNrZ3JvdW5kCi1QcmV2aW91c19sYyAJCQkJPSBwcmV2aW91cwotVW5zcGVjaWZpZWRfbGMgCQkJCT0gdW5zcGVjaWZpZWQKLVVua25vd25fYWMgCQkJCQk9IFVOS05PV04KLUZvcmV2ZXJfbGMgCQkJCQk9IGZvcmV2ZXIKLURlcHRoX2luZm8gCQkJCQk9IERlcHRoOiB7MCxudW1iZXIsaW50ZWdlcn0gLS0gezF9Ci1PbmVfYnl0ZSAJCQkJCT0gMSBieXRlIHBlciBwaXhlbAotTXVsdGlfYnl0ZXMgCQkJCT0gezAsbnVtYmVyLGludGVnZXJ9IGJ5dGVzIHBlciBwaXhlbAotTXVsdGlfcGl4ZWxzIAkJCQk9IHswLG51bWJlcixpbnRlZ2VyfSBwaXhlbHMgcGVyIGJ5dGUgezF9Ci1NYXhfbGVuZ3RoX3N0cmluZyAJCQk9IFRyYW5zcGFyZW50IHBpeGVsOiAtMSAobm9uZSkKLVNhdmVfYXNfdHlwZQkJCQk9IFNhdmUgQXMgQk1QIFR5cGUuLi4KLVNhdmVfYXNfdHlwZV9sYWJlbAkJCT0gU2VsZWN0IHRoZSB0eXBlIG9mIEJNUCB0byBzYXZlIGFzOgotU2F2ZV9hc190eXBlX25vX2NvbXByZXNzCT0gTm8gQ29tcHJlc3Npb24KLVNhdmVfYXNfdHlwZV9ybGVfY29tcHJlc3MJPSBSTEUgQ29tcHJlc3Npb24KLVNhdmVfYXNfdHlwZV9vczIJCQk9IE9TLzIgQk1QCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2phdmF2aWV3ZXIucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfamF2YXZpZXdlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FmYzczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfamF2YXZpZXdlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotT3Blbl9tZW51aXRlbT0mT3Blbi4uLlx0Q3RybCtPCi1FeGl0X21lbnVpdGVtPUUmeGl0Ci1GaWxlX21lbnVpdGVtPSZGaWxlCi1XaW5kb3dfdGl0bGU9U1dUIEphdmEgVmlld2VyCi1FcnJfZmlsZV9ub19leGlzdD1GaWxlIHswfSBkb2VzIG5vdCBleGlzdC4KLUVycl9maWxlX2lvPUlPIGVycm9yIHJlYWRpbmcgZmlsZTpcbnswfQotRXJyX2ZpbGVfbm90X2ZvdW5kPUZpbGUgbm90IGZvdW5kOlxuezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19sYXlvdXQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfbGF5b3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTljODAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19sYXlvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXdpbmRvdy50aXRsZSA9IFNXVCBMYXlvdXRzCi0KLUFkZAkJCQkJPSAmQWRkCi1EZWxldGUJIAkJCT0gJkRlbGV0ZQotQ2xlYXIJCQkJPSAmQ2xlYXIKLUNoaWxkcmVuCQkJPSBDaGlsZHJlbgotVHlwZQkJCQk9IFR5cGUKLUxheW91dAkJCQk9IExheW91dAotUHJlZmVycmVkX1NpemUJCT0gUHJlZmVycmVkIFNpemUKLUNvZGUJCQkJPSBDJm9kZQotR2VuZXJhdGVkX0NvZGUJCT0gR2VuZXJhdGVkIENvZGUKLVBhcmFtZXRlcnMJCQk9IFBhcmFtZXRlcnMKLVByb3BlcnRpZXMJCQk9IFByb3BlcnRpZXMKLU1hcmdpbnMJCQkJPSBNYXJnaW5zCi1NYXJnaW5zX1NwYWNpbmcJCT0gTWFyZ2lucyBhbmQgU3BhY2luZwotQ29sdW1ucwkJCQk9IENvbHVtbnMKLUF0dGFjaF9FZGl0CQkJPSBFZGl0Ci1MZWZ0X0F0dGFjaG1lbnQJCT0gRWRpdCBMZWZ0IEF0dGFjaG1lbnQKLVJpZ2h0X0F0dGFjaG1lbnQJPSBFZGl0IFJpZ2h0IEF0dGFjaG1lbnQKLVRvcF9BdHRhY2htZW50CQk9IEVkaXQgVG9wIEF0dGFjaG1lbnQKLUJvdHRvbV9BdHRhY2htZW50CT0gRWRpdCBCb3R0b20gQXR0YWNobWVudAotUG9zaXRpb24JCQk9IFBvc2l0aW9uCi1Db250cm9sCQkJCT0gQ29udHJvbAotT2Zmc2V0CQkJCT0gT2Zmc2V0IFsrLy1dCi1JdGVtCQkJCT0gSXRlbSB7MH0KLUNvbWJvX0luZGV4CQkJPSBDb21ibyB7MH0KLUdyb3VwX0luZGV4CQkJPSBHcm91cCB7MH0KLUxhYmVsX0luZGV4CQkJPSBMYWJlbCB7MH0KLUJ1dHRvbl9JbmRleAkJPSBCdXR0b24gezB9Ci1TdHlsZWRUZXh0X0luZGV4CT0gU3R5bGVkVGV4dCB7MH0KLVRleHRfSW5kZXgJCQk9IFRleHQgezB9Ci1PSwkJCQkJPSBPSwotQ2FuY2VsCQkJCT0gQ2FuY2VsCi1FZGl0CQkJCT0gJkVkaXQKLVNlbGVjdF9BbGwJCQk9IFNlbGVjdCAmQWxsXHRDdHJsK0EKLUNvcHkJCQkJPSAmQ29weVx0Q3RybCtDCi1FeGl0CQkJCT0gRSZ4aXQKLU5hbWVfVGl0bGUJCQk9IEVudGVyIE5hbWVzCi1OYW1lX0xhYmVsCQkJPSBFbnRlciBuYW1lcyBmb3IgeW91ciBjb250cm9scwotSW52YWxpZF9OYW1lIAkJPSBJbnZhbGlkIE5hbWUgLSBQbGVhc2UgZW50ZXIgdmFsaWQgdmFyaWFibGUgbmFtZXMgZm9yIHlvdXIgY29udHJvbHMKLURlZmF1bHQJCQkJPSBEZWZhdWx0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19wYWludC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19wYWludC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVjZWM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfcGFpbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLXdpbmRvdy50aXRsZSA9IFBhaW50Ci0KLW1lbnUuVG9vbHMubGFiZWwgPSBUb29scwotbWVudS5PcHRpb25zLmxhYmVsID0gT3B0aW9ucwotCi10b29sLlBlbmNpbC5sYWJlbCA9IFBlbmNpbAotdG9vbC5QZW5jaWwudG9vbHRpcCA9IFBlbmNpbCB0b29sCi10b29sLlBlbmNpbC5pbWFnZSA9IHRvb2xfcGVuY2lsLmdpZgotdG9vbC5QZW5jaWwuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBQZW5jaWwgdG9vbC4KLQotdG9vbC5BaXJicnVzaC5sYWJlbCA9IEFpcmJydXNoCi10b29sLkFpcmJydXNoLnRvb2x0aXAgPSBBaXJicnVzaCB0b29sCi10b29sLkFpcmJydXNoLmltYWdlID0gdG9vbF9haXJicnVzaC5naWYKLXRvb2wuQWlyYnJ1c2guZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBBaXJicnVzaCB0b29sLgotCi10b29sLkxpbmUubGFiZWwgPSBMaW5lCi10b29sLkxpbmUudG9vbHRpcCA9IExpbmUgdG9vbAotdG9vbC5MaW5lLmltYWdlID0gdG9vbF9saW5lLmdpZgotdG9vbC5MaW5lLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgTGluZSB0b29sLgotCi10b29sLlBvbHlMaW5lLmxhYmVsID0gUG9seWdvbgotdG9vbC5Qb2x5TGluZS50b29sdGlwID0gUG9seWdvbiB0b29sCi10b29sLlBvbHlMaW5lLmltYWdlID0gdG9vbF9wb2x5bGluZS5naWYKLXRvb2wuUG9seUxpbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBQb2x5TGluZSB0b29sLgotCi10b29sLlJlY3RhbmdsZS5sYWJlbCA9IFJlY3RhbmdsZQotdG9vbC5SZWN0YW5nbGUudG9vbHRpcCA9IFJlY3RhbmdsZSB0b29sCi10b29sLlJlY3RhbmdsZS5pbWFnZSA9IHRvb2xfcmVjdGFuZ2xlLmdpZgotdG9vbC5SZWN0YW5nbGUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBSZWN0YW5nbGUgdG9vbC4KLQotdG9vbC5FbGxpcHNlLmxhYmVsID0gRWxsaXBzZQotdG9vbC5FbGxpcHNlLnRvb2x0aXAgPSBFbGxpcHNlIHRvb2wKLXRvb2wuRWxsaXBzZS5pbWFnZSA9IHRvb2xfZWxsaXBzZS5naWYKLXRvb2wuRWxsaXBzZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIEVsbGlwc2UgdG9vbC4KLQotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmxhYmVsID0gUm91bmRlZCBSZWN0YW5nbGUKLXRvb2wuUm91bmRlZFJlY3RhbmdsZS50b29sdGlwID0gUm91bmRlZCBSZWN0YW5nbGUgdG9vbAotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmltYWdlID0gdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZgotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgUm91bmRlZCBSZWN0YW5nbGUgdG9vbC4KLQotdG9vbC5UZXh0LmxhYmVsID0gVGV4dAotdG9vbC5UZXh0LnRvb2x0aXAgPSBUZXh0IHRvb2wKLXRvb2wuVGV4dC5pbWFnZSA9IHRvb2xfdGV4dC5naWYKLXRvb2wuVGV4dC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFRleHQgdG9vbC4KLXRvb2wuVGV4dC5zZXR0aW5ncy5kZWZhdWx0dGV4dCA9IEhlbGxvIQotdG9vbC5UZXh0LmRpYWxvZy50aXRsZSA9IFRleHQgVG9vbCBTZXR0aW5ncwotdG9vbC5UZXh0LmRpYWxvZy5tZXNzYWdlID0gUGxlYXNlIGVudGVyIHRoZSBuZXcgdGV4dCBzdHJpbmcgdG8gYmUgcGFpbnRlZC4KLQotdG9vbC5OdWxsLmxhYmVsID0gPG5vbmU+Ci0KLWZpbGwuTm9uZS5sYWJlbCA9IE5vIEZpbGwKLWZpbGwuTm9uZS50b29sdGlwID0gTm8gZmlsbCBtb2RlCi1maWxsLk5vbmUuaW1hZ2UgPSBmaWxsX25vbmUuZ2lmCi1maWxsLk5vbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIE5vIEZpbGwgbW9kZS4KLQotZmlsbC5PdXRsaW5lLmxhYmVsID0gT3V0bGluZSBGaWxsCi1maWxsLk91dGxpbmUudG9vbHRpcCA9IE91dGxpbmUgZmlsbCBtb2RlCi1maWxsLk91dGxpbmUuaW1hZ2UgPSBmaWxsX291dGxpbmUuZ2lmCi1maWxsLk91dGxpbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIE91dGxpbmUgRmlsbCBtb2RlLgotCi1maWxsLlNvbGlkLmxhYmVsID0gU29saWQgRmlsbAotZmlsbC5Tb2xpZC50b29sdGlwID0gU29saWQgZmlsbCBtb2RlCi1maWxsLlNvbGlkLmltYWdlID0gZmlsbF9zb2xpZC5naWYKLWZpbGwuU29saWQuZGVzY3JpcHRpb24gPSBTZWxlY3RzIFNvbGlkIEZpbGwgbW9kZS4KLQotbGluZXN0eWxlLlNvbGlkLmxhYmVsID0gU29saWQgTGluZQotbGluZXN0eWxlLlNvbGlkLnRvb2x0aXAgPSBTb2xpZCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuU29saWQuaW1hZ2UgPSBsaW5lc3R5bGVfc29saWQuZ2lmCi1saW5lc3R5bGUuU29saWQuZGVzY3JpcHRpb24gPSBTZWxlY3QgU29saWQgTGluZSBzdHlsZS4KLQotbGluZXN0eWxlLkRvdC5sYWJlbCA9IERvdHRlZCBMaW5lCi1saW5lc3R5bGUuRG90LnRvb2x0aXAgPSBEb3R0ZWQgbGluZSBzdHlsZQotbGluZXN0eWxlLkRvdC5pbWFnZSA9IGxpbmVzdHlsZV9kb3QuZ2lmCi1saW5lc3R5bGUuRG90LmRlc2NyaXB0aW9uID0gU2VsZWN0IERvdHRlZCBMaW5lIHN0eWxlLgotCi1saW5lc3R5bGUuRGFzaC5sYWJlbCA9IERhc2hlZCBMaW5lCi1saW5lc3R5bGUuRGFzaC50b29sdGlwID0gRGFzaGVkIGxpbmUgc3R5bGUKLWxpbmVzdHlsZS5EYXNoLmltYWdlID0gbGluZXN0eWxlX2Rhc2guZ2lmCi1saW5lc3R5bGUuRGFzaC5kZXNjcmlwdGlvbiA9IFNlbGVjdCBEYXNoZWQgTGluZSBzdHlsZS4KLQotbGluZXN0eWxlLkRhc2hEb3QubGFiZWwgPSBEYXNoLURvdCBMaW5lCi1saW5lc3R5bGUuRGFzaERvdC50b29sdGlwID0gRGFzaC1Eb3QgbGluZSBzdHlsZQotbGluZXN0eWxlLkRhc2hEb3QuaW1hZ2UgPSBsaW5lc3R5bGVfZGFzaGRvdC5naWYKLWxpbmVzdHlsZS5EYXNoRG90LmRlc2NyaXB0aW9uID0gU2VsZWN0IERhc2gtRG90IExpbmUgc3R5bGUuCi0KLW9wdGlvbnMuRm9udC5sYWJlbCA9IFRleHQgVG9vbCBGb250Ci1vcHRpb25zLkZvbnQudG9vbHRpcCA9IFNlbGVjdCBUZXh0IFRvb2wgZm9udAotb3B0aW9ucy5Gb250LmltYWdlID0gb3B0aW9uc19mb250LmdpZgotb3B0aW9ucy5Gb250LmRlc2NyaXB0aW9uID0gU2VsZWN0cyBUZXh0IFRvb2wgZm9udC4KLW9wdGlvbnMuRm9udC5kaWFsb2cudGl0bGUgPSBUZXh0IFRvb2wgRm9udAotCi1zZXR0aW5ncy5BaXJicnVzaFJhZGl1cy50ZXh0ID0gQWlyYnJ1c2ggUmFkaXVzCi1zZXR0aW5ncy5BaXJicnVzaEludGVuc2l0eS50ZXh0ID0gQWlyYnJ1c2ggSW50ZW5zaXR5Ci0KLXNlc3Npb24uTnVsbC5tZXNzYWdlID0gU2VsZWN0IGEgdG9vbC4uLgotc2Vzc2lvbi5Db250aW51b3VzUGFpbnQubWVzc2FnZSA9IENsaWNrIGFuZCBkcmFnIHRvIGRyYXcuLi4KLXNlc3Npb24uRHJhZ0ludGVyYWN0aXZlUGFpbnQubWVzc2FnZSA9IENsaWNrIGFuZCBkcmFnIHRvIHByZXZpZXcsIHJlbGVhc2UgdG8gZHJhdywgcmlnaHQtY2xpY2sgdG8gY2FuY2VsLi4uCi1zZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5hbmNob3JNb2RlID0gQ2xpY2sgdG8gc2V0IGFuY2hvci4uLgotc2Vzc2lvbi5TZWdtZW50ZWRJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UuaW50ZXJhY3RpdmVNb2RlID0gQ2xpY2sgdG8gZHJhdywgZG91YmxlLWNsaWNrIHRvIGNsb3NlIGZpZ3VyZSwgcmlnaHQtY2xpY2sgdG8gY2FuY2VsLi4uCi1zZXNzaW9uLlRleHQubWVzc2FnZSA9IENsaWNrIHRvIGRyYXcgdGV4dCwgcmlnaHQtY2xpY2sgdG8gZWRpdCB0ZXh0Li4uCi0KLXN0YXR1cy5Db29yZC5mb3JtYXQgPSAoezB9LCB7MX0pCi1zdGF0dXMuQ29vcmRSYW5nZS5mb3JtYXQgPSAoezB9LCB7MX0pIC0gKHsyfSwgezN9KQotc3RhdHVzLkJhci5mb3JtYXQgPSB7MH0gOiB7MX0gICB7Mn0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfdGV4dGVkaXRvci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc190ZXh0ZWRpdG9yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWQ1MzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc190ZXh0ZWRpdG9yLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FeGl0X21lbnVpdGVtPUUmeGl0Ci1DdXRfbWVudWl0ZW09Q3UmdFx0Q3RybCtYCi1Db3B5X21lbnVpdGVtPSZDb3B5XHRDdHJsK0MKLVBhc3RlX21lbnVpdGVtPSZQYXN0ZVx0Q3RybCtWCi1XaW5kb3dfdGl0bGU9U1dUIFRleHQgRWRpdG9yCi1Gb250X21lbnVpdGVtPVNldCAmRm9udC4uLgotRWRpdF9tZW51aXRlbT0mRWRpdAotRmlsZV9tZW51aXRlbT0mRmlsZQotQm9sZD1Cb2xkCi1JdGFsaWM9SXRhbGljCi1VbmRlcmxpbmU9VW5kZXJsaW5lCi1TdHJpa2VvdXQ9U3RyaWtlb3V0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzkzN2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+Ci12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmElQWRkcmVzc0Jvb2sgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YSVDb250cm9sRXhhbXBsZSA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YSVGaWxlVmlld2VyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YSVIZWxsb1dvcmxkMSA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmElSGVsbG9Xb3JsZDIgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhJUhlbGxvV29ybGQzID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDQuamF2YSVIZWxsb1dvcmxkNCA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ1LmphdmElSGVsbG9Xb3JsZDUgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhJUhvdmVySGVscCA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YSVJbWFnZUFuYWx5emVyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhJUphdmFWaWV3ZXIgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmElVGV4dEVkaXRvciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+IgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3ZTY5YTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rOwotCi0KLS8qIEltcG9ydHMgKi8KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQWRkcmVzc0Jvb2tFeGFtcGxlIGlzIGFuIGV4YW1wbGUgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIGFkZHJlc3MgYm9vay4gIFRoaXMgYXBwbGljYXRpb24gaGFzIAotICogc2F2ZSwgbG9hZCwgc29ydGluZywgYW5kIHNlYXJjaGluZyBmdW5jdGlvbnMgY29tbW9uCi0gKiB0byBiYXNpYyBhZGRyZXNzIGJvb2tzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0Jvb2sgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzQWRkcmVzc0Jvb2sgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2FkZHJlc3Nib29rIik7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQkKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgU2VhcmNoRGlhbG9nIHNlYXJjaERpYWxvZzsKLQkKLQlwcml2YXRlIEZpbGUgZmlsZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZDsKLQkKLQlwcml2YXRlIFN0cmluZ1tdIGNvcHlCdWZmZXI7Ci0KLQlwcml2YXRlIGludCBsYXN0U29ydENvbHVtbj0gLTE7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICJcdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7cmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJMYXN0X25hbWUiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpcnN0X25hbWUiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkJ1c2luZXNzX3Bob25lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJIb21lX3Bob25lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJFbWFpbCIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmF4Iil9OwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQWRkcmVzc0Jvb2sgYXBwbGljYXRpb24gPSBuZXcgQWRkcmVzc0Jvb2soKTsKLQlTaGVsbCBzaGVsbCA9IGFwcGxpY2F0aW9uLm9wZW4oZGlzcGxheSk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSl7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJZS5kb2l0ID0gY2xvc2VBZGRyZXNzQm9vaygpOwotCQl9Ci0JfSk7Ci0JCi0JY3JlYXRlTWVudUJhcigpOwotCi0Jc2VhcmNoRGlhbG9nID0gbmV3IFNlYXJjaERpYWxvZyhzaGVsbCk7Ci0Jc2VhcmNoRGlhbG9nLnNldFNlYXJjaEFyZWFOYW1lcyhjb2x1bW5OYW1lcyk7Ci0Jc2VhcmNoRGlhbG9nLnNldFNlYXJjaEFyZWFMYWJlbChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNvbHVtbiIpKTsKLQlzZWFyY2hEaWFsb2cuYWRkRmluZExpc3RlbmVyKG5ldyBGaW5kTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgYm9vbGVhbiBmaW5kKCkgewotCQkJcmV0dXJuIGZpbmRFbnRyeSgpOwotCQl9Ci0JfSk7Ci0JCQkJCQotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsJCi0JdGFibGUuc2V0TWVudShjcmVhdGVQb3BVcE1lbnUoKSk7CQotCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPiAwKSBlZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0JZm9yKGludCBpID0gMDsgaSA8IGNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChjb2x1bW5OYW1lc1tpXSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBpOwotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0KGNvbHVtbkluZGV4KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JbmV3QWRkcmVzc0Jvb2soKTsKLQotCXNoZWxsLnNldFNpemUodGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZUFkZHJlc3NCb29rKCkgewotCWlmKGlzTW9kaWZpZWQpIHsKLQkJLy9hc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gc2F2ZSBjdXJyZW50IGFkZHJlc3MgYm9vawotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQlib3guc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQlib3guc2V0TWVzc2FnZShyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNsb3NlX3NhdmUiKSk7Ci0JCi0JCWludCBjaG9pY2UgPSBib3gub3BlbigpOwotCQlpZihjaG9pY2UgPT0gU1dULkNBTkNFTCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYoY2hvaWNlID09IFNXVC5ZRVMpIHsKLQkJCWlmICghc2F2ZSgpKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCQotCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArKykgewotCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JfQotCQotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBDcmVhdGVzIHRoZSBtZW51IGF0IHRoZSB0b3Agb2YgdGhlIHNoZWxsIHdoZXJlIG1vc3QKLSAqIG9mIHRoZSBwcm9ncmFtcyBmdW5jdGlvbmFsaXR5IGlzIGFjY2Vzc2VkLgotICoKLSAqIEByZXR1cm4JCVRoZSA8Y29kZT5NZW51PC9jb2RlPiB3aWRnZXQgdGhhdCB3YXMgY3JlYXRlZAotICovCi1wcml2YXRlIE1lbnUgY3JlYXRlTWVudUJhcigpIHsKLQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkKLQkvL2NyZWF0ZSBlYWNoIGhlYWRlciBhbmQgc3ViTWVudSBmb3IgdGhlIG1lbnVCYXIKLQljcmVhdGVGaWxlTWVudShtZW51QmFyKTsKLQljcmVhdGVFZGl0TWVudShtZW51QmFyKTsKLQljcmVhdGVTZWFyY2hNZW51KG1lbnVCYXIpOwotCWNyZWF0ZUhlbHBNZW51KG1lbnVCYXIpOwotCQotCXJldHVybiBtZW51QmFyOwotfQotCi0vKioKLSAqIENvbnZlcnRzIGFuIGVuY29kZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhIFN0cmluZyBhcnJheSByZXByZXNlbnRpbmcgYSB0YWJsZSBlbnRyeS4KLSAqLwotcHJpdmF0ZSBTdHJpbmdbXSBkZWNvZGVMaW5lKFN0cmluZyBsaW5lKSB7Ci0JaWYobGluZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlTdHJpbmdbXSBwYXJzZWRMaW5lID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgcGFyc2VkTGluZS5sZW5ndGggLSAxOyBpKyspIHsKLQkJaW50IGluZGV4ID0gbGluZS5pbmRleE9mKERFTElNSVRFUik7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlwYXJzZWRMaW5lW2ldID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgREVMSU1JVEVSLmxlbmd0aCgpLCBsaW5lLmxlbmd0aCgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCWlmIChsaW5lLmluZGV4T2YoREVMSU1JVEVSKSAhPSAtMSkgcmV0dXJuIG51bGw7Ci0JCi0JcGFyc2VkTGluZVtwYXJzZWRMaW5lLmxlbmd0aCAtIDFdID0gbGluZTsKLQotCXJldHVybiBwYXJzZWRMaW5lOwotfQotcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLXByaXZhdGUgdm9pZCBlZGl0RW50cnkoVGFibGVJdGVtIGl0ZW0pIHsKLQlEYXRhRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IERhdGFFbnRyeURpYWxvZyhzaGVsbCk7Ci0JZGlhbG9nLnNldExhYmVscyhjb2x1bW5OYW1lcyk7Ci0JU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQl2YWx1ZXNbaV0gPSBpdGVtLmdldFRleHQoaSk7Ci0JfQotCWRpYWxvZy5zZXRWYWx1ZXModmFsdWVzKTsKLQl2YWx1ZXMgPSBkaWFsb2cub3BlbigpOwotCWlmICh2YWx1ZXMgIT0gbnVsbCkgewotCQlpdGVtLnNldFRleHQodmFsdWVzKTsKLQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JfQotfQotcHJpdmF0ZSBTdHJpbmcgZW5jb2RlTGluZShTdHJpbmdbXSB0YWJsZUl0ZW1zKSB7Ci0JU3RyaW5nIGxpbmUgPSAiIjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCWxpbmUgKz0gdGFibGVJdGVtc1tpXSArIERFTElNSVRFUjsKLQl9Ci0JbGluZSArPSB0YWJsZUl0ZW1zW3RhYmxlSXRlbXMubGVuZ3RoIC0gMV0gKyAiXG4iOwotCQotCXJldHVybiBsaW5lOwotfQotcHJpdmF0ZSBib29sZWFuIGZpbmRFbnRyeSgpIHsKLQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3Ioc2hlbGwuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpOwotCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkKLQlib29sZWFuIG1hdGNoQ2FzZSA9IHNlYXJjaERpYWxvZy5nZXRNYXRjaENhc2UoKTsKLQlib29sZWFuIG1hdGNoV29yZCA9IHNlYXJjaERpYWxvZy5nZXRNYXRjaFdvcmQoKTsKLQlTdHJpbmcgc2VhcmNoU3RyaW5nID0gc2VhcmNoRGlhbG9nLmdldFNlYXJjaFN0cmluZygpOwotCWludCBjb2x1bW4gPSBzZWFyY2hEaWFsb2cuZ2V0U2VsZWN0ZWRTZWFyY2hBcmVhKCk7Ci0JCi0Jc2VhcmNoU3RyaW5nID0gbWF0Y2hDYXNlID8gc2VhcmNoU3RyaW5nIDogc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCi0JYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCWlmIChzZWFyY2hEaWFsb2cuZ2V0U2VhcmNoRG93bigpKSB7Ci0JCWZvcihpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOyBpIDwgdGFibGUuZ2V0SXRlbUNvdW50KCk7IGkrKykgewotCQkJaWYgKGZvdW5kID0gZmluZE1hdGNoKHNlYXJjaFN0cmluZywgdGFibGUuZ2V0SXRlbShpKSwgY29sdW1uLCBtYXRjaFdvcmQsIG1hdGNoQ2FzZSkpewotCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvcihpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJaWYgKGZvdW5kID0gZmluZE1hdGNoKHNlYXJjaFN0cmluZywgdGFibGUuZ2V0SXRlbShpKSwgY29sdW1uLCBtYXRjaFdvcmQsIG1hdGNoQ2FzZSkpewotCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JaWYgKHdhaXRDdXJzb3IgIT0gbnVsbCkKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCQotCXJldHVybiBmb3VuZDsKLX0KLXByaXZhdGUgYm9vbGVhbiBmaW5kTWF0Y2goU3RyaW5nIHNlYXJjaFN0cmluZywgVGFibGVJdGVtIGl0ZW0sIGludCBjb2x1bW4sIGJvb2xlYW4gbWF0Y2hXb3JkLCBib29sZWFuIG1hdGNoQ2FzZSkgewotCQotCVN0cmluZyB0YWJsZVRleHQgPSBtYXRjaENhc2UgPyBpdGVtLmdldFRleHQoY29sdW1uKSA6IGl0ZW0uZ2V0VGV4dChjb2x1bW4pLnRvTG93ZXJDYXNlKCk7Ci0JaWYgKG1hdGNoV29yZCkgewotCQlpZiAodGFibGVUZXh0ICE9IG51bGwgJiYgdGFibGVUZXh0LmVxdWFscyhzZWFyY2hTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQl9IGVsc2UgewotCQlpZih0YWJsZVRleHQhPSBudWxsICYmIHRhYmxlVGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZykgIT0gLTEpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLXByaXZhdGUgdm9pZCBuZXdBZGRyZXNzQm9vaygpIHsJCi0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlRpdGxlX2JhciIpICsgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfdGl0bGUiKSk7Ci0JZmlsZSA9IG51bGw7Ci0JaXNNb2RpZmllZCA9IGZhbHNlOwotfQotcHJpdmF0ZSB2b2lkIG5ld0VudHJ5KCkgewotCURhdGFFbnRyeURpYWxvZyBkaWFsb2cgPSBuZXcgRGF0YUVudHJ5RGlhbG9nKHNoZWxsKTsKLQlkaWFsb2cuc2V0TGFiZWxzKGNvbHVtbk5hbWVzKTsKLQlTdHJpbmdbXSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoZGF0YSk7Ci0JCWlzTW9kaWZpZWQgPSB0cnVlOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIG9wZW5BZGRyZXNzQm9vaygpIHsJCi0JRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmFkcjsiLCAiKi4qIn0pOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHtyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkJvb2tfZmlsdGVyX25hbWUiKSArICIgKCouYWRyKSIsIAotCQkJCQkJCQkJCQlyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFsbF9maWx0ZXJfbmFtZSIpICsgIiAoKi4qKSJ9KTsKLQlTdHJpbmcgbmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0JaWYobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGUiKStmaWxlLmdldE5hbWUoKSsiICIrcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEb2VzX25vdF9leGlzdCIpKTsgCi0JCXJldHVybjsKLQl9Ci0JCi0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JRmlsZVJlYWRlciBmaWxlUmVhZGVyID0gbnVsbDsKLQlCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG51bGw7Ci0JU3RyaW5nW10gZGF0YSA9IG5ldyBTdHJpbmdbMF07Ci0JdHJ5IHsKLQkJZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmaWxlUmVhZGVyKTsKLQkJU3RyaW5nIG5leHRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJd2hpbGUgKG5leHRMaW5lICE9IG51bGwpewotCQkJU3RyaW5nW10gbmV3RGF0YSA9IG5ldyBTdHJpbmdbZGF0YS5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJbmV3RGF0YVtkYXRhLmxlbmd0aF0gPSBuZXh0TGluZTsKLQkJCWRhdGEgPSBuZXdEYXRhOwotCQkJbmV4dExpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQl9Ci0JfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX25vdF9mb3VuZCIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUgKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIklPX2Vycm9yX3JlYWQiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybjsKLQl9IGZpbmFsbHkgewkKLQkJCi0JCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCi0JCWlmKGZpbGVSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlUmVhZGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl9jbG9zZSIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JU3RyaW5nW11bXSB0YWJsZUluZm8gPSBuZXcgU3RyaW5nW2RhdGEubGVuZ3RoXVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlpbnQgd3JpdGVJbmRleCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZ1tdIGxpbmUgPSBkZWNvZGVMaW5lKGRhdGFbaV0pOwotCQlpZiAobGluZSAhPSBudWxsKSB0YWJsZUluZm9bd3JpdGVJbmRleCsrXSA9IGxpbmU7Ci0JfQotCWlmICh3cml0ZUluZGV4ICE9IGRhdGEubGVuZ3RoKSB7Ci0JCVN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t3cml0ZUluZGV4XVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0YWJsZUluZm8sIDAsIHJlc3VsdCwgMCwgd3JpdGVJbmRleCk7Ci0JCXRhYmxlSW5mbyA9IHJlc3VsdDsKLQl9Ci0JQXJyYXlzLnNvcnQodGFibGVJbmZvLCBuZXcgUm93Q29tcGFyYXRvcigwKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSW5mby5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KHRhYmxlSW5mb1tpXSk7Ci0JfQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKStmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCWlzTW9kaWZpZWQgPSBmYWxzZTsKLQl0aGlzLmZpbGUgPSBmaWxlOwotfQotcHJpdmF0ZSBib29sZWFuIHNhdmUoKSB7Ci0JaWYoZmlsZSA9PSBudWxsKSByZXR1cm4gc2F2ZUFzKCk7Ci0JCi0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCVN0cmluZ1tdIGxpbmVzID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmdbXSBpdGVtVGV4dCA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaXRlbVRleHQubGVuZ3RoOyBqKyspIHsKLQkJCWl0ZW1UZXh0W2pdID0gaXRlbXNbaV0uZ2V0VGV4dChqKTsKLQkJfQotCQlsaW5lc1tpXSA9IGVuY29kZUxpbmUoaXRlbVRleHQpOwotCX0KLQkJCi0JRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbnVsbDsKLQl0cnkgeyAKLQkJZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJZmlsZVdyaXRlci53cml0ZShsaW5lc1tpXSk7Ci0JCX0KLQl9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGVfbm90X2ZvdW5kIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlICkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl93cml0ZSIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZmluYWxseSB7Ci0JCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCQotCQlpZihmaWxlV3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZVdyaXRlci5jbG9zZSgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3JfY2xvc2UiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlRpdGxlX2JhciIpK2ZpbGUuZ2V0TmFtZSgpKTsKLQlpc01vZGlmaWVkID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcml2YXRlIGJvb2xlYW4gc2F2ZUFzKCkgewotCQkKLQlGaWxlRGlhbG9nIHNhdmVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCXNhdmVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmFkcjsiLCAgIiouKiJ9KTsKLQlzYXZlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IkFkZHJlc3MgQm9va3MgKCouYWRyKSIsICJBbGwgRmlsZXMgIn0pOwotCQotCXNhdmVEaWFsb2cub3BlbigpOwotCVN0cmluZyBuYW1lID0gc2F2ZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCQkKLQlpZihuYW1lLmVxdWFscygiIikpIHJldHVybiBmYWxzZTsKLQotCWlmKG5hbWUuaW5kZXhPZigiLmFkciIpICE9IG5hbWUubGVuZ3RoKCkgLSA0KSB7Ci0JCW5hbWUgKz0gIi5hZHIiOwotCX0KLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNhdmVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLCBuYW1lKTsKLQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuWUVTIHwgU1dULk5PKTsKLQkJYm94LnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2FzX3RpdGxlIikpOwotCQlib3guc2V0TWVzc2FnZShyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGUiKSArIGZpbGUuZ2V0TmFtZSgpKyIgIityZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlF1ZXJ5X292ZXJ3cml0ZSIpKTsKLQkJaWYoYm94Lm9wZW4oKSAhPSBTV1QuWUVTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JdGhpcy5maWxlID0gZmlsZTsKLQlyZXR1cm4gc2F2ZSgpOwkKLX0KLXByaXZhdGUgdm9pZCBzb3J0KGludCBjb2x1bW4pIHsKLQlpZih0YWJsZS5nZXRJdGVtQ291bnQoKSA8PSAxKSByZXR1cm47Ci0KLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JU3RyaW5nW11bXSBkYXRhID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdW3RhYmxlLmdldENvbHVtbkNvdW50KCldOwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlmb3IoaW50IGogPSAwOyBqIDwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsgaisrKSB7Ci0JCQlkYXRhW2ldW2pdID0gaXRlbXNbaV0uZ2V0VGV4dChqKTsKLQkJfQotCX0KLQkKLQlBcnJheXMuc29ydChkYXRhLCBuZXcgUm93Q29tcGFyYXRvcihjb2x1bW4pKTsKLQkKLQlpZiAobGFzdFNvcnRDb2x1bW4gIT0gY29sdW1uKSB7Ci0JCXRhYmxlLnNldFNvcnRDb2x1bW4odGFibGUuZ2V0Q29sdW1uKGNvbHVtbikpOwotCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5ET1dOKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRUZXh0KGRhdGFbaV0pOwotCQl9Ci0JCWxhc3RTb3J0Q29sdW1uID0gY29sdW1uOwotCX0gZWxzZSB7Ci0JCS8vIHJldmVyc2Ugb3JkZXIgaWYgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNlbGVjdGVkIGFnYWluCi0JCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQkJaW50IGogPSBkYXRhLmxlbmd0aCAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRUZXh0KGRhdGFbai0tXSk7Ci0JCX0KLQkJbGFzdFNvcnRDb2x1bW4gPSAtMTsKLQl9Ci0JCi19Ci0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBGaWxlIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhciBNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBGaWxlIHN1Ym1lbnUuCi0gKi8KLXByaXZhdGUgdm9pZCBjcmVhdGVGaWxlTWVudShNZW51IG1lbnVCYXIpIHsKLQkvL0ZpbGUgbWVudS4KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX21lbnVfdGl0bGUiKSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uc2V0TWVudShtZW51KTsKLQkvKiogCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIGhhbmRsZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIAotCSAqIHNvbWUgaXRlbXMgaW4gdGhlIEVkaXQgc3VibWVudS4KLQkgKi8KLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaXRlbXNbMV0uc2V0RW5hYmxlZCh0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDApOyAvLyBlZGl0IGNvbnRhY3QKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQoKGZpbGUgIT0gbnVsbCkgJiYgaXNNb2RpZmllZCk7IC8vIHNhdmUKLQkJCWl0ZW1zWzZdLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIHNhdmUgYXMKLQkJfQotCX0pOwotCi0KLQkvL0ZpbGUgLT4gTmV3IENvbnRhY3QKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfY29udGFjdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ04nKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQluZXdFbnRyeSgpOwotCQl9Ci0JfSk7Ci0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdF9jb250YWN0IikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnRScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCQotCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkKLQkvL0ZpbGUgLT4gTmV3IEFkZHJlc3MgQm9vawotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk5ld19hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdCJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNsb3NlQWRkcmVzc0Jvb2soKSkgewotCQkJCW5ld0FkZHJlc3NCb29rKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCS8vRmlsZSAtPiBPcGVuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiT3Blbl9hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdPJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNsb3NlQWRkcmVzc0Jvb2soKSkgewotCQkJCW9wZW5BZGRyZXNzQm9vaygpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQkvL0ZpbGUgLT4gU2F2ZS4KLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2FkZHJlc3NfYm9vayIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1MnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzYXZlKCk7Ci0JCX0KLQl9KTsKLQkKLQkvL0ZpbGUgLT4gU2F2ZSBBcy4KLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2Jvb2tfYXMiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdBJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2F2ZUFzKCk7Ci0JCX0KLQl9KTsKLQotCQkKLQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCi0JLy9GaWxlIC0+IEV4aXQuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRXhpdCIpKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIEVkaXQgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyIE1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIEVkaXQgc3VibWVudS4KLSAqCi0gKiBAc2VlCSNjcmVhdGVTb3J0TWVudSgpCi0gKi8KLXByaXZhdGUgTWVudUl0ZW0gY3JlYXRlRWRpdE1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9FZGl0IG1lbnUuCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdF9tZW51X3RpdGxlIikpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUobWVudSk7Ci0JCi0JLyoqIAotCSAqIEFkZCBhIGxpc3RlbmVyIHRvIGhhbmRsZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIAotCSAqIHNvbWUgaXRlbXMgaW4gdGhlIEVkaXQgc3VibWVudS4KLQkgKi8KLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCWl0ZW1zWzBdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGVkaXQKLQkJCWl0ZW1zWzFdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGNvcHkKLQkJCWl0ZW1zWzJdLnNldEVuYWJsZWQoY29weUJ1ZmZlciAhPSBudWxsKTsgLy8gcGFzdGUKLQkJCWl0ZW1zWzNdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGRlbGV0ZQotCQkJaXRlbXNbNV0uc2V0RW5hYmxlZCh0YWJsZS5nZXRJdGVtQ291bnQoKSAhPSAwKTsgLy8gc29ydAotCQl9Ci0JfSk7Ci0JCi0JLy9FZGl0IC0+IEVkaXQKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJFZGl0IikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnRScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCS8vRWRpdCAtPiBDb3B5Ci0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ29weSIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0MnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQljb3B5QnVmZmVyID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29weUJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlCdWZmZXJbaV0gPSBpdGVtc1swXS5nZXRUZXh0KGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9FZGl0IC0+IFBhc3RlCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUGFzdGUiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdWJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNvcHlCdWZmZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoY29weUJ1ZmZlcik7Ci0JCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBEZWxldGUKLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEZWxldGUiKSk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJaXRlbXNbMF0uZGlzcG9zZSgpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7CQl9Ci0JfSk7Ci0JCi0JbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQotCS8vRWRpdCAtPiBTb3J0KENhc2NhZGUpCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU29ydCIpKTsKLQlNZW51IHN1Ym1lbnUgPSBjcmVhdGVTb3J0TWVudSgpOwotCXN1Ykl0ZW0uc2V0TWVudShzdWJtZW51KTsKLQkKLQlyZXR1cm4gaXRlbTsKLQkKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgU29ydCBjYXNjYWRpbmcgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEByZXR1cm4JTWVudQotICoJCQlUaGUgY2FzY2FkaW5nIG1lbnUgd2l0aCBhbGwgdGhlIHNvcnQgbWVudSBpdGVtcyBvbiBpdC4KLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZVNvcnRNZW51KCkgewotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlNZW51SXRlbSBzdWJpdGVtOwotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQlzdWJpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuTk9ORSk7Ci0JCXN1Yml0ZW0uc2V0VGV4dChjb2x1bW5OYW1lcyBbaV0pOwotCQlmaW5hbCBpbnQgY29sdW1uID0gaTsKLQkJc3ViaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0KGNvbHVtbik7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXJldHVybiBzdWJtZW51OwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBTZWFyY2ggc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyCU1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIFNlYXJjaCBzdWJtZW51LgotICovCi1wcml2YXRlIHZvaWQgY3JlYXRlU2VhcmNoTWVudShNZW51IG1lbnVCYXIpIHsKLQkvL1NlYXJjaCBtZW51LgotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNlYXJjaF9tZW51X3RpdGxlIikpOwotCU1lbnUgc2VhcmNoTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUoc2VhcmNoTWVudSk7Ci0KLQkvL1NlYXJjaCAtPiBGaW5kLi4uCi0JaXRlbSA9IG5ldyBNZW51SXRlbShzZWFyY2hNZW51LCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmluZCIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0YnKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0TWF0Y2hDYXNlKGZhbHNlKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRNYXRjaFdvcmQoZmFsc2UpOwotCQkJc2VhcmNoRGlhbG9nLnNldFNlYXJjaERvd24odHJ1ZSk7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0U2VhcmNoU3RyaW5nKCIiKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRTZWxlY3RlZFNlYXJjaEFyZWEoMCk7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci0KLQkvL1NlYXJjaCAtPiBGaW5kIE5leHQKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHNlYXJjaE1lbnUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaW5kX25leHQiKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuRjMpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNlYXJjaERpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9KTsKLX0KLQotLyoqIAotICogQ3JlYXRlcyBhbGwgaXRlbXMgbG9jYXRlZCBpbiB0aGUgcG9wdXAgbWVudSBhbmQgYXNzb2NpYXRlcwotICogYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUgZnVuY3Rpb25zLgotICoKLSAqIEByZXR1cm4JTWVudQotICoJCQlUaGUgY3JlYXRlZCBwb3B1cCBtZW51LgotICovCi1wcml2YXRlIE1lbnUgY3JlYXRlUG9wVXBNZW51KCkgewotCU1lbnUgcG9wVXBNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCi0JLyoqIAotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JcG9wVXBNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCWl0ZW1zWzJdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGVkaXQKLQkJCWl0ZW1zWzNdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGNvcHkKLQkJCWl0ZW1zWzRdLnNldEVuYWJsZWQoY29weUJ1ZmZlciAhPSBudWxsKTsgLy8gcGFzdGUKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGRlbGV0ZQotCQkJaXRlbXNbN10uc2V0RW5hYmxlZCh0YWJsZS5nZXRJdGVtQ291bnQoKSAhPSAwKTsgLy8gZmluZAotCQl9Ci0JfSk7Ci0KLQkvL05ldwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX25ldyIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQluZXdFbnRyeSgpOwotCQl9Ci0JfSk7Ci0JCi0JbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlNFUEFSQVRPUik7CQotCQotCS8vRWRpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2VkaXQiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJZWRpdEVudHJ5KGl0ZW1zWzBdKTsKLQkJfQotCX0pOwotCi0JLy9Db3B5Ci0JaXRlbSA9IG5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJQb3BfdXBfY29weSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQljb3B5QnVmZmVyID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29weUJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlCdWZmZXJbaV0gPSBpdGVtc1swXS5nZXRUZXh0KGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9QYXN0ZQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX3Bhc3RlIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjb3B5QnVmZmVyID09IG51bGwpIHJldHVybjsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KGNvcHlCdWZmZXIpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQkvL0RlbGV0ZQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2RlbGV0ZSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQlpdGVtc1swXS5kaXNwb3NlKCk7Ci0JCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQkKLQkvL0ZpbmQuLi4KLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9maW5kIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNlYXJjaERpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9KTsKLQotCXJldHVybiBwb3BVcE1lbnU7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIEhlbHAgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyCU1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIEhlbHAgc3VibWVudS4KLSAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlbHBNZW51KE1lbnUgbWVudUJhcikgewotCQotCS8vSGVscCBNZW51Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSGVscF9tZW51X3RpdGxlIikpOwkKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KG1lbnUpOwotCQotCS8vSGVscCAtPiBBYm91dCBUZXh0IEVkaXRvcgotCU1lbnVJdGVtIHN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0IikpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5OT05FKTsKLQkJCWJveC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQWJvdXRfMSIpICsgc2hlbGwuZ2V0VGV4dCgpKTsKLQkJCWJveC5zZXRNZXNzYWdlKHNoZWxsLmdldFRleHQoKSArIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQWJvdXRfMiIpKTsKLQkJCWJveC5vcGVuKCk7CQkKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIFRvIGNvbXBhcmUgZW50cmllcyAocm93cykgYnkgdGhlIGdpdmVuIGNvbHVtbgotICovCi1wcml2YXRlIGNsYXNzIFJvd0NvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQlwcml2YXRlIGludCBjb2x1bW47Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJvd0NvbXBhcmF0b3IgZ2l2ZW4gdGhlIGNvbHVtbiBpbmRleAotCSAqIEBwYXJhbSBjb2wgVGhlIGluZGV4IChzdGFydGluZyBhdCB6ZXJvKSBvZiB0aGUgY29sdW1uCi0JICovCi0JcHVibGljIFJvd0NvbXBhcmF0b3IoaW50IGNvbCkgewotCQljb2x1bW4gPSBjb2w7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHR3byByb3dzICh0eXBlIFN0cmluZ1tdKSB1c2luZyB0aGUgc3BlY2lmaWVkCi0JICogY29sdW1uIGVudHJ5LgotCSAqIEBwYXJhbSBvYmoxIEZpcnN0IHJvdyB0byBjb21wYXJlCi0JICogQHBhcmFtIG9iajIgU2Vjb25kIHJvdyB0byBjb21wYXJlCi0JICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGxlc3MgdGhhbiBvYmoyLCBwb3NpdGl2ZSBpZgotCSAqIAkJCW9iajEgZ3JlYXRlciB0aGFuIG9iajIsIGFuZCB6ZXJvIGlmIGVxdWFsLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJU3RyaW5nW10gcm93MSA9IChTdHJpbmdbXSlvYmoxOwotCQlTdHJpbmdbXSByb3cyID0gKFN0cmluZ1tdKW9iajI7Ci0JCQotCQlyZXR1cm4gcm93MVtjb2x1bW5dLmNvbXBhcmVUbyhyb3cyW2NvbHVtbl0pOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRGF0YUVudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZjM0YzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRGF0YUVudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBEYXRhRW50cnlEaWFsb2cgY2xhc3MgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIGRpYWxvZyB0aGF0IGFjY2VwdHMgYmFzaWMgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhdAotICogaXMgYWRkZWQgdG8gYSA8Y29kZT5UYWJsZTwvY29kZT4gd2lkZ2V0IG9yIGVkaXRzIGEgPGNvZGU+VGFibGVJdGVtPC9jb2RlPiBlbnRyeSAKLSAqIHRvIHJlcHJlc2VudCB0aGUgZW50ZXJlZCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgRGF0YUVudHJ5RGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0FkZHJlc3NCb29rID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19hZGRyZXNzYm9vayIpOwotCQotCVNoZWxsIHNoZWxsOwotCVN0cmluZ1tdIHZhbHVlczsKLQlTdHJpbmdbXSBsYWJlbHM7Ci0JCi1wdWJsaWMgRGF0YUVudHJ5RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsJCQotfQotCi1wcml2YXRlIHZvaWQgYWRkVGV4dExpc3RlbmVyKGZpbmFsIFRleHQgdGV4dCkgewotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJSW50ZWdlciBpbmRleCA9IChJbnRlZ2VyKSh0ZXh0LmdldERhdGEoImluZGV4IikpOwotCQkJdmFsdWVzW2luZGV4LmludFZhbHVlKCldID0gdGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQl9KTsKLX0KLXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sQnV0dG9ucygpIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQotCUJ1dHRvbiBva0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0Jb2tCdXR0b24uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk9LIikpOwotCW9rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl2YWx1ZXMgPSBudWxsOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnNldERlZmF1bHRCdXR0b24ob2tCdXR0b24pOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGV4dFdpZGdldHMoKSB7Ci0JaWYgKGxhYmVscyA9PSBudWxsKSByZXR1cm47Ci0JCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlpZiAodmFsdWVzID09IG51bGwpCi0JCXZhbHVlcyA9IG5ldyBTdHJpbmdbbGFiZWxzLmxlbmd0aF07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsc1tpXSk7CQotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KHZhbHVlc1tpXSk7Ci0JCX0KLQkJdGV4dC5zZXREYXRhKCJpbmRleCIsIG5ldyBJbnRlZ2VyKGkpKTsKLQkJYWRkVGV4dExpc3RlbmVyKHRleHQpOwkKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRMYWJlbHMoKSB7Ci0JcmV0dXJuIGxhYmVsczsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JcmV0dXJuIHNoZWxsLmdldFRleHQoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldHMgaW4gdGhlIGRpYWxvZyBpbiBhIAotICogPGNvZGU+U3RyaW5nPC9jb2RlPiBhcnJheS4KLSAqCi0gKiBAcmV0dXJuCVN0cmluZ1tdCQotICoJCQlUaGUgY29udGVudHMgb2YgdGhlIHRleHQgd2lkZ2V0cyBvZiB0aGUgZGlhbG9nLgotICoJCQlNYXkgcmV0dXJuIG51bGwgaWYgYWxsIHRleHQgd2lkZ2V0cyBhcmUgZW1wdHkuCi0gKi8gCi1wdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotCXJldHVybiB2YWx1ZXM7Ci19Ci0vKiogCi0gKiBPcGVucyB0aGUgZGlhbG9nIGluIHRoZSBnaXZlbiBzdGF0ZS4gIFNldHMgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IGNvbnRlbnRzIAotICogYW5kIGRpYWxvZyBiZWhhdmlvdXIgYWNjb3JkaW5nbHkuCi0gKgotICogQHBhcmFtIAlkaWFsb2dTdGF0ZQlpbnQKLSAqCQkJCQlUaGUgc3RhdGUgdGhlIGRpYWxvZyBzaG91bGQgYmUgb3BlbmVkIGluLgotICovCi1wdWJsaWMgU3RyaW5nW10gb3BlbigpIHsKLQljcmVhdGVUZXh0V2lkZ2V0cygpOwotCWNyZWF0ZUNvbnRyb2xCdXR0b25zKCk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSl7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkKLQlyZXR1cm4gZ2V0VmFsdWVzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRMYWJlbHMoU3RyaW5nW10gbGFiZWxzKSB7Ci0JdGhpcy5sYWJlbHMgPSBsYWJlbHM7Ci19Ci1wdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLX0KLS8qKgotICogU2V0cyB0aGUgdmFsdWVzIG9mIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXRzIG9mIHRoZSBkaWFsb2cgdG8KLSAqIHRoZSB2YWx1ZXMgc3VwcGxpZWQgaW4gdGhlIHBhcmFtZXRlciBhcnJheS4KLSAqCi0gKiBAcGFyYW0JaXRlbUluZm8JU3RyaW5nW10KLSAqIAkJCQkJCVRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhlIGRpYWxvZyBjb250ZW50cyB3aWxsIGJlIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZ1tdIGl0ZW1JbmZvKSB7Ci0JaWYgKGxhYmVscyA9PSBudWxsKSByZXR1cm47Ci0JCi0JaWYgKHZhbHVlcyA9PSBudWxsKQotCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotCi0JaW50IG51bUl0ZW1zID0gTWF0aC5taW4odmFsdWVzLmxlbmd0aCwgaXRlbUluZm8ubGVuZ3RoKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotCQl2YWx1ZXNbaV0gPSBpdGVtSW5mb1tpXTsKLQl9CQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9GaW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTczMjUwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9GaW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotcHVibGljIGludGVyZmFjZSBGaW5kTGlzdGVuZXIgewotCi1wdWJsaWMgYm9vbGVhbiBmaW5kKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svU2VhcmNoRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0YjY2ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svU2VhcmNoRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBTZWFyY2hEaWFsb2cgaXMgYSBzaW1wbGUgY2xhc3MgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgYmFzaWMgc2VhcmNoIGRpYWxvZy4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaERpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNBZGRyZXNzQm9vayA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYWRkcmVzc2Jvb2siKTsKLQotCVNoZWxsIHNoZWxsOwotCVRleHQgc2VhcmNoVGV4dDsKLQlDb21ibyBzZWFyY2hBcmVhOwotCUxhYmVsIHNlYXJjaEFyZWFMYWJlbDsKLQlCdXR0b24gbWF0Y2hDYXNlOwotCUJ1dHRvbiBtYXRjaFdvcmQ7Ci0JQnV0dG9uIGZpbmRCdXR0b247Ci0JQnV0dG9uIGRvd247Ci0JRmluZExpc3RlbmVyIGZpbmRIYW5kbGVyOwotCi0vKioKLSAqIENsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgcGFyZW50IHNoZWxsIGFuZCB0aGUgdGFibGUgd2lkZ2V0IHRoYXQKLSAqIHRoZSBkaWFsb2cgd2lsbCBzZWFyY2guCi0gKgotICogQHBhcmFtIHBhcmVudAlTaGVsbCAKLSAqCQkJVGhlIHNoZWxsIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGUgZGlhbG9nLgotICovCi1wdWJsaWMgU2VhcmNoRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkNMT1NFIHwgU1dULkJPUkRFUiB8IFNXVC5USVRMRSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2VhcmNoX2RpYWxvZ190aXRsZSIpKTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKXsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkvLyBkb24ndCBkaXNwb3NlIG9mIHRoZSBzaGVsbCwganVzdCBoaWRlIGl0IGZvciBsYXRlciB1c2UKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQkJCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlsYWJlbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2ZpbmRfd2hhdCIpKTsJCi0Jc2VhcmNoVGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQlzZWFyY2hUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXNlYXJjaFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWJvb2xlYW4gZW5hYmxlRmluZCA9IChzZWFyY2hUZXh0LmdldENoYXJDb3VudCgpICE9IDApOwotCQkJZmluZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZUZpbmQpOwotCQl9Ci0JfSk7Ci0KLQlzZWFyY2hBcmVhTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlzZWFyY2hBcmVhID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0Jc2VhcmNoQXJlYS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQltYXRjaENhc2UgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCW1hdGNoQ2FzZS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX21hdGNoX2Nhc2UiKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JbWF0Y2hDYXNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCW1hdGNoV29yZCA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JbWF0Y2hXb3JkLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfbWF0Y2hfd29yZCIpKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQltYXRjaFdvcmQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCi0JR3JvdXAgZGlyZWN0aW9uID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGlyZWN0aW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCWRpcmVjdGlvbi5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsJCi0JZGlyZWN0aW9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyZWN0aW9uIikpOwotCQotCUJ1dHRvbiB1cCA9IG5ldyBCdXR0b24oZGlyZWN0aW9uLCBTV1QuUkFESU8pOwotCXVwLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyX3VwIikpOwotCXVwLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQotCWRvd24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbiwgU1dULlJBRElPKTsKLQlkb3duLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyX2Rvd24iKSk7Ci0JZG93bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JZmluZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JZmluZEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2ZpbmQiKSk7Ci0JZmluZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCWZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JZmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKCFmaW5kSGFuZGxlci5maW5kKCkpewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCWJveC5zZXRUZXh0KHNoZWxsLmdldFRleHQoKSk7Ci0JCQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5ub3RfZmluZCIpICsgIlwiIiArIHNlYXJjaFRleHQuZ2V0VGV4dCgpICsgIlwiIik7Ci0JCQkJYm94Lm9wZW4oKTsJCi0JCQl9CQkKLQkJfQotCX0pOwotCQkJCi0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnBhY2soKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoQXJlYUxhYmVsKFN0cmluZyBsYWJlbCkgewotCXJldHVybiBzZWFyY2hBcmVhTGFiZWwuZ2V0VGV4dCgpOwotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0c2VhcmNoQXJlYU5hbWVzKCkgewotCXJldHVybiBzZWFyY2hBcmVhLmdldEl0ZW1zKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBnZXRNYXRjaENhc2UoKSB7Ci0JcmV0dXJuIG1hdGNoQ2FzZS5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBib29sZWFuIGdldE1hdGNoV29yZCgpIHsKLQlyZXR1cm4gbWF0Y2hXb3JkLmdldFNlbGVjdGlvbigpOwotfQotcHVibGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JcmV0dXJuIHNlYXJjaFRleHQuZ2V0VGV4dCgpOwotfQotcHVibGljIGJvb2xlYW4gZ2V0U2VhcmNoRG93bigpewotCXJldHVybiBkb3duLmdldFNlbGVjdGlvbigpOwotfQotcHVibGljIGludCBnZXRTZWxlY3RlZFNlYXJjaEFyZWEoKSB7Ci0JcmV0dXJuIHNlYXJjaEFyZWEuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLX0KLXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JaWYgKHNoZWxsLmlzVmlzaWJsZSgpKSB7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JfSBlbHNlIHsKLQkJc2hlbGwub3BlbigpOwotCX0KLQlzZWFyY2hUZXh0LnNldEZvY3VzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hBcmVhTmFtZXMoU3RyaW5nW10gbmFtZXMpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNlYXJjaEFyZWEuYWRkKG5hbWVzW2ldKTsKLQl9Ci0Jc2VhcmNoQXJlYS5zZWxlY3QoMCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hBcmVhTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0Jc2VhcmNoQXJlYUxhYmVsLnNldFRleHQobGFiZWwpOwotfQotcHVibGljIHZvaWQgc2V0TWF0Y2hDYXNlKGJvb2xlYW4gbWF0Y2gpIHsKLQltYXRjaENhc2Uuc2V0U2VsZWN0aW9uKG1hdGNoKTsKLX0KLXB1YmxpYyB2b2lkIHNldE1hdGNoV29yZChib29sZWFuIG1hdGNoKSB7Ci0JbWF0Y2hXb3JkLnNldFNlbGVjdGlvbihtYXRjaCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hEb3duKGJvb2xlYW4gc2VhcmNoRG93bil7Ci0JZG93bi5zZXRTZWxlY3Rpb24oc2VhcmNoRG93bik7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hTdHJpbmcoU3RyaW5nIHNlYXJjaFN0cmluZykgewotCXNlYXJjaFRleHQuc2V0VGV4dChzZWFyY2hTdHJpbmcpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFNlYXJjaEFyZWEoaW50IGluZGV4KSB7Ci0Jc2VhcmNoQXJlYS5zZWxlY3QoaW5kZXgpOwotfQotcHVibGljIHZvaWQgYWRkRmluZExpc3RlbmVyKEZpbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCXRoaXMuZmluZEhhbmRsZXIgPSBsaXN0ZW5lcjsJCi19Ci1wdWJsaWMgdm9pZCByZW1vdmVGaW5kTGlzdGVuZXIoRmluZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JdGhpcy5maW5kSGFuZGxlciA9IG51bGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhN2JjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlckV4YW1wbGUgewotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYnJvd3NlciIpOwotCWludCBpbmRleDsKLQlib29sZWFuIGJ1c3k7Ci0JSW1hZ2UgaW1hZ2VzW107Ci0JSW1hZ2UgaWNvbiA9IG51bGw7Ci0JYm9vbGVhbiB0aXRsZSA9IGZhbHNlOwotCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JVGV4dCBsb2NhdGlvbkJhcjsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JVG9vbEJhciB0b29sYmFyOwotCUNhbnZhcyBjYW52YXM7Ci0JVG9vbEl0ZW0gaXRlbUJhY2ssIGl0ZW1Gb3J3YXJkOwotCUxhYmVsIHN0YXR1czsKLQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQlTV1RFcnJvciBlcnJvciA9IG51bGw7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCQkiZWNsaXBzZTAxLmJtcCIsICJlY2xpcHNlMDIuYm1wIiwgImVjbGlwc2UwMy5ibXAiLCAiZWNsaXBzZTA0LmJtcCIsICJlY2xpcHNlMDUuYm1wIiwKLQkJCSJlY2xpcHNlMDYuYm1wIiwgImVjbGlwc2UwNy5ibXAiLCAiZWNsaXBzZTA4LmJtcCIsICJlY2xpcHNlMDkuYm1wIiwgImVjbGlwc2UxMC5ibXAiLAotCQkJImVjbGlwc2UxMS5ibXAiLCAiZWNsaXBzZTEyLmJtcCIsfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIGljb25Mb2NhdGlvbiA9ICJkb2N1bWVudC5naWYiOwotCQkKLQlwdWJsaWMgQnJvd3NlckV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB0b3ApIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZXJyb3IgPSBlOwotCQkJLyogQnJvd3NlciB3aWRnZXQgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCAqLwotCQkJcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJyb3dzZXJOb3RDcmVhdGVkIikpOwotCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbml0UmVzb3VyY2VzKCk7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCWJyb3dzZXIuc2V0RGF0YSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJBcHBsaWNhdGlvbiIsIHRoaXMpOwotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCWlmIChpY29uICE9IG51bGwpIHNoZWxsLnNldEltYWdlKGljb24pOwotCQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlCcm93c2VyRXhhbXBsZSBhcHAgPSBuZXcgQnJvd3NlckV4YW1wbGUoc2hlbGwsIGZhbHNlKTsKLQkJCQlhcHAuc2V0U2hlbGxEZWNvcmF0aW9uKGljb24sIHRydWUpOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBhcHAuZ2V0QnJvd3NlcigpOwotCQkJfQotCQl9KTsKLQkJaWYgKHRvcCkgewotCQkJYnJvd3Nlci5zZXRVcmwoZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXJ0dXAiKSk7Ci0JCQlzaG93KGZhbHNlLCBudWxsLCBudWxsLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBlKSB7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZSkgewotCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCQkJQnJvd3NlckV4YW1wbGUgYXBwID0gKEJyb3dzZXJFeGFtcGxlKWJyb3dzZXIuZ2V0RGF0YSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJBcHBsaWNhdGlvbiIpOwotCQkJCQlhcHAuc2hvdyh0cnVlLCBlLmxvY2F0aW9uLCBlLnNpemUsIGUuYWRkcmVzc0JhciwgZS5tZW51QmFyLCBlLnN0YXR1c0JhciwgZS50b29sQmFyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIEJyb3dzZXJBcHBsaWNhdGlvbi4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZnJlZVJlc291cmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQkKLQlwdWJsaWMgU1dURXJyb3IgZ2V0RXJyb3IoKSB7IHJldHVybiBlcnJvcjsgfQotCQotCXB1YmxpYyBCcm93c2VyIGdldEJyb3dzZXIoKSB7IHJldHVybiBicm93c2VyOyB9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hlbGxEZWNvcmF0aW9uKEltYWdlIGljb24sIGJvb2xlYW4gdGl0bGUpIHsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQkKLQl2b2lkIHNob3coYm9vbGVhbiBvd25lZCwgUG9pbnQgbG9jYXRpb24sIFBvaW50IHNpemUsIGJvb2xlYW4gYWRkcmVzc0JhciwgYm9vbGVhbiBtZW51QmFyLCBib29sZWFuIHN0YXR1c0JhciwgYm9vbGVhbiB0b29sQmFyKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQlpZiAob3duZWQpIHsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQlpZiAoc2l6ZSAhPSBudWxsKSBzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCX0KLQkJRm9ybURhdGEgZGF0YSA9IG51bGw7Ci0JCWlmICh0b29sQmFyKSB7Ci0JCQl0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCXRvb2xiYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWl0ZW1CYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1CYWNrLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2siKSk7Ci0JCQlpdGVtRm9yd2FyZCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtRm9yd2FyZC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJGb3J3YXJkIikpOwotCQkJZmluYWwgVG9vbEl0ZW0gaXRlbVN0b3AgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbVN0b3Auc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU3RvcCIpKTsKLQkJCWZpbmFsIFRvb2xJdGVtIGl0ZW1SZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1SZWZyZXNoLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZnJlc2giKSk7Ci0JCQlmaW5hbCBUb29sSXRlbSBpdGVtR28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbUdvLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkdvIikpOwotCQkJCi0JCQlpdGVtQmFjay5zZXRFbmFibGVkKGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpKTsKLQkJCWl0ZW1Gb3J3YXJkLnNldEVuYWJsZWQoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCkpOwotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJCWlmIChpdGVtID09IGl0ZW1CYWNrKSBicm93c2VyLmJhY2soKTsgCi0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbUZvcndhcmQpIGJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1TdG9wKSBicm93c2VyLnN0b3AoKTsKLQkJCQkJZWxzZSBpZiAoaXRlbSA9PSBpdGVtUmVmcmVzaCkgYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbUdvKSBicm93c2VyLnNldFVybChsb2NhdGlvbkJhci5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX07Ci0JCQlpdGVtQmFjay5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtUmVmcmVzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCi0JCQljYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS53aWR0aCA9IDI0OwotCQkJZGF0YS5oZWlnaHQgPSAyNDsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlc1swXS5nZXRCb3VuZHMoKTsKLQkJCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCVBvaW50IHB0ID0gKChDYW52YXMpZS53aWRnZXQpLmdldFNpemUoKTsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2VzW2luZGV4XSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHB0LngsIHB0LnkpOwkJCQotCQkJCX0KLQkJCX0pOwotCQkJY2FudmFzLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWJyb3dzZXIuc2V0VXJsKGdldFJlc291cmNlU3RyaW5nKCJTdGFydHVwIikpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJaWYgKGJ1c3kpIHsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlpZiAoaW5kZXggPT0gaW1hZ2VzLmxlbmd0aCkgaW5kZXggPSAwOwotCQkJCQkJY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKDE1MCwgdGhpcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGFkZHJlc3NCYXIpIHsKLQkJCWxvY2F0aW9uQmFyID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b29sYmFyLCAwLCBTV1QuVE9QKTsKLQkJCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbGJhciwgNSwgU1dULlJJR0hUKTsKLQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNhbnZhcywgLTUsIFNXVC5ERUZBVUxUKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsJCQkKLQkJCX0KLQkJCWxvY2F0aW9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsb2NhdGlvbkJhci5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJYnJvd3Nlci5zZXRVcmwobG9jYXRpb25CYXIuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoc3RhdHVzQmFyKSB7Ci0JCQlzdGF0dXMgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCQotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm9ncmVzc0JhciwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCQlzdGF0dXMuc2V0VGV4dChldmVudC50ZXh0KTsJCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlDb250cm9sIGFib3ZlQnJvd3NlciA9IHRvb2xCYXIgPyAoQ29udHJvbCljYW52YXMgOiAoYWRkcmVzc0JhciA/IChDb250cm9sKWxvY2F0aW9uQmFyIDogbnVsbCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IGFib3ZlQnJvd3NlciAhPSBudWxsID8gbmV3IEZvcm1BdHRhY2htZW50KGFib3ZlQnJvd3NlciwgNSwgU1dULkRFRkFVTFQpIDogbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gc3RhdHVzICE9IG51bGwgPyBuZXcgRm9ybUF0dGFjaG1lbnQoc3RhdHVzLCAtNSwgU1dULkRFRkFVTFQpIDogbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQlpZiAoc3RhdHVzQmFyIHx8IHRvb2xCYXIpIHsKLQkJCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LnRvdGFsID09IDApIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWludCByYXRpbyA9IGV2ZW50LmN1cnJlbnQgKiAxMDAgLyBldmVudC50b3RhbDsKLQkJCQkJaWYgKHByb2dyZXNzQmFyICE9IG51bGwpIHByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQkJCWJ1c3kgPSBldmVudC5jdXJyZW50ICE9IGV2ZW50LnRvdGFsOwotCQkJCQlpZiAoIWJ1c3kpIHsKLQkJCQkJCWluZGV4ID0gMDsKLQkJCQkJCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChwcm9ncmVzc0JhciAhPSBudWxsKSBwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCWJ1c3kgPSBmYWxzZTsKLQkJCQkJaW5kZXggPSAwOwotCQkJCQlpZiAoY2FudmFzICE9IG51bGwpIHsKLQkJCQkJCWl0ZW1CYWNrLnNldEVuYWJsZWQoYnJvd3Nlci5pc0JhY2tFbmFibGVkKCkpOwotCQkJCQkJaXRlbUZvcndhcmQuc2V0RW5hYmxlZChicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKSk7Ci0JCQkJCQljYW52YXMucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoYWRkcmVzc0JhciB8fCBzdGF0dXNCYXIgfHwgdG9vbEJhcikgewotCQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCQlidXN5ID0gdHJ1ZTsKLQkJCQkJaWYgKGV2ZW50LnRvcCAmJiBsb2NhdGlvbkJhciAhPSBudWxsKSBsb2NhdGlvbkJhci5zZXRUZXh0KGV2ZW50LmxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmICh0aXRsZSkgewotCQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCQlzaGVsbC5zZXRUZXh0KGV2ZW50LnRpdGxlKyIgLSAiK2dldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJaWYgKG93bmVkKSBzaGVsbC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXMoKSB7Ci0JCWlmIChsb2NhdGlvbkJhciAhPSBudWxsKSBsb2NhdGlvbkJhci5zZXRGb2N1cygpOwotCQllbHNlIGlmIChicm93c2VyICE9IG51bGwpIGJyb3dzZXIuc2V0Rm9jdXMoKTsKLQkJZWxzZSBwYXJlbnQuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWZpbmFsIENsYXNzIGNsYXp6ID0gdGhpcy5nZXRDbGFzcygpOwotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc291cmNlU3RyZWFtKTsKLQkJCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSAoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJfQotCQl9Ci0JCVN0cmluZyBlcnJvciA9IChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSA/IGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6ICJVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMiOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBCcm93c2VyRXhhbXBsZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGljb25Mb2NhdGlvbik7Ci0JCUltYWdlIGljb24gPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJc2hlbGwuc2V0SW1hZ2UoaWNvbik7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlCcm93c2VyRXhhbXBsZSBhcHAgPSBuZXcgQnJvd3NlckV4YW1wbGUoc2hlbGwsIHRydWUpOwotCQlhcHAuc2V0U2hlbGxEZWNvcmF0aW9uKGljb24sIHRydWUpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWljb24uZGlzcG9zZSgpOwotCQlhcHAuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9kb2N1bWVudC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9kb2N1bWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWUyMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZG9jdW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAxLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTE2ZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAxLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMi5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGIwNGVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDMuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAzLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjN2IxMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDMuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDA2NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQ1YTk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDYuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA2LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhODg4YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDYuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA3LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTIyMjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA3LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDguYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWFjMjlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDkuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA5LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxZjgzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDkuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEwLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTc5YjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEwLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTEuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMyNGE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTIuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhZTcxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTIuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZmRjNzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZDsKLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIENsaXBib2FyZEV4YW1wbGUgewotCi0JQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQlTaGVsbCBzaGVsbDsKLQlUZXh0IGNvcHlUZXh0OwotCVRleHQgcGFzdGVUZXh0OwotCVRleHQgY29weVJ0ZlRleHQ7Ci0JVGV4dCBwYXN0ZVJ0ZlRleHQ7Ci0JVGV4dCBjb3B5SHRtbFRleHQ7Ci0JVGV4dCBwYXN0ZUh0bWxUZXh0OwotCVRhYmxlIGNvcHlGaWxlVGFibGU7Ci0JVGFibGUgcGFzdGVGaWxlVGFibGU7Ci0JVGV4dCB0ZXh0OwotCUNvbWJvIGNvbWJvOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlMYWJlbCBzdGF0dXM7Ci0Jc3RhdGljIGZpbmFsIGludCBTSVpFID0gNjA7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JbmV3IENsaXBib2FyZEV4YW1wbGUoKS5vcGVuKGRpc3BsYXkpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotcHVibGljIHZvaWQgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsKLQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTV1QgQ2xpcGJvYXJkIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQotCVNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7Ci0Jc2Muc2V0Q29udGVudChwYXJlbnQpOwotCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQotCUdyb3VwIGNvcHlHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQljb3B5R3JvdXAuc2V0VGV4dCgiQ29weSBGcm9tOiIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQljb3B5R3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQljb3B5R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgcGFzdGVHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQlwYXN0ZUdyb3VwLnNldFRleHQoIlBhc3RlIFRvOiIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlwYXN0ZUdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JcGFzdGVHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkKLQlHcm91cCBjb250cm9sR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29udHJvbEdyb3VwLnNldFRleHQoIkNvbnRyb2wgQVBJOiIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQljb250cm9sR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQljb250cm9sR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgdHlwZXNHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQl0eXBlc0dyb3VwLnNldFRleHQoIkF2YWlsYWJsZSBUeXBlcyIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQl0eXBlc0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JdHlwZXNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQlzdGF0dXMgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuQk9SREVSKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGF0YS5oZWlnaHRIaW50ID0gNjA7Ci0Jc3RhdHVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JY3JlYXRlVGV4dFRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlUlRGVHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVIVE1MVHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVGaWxlVHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVNeVRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlQ29udHJvbFRyYW5zZmVyKGNvbnRyb2xHcm91cCk7Ci0JY3JlYXRlQXZhaWxhYmxlVHlwZXModHlwZXNHcm91cCk7Ci0JCi0Jc2Muc2V0TWluU2l6ZShwYXJlbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0Jc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzYy5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkKLQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlSZWN0YW5nbGUgbW9uaXRvckFyZWEgPSBzaGVsbC5nZXRNb25pdG9yKCkuZ2V0Q2xpZW50QXJlYSgpOwotCXNoZWxsLnNldFNpemUoTWF0aC5taW4oc2l6ZS54LCBtb25pdG9yQXJlYS53aWR0aCAtIDIwKSwgTWF0aC5taW4oc2l6ZS55LCBtb25pdG9yQXJlYS5oZWlnaHQgLSAyMCkpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLXZvaWQgY3JlYXRlVGV4dFRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpIHsKLQkKLQkvLyBUZXh0VHJhbnNmZXIKLQlMYWJlbCBsID0gbmV3IExhYmVsKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlRleHRUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWNvcHlUZXh0ID0gbmV3IFRleHQoY29weVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JY29weVRleHQuc2V0VGV4dCgic29tZVxucGxhaW5cbnRleHQiKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCWNvcHlUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvcHlQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IGNvcHlUZXh0LmdldFRleHQoKTsKLQkJCWlmIChkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlRleHRUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCXBhc3RlVGV4dCA9IG5ldyBUZXh0KHBhc3RlUGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVUZXh0LnNldFRleHQoImJlZ2luIHBhc3RlPiIrZGF0YSsiPGVuZCBwYXN0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVJURlRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCS8vCVJURiBUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiUlRGVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQljb3B5UnRmVGV4dCA9IG5ldyBUZXh0KGNvcHlQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWNvcHlSdGZUZXh0LnNldFRleHQoInNvbWVcbnJ0ZlxudGV4dCIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JY29weVJ0ZlRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weVJ0ZlRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWRhdGEgPSAie1xccnRmMXtcXGNvbG9ydGJsO1xccmVkMjU1XFxncmVlbjBcXGJsdWUwO31cXHVjMVxcYlxcaSAiICsgZGF0YSArICJ9IjsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge1JURlRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JICAKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJSVEZUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCXBhc3RlUnRmVGV4dCA9IG5ldyBUZXh0KHBhc3RlUGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZVJ0ZlRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2xpcGJvYXJkLmdldENvbnRlbnRzKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlwYXN0ZVJ0ZlRleHQuc2V0VGV4dCgic3RhcnQgcGFzdGU+IitkYXRhKyI8ZW5kIHBhc3RlIik7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIHBhc3RlIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLXZvaWQgY3JlYXRlSFRNTFRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCS8vCUhUTUwgVHJhbnNmZXIKLQlMYWJlbCBsID0gbmV3IExhYmVsKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkhUTUxUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWNvcHlIdG1sVGV4dCA9IG5ldyBUZXh0KGNvcHlQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWNvcHlIdG1sVGV4dC5zZXRUZXh0KCI8Yj5IZWxsbyBXb3JsZDwvYj4iKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCWNvcHlIdG1sVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSBjb3B5SHRtbFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2RhdGF9LCBuZXcgVHJhbnNmZXJbXSB7SFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JICAKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJIVE1MVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlwYXN0ZUh0bWxUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlSHRtbFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2xpcGJvYXJkLmdldENvbnRlbnRzKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVIdG1sVGV4dC5zZXRUZXh0KCJzdGFydCBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVGaWxlVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy9GaWxlIFRyYW5zZmVyCi0JTGFiZWwgbCA9IG5ldyBMYWJlbChjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJGaWxlVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQljb3B5RmlsZVRhYmxlID0gbmV3IFRhYmxlKGMsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JY29weUZpbGVUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgZmlsZShzKSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOIHwgU1dULk1VTFRJKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCS8vY29weUZpbGVUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCQlTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCQkJCVN0cmluZyBwYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IGRpYWxvZy5nZXRGaWxlTmFtZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb3B5RmlsZVRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCWl0ZW0uc2V0VGV4dChwYXRoK3NlcGFyYXRvcituYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiU2VsZWN0IGRpcmVjdG9yeSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwKXsKLQkJCQkvL2NvcHlGaWxlVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvcHlGaWxlVGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQocmVzdWx0KTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKGNvcHlQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNvcHlGaWxlVGFibGUuZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPiAwKXsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJU3RyaW5nW10gZGF0YSA9IG5ldyBTdHJpbmdbaXRlbXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGF0YVtpXSA9IGl0ZW1zW2ldLmdldFRleHQoKTsKLQkJCQl9Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7ZGF0YX0sIG5ldyBUcmFuc2ZlcltdIHtGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBjb3B5Iik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJGaWxlVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlwYXN0ZUZpbGVUYWJsZSA9IG5ldyBUYWJsZShwYXN0ZVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZUZpbGVUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWIgPSBuZXcgQnV0dG9uKHBhc3RlUGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZ1tdIGRhdGEgPSAoU3RyaW5nW10pY2xpcGJvYXJkLmdldENvbnRlbnRzKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGggPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlRmlsZVRhYmxlLnJlbW92ZUFsbCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocGFzdGVGaWxlVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJaXRlbS5zZXRUZXh0KGRhdGFbaV0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwkgCi19Ci12b2lkIGNyZWF0ZU15VHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JTXlUeXBlIFRyYW5zZmVyCi0JLy8gVE9ETwotfQotdm9pZCBjcmVhdGVDb250cm9sVHJhbnNmZXIoQ29tcG9zaXRlIHBhcmVudCl7Ci0JTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlRleHQ6Iik7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ3V0Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGV4dC5jdXQoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQuY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQucGFzdGUoKTsKLQkJfQotCX0pOwotCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJDb21ibzoiKTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkN1dCIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLmN1dCgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJY29tYm8uY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQljb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5OT05FKTsKLQljb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyJJdGVtIDEiLCAiSXRlbSAyIiwgIkl0ZW0gMyIsICJBIGxvbmdlciBJdGVtIn0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJTdHlsZWRUZXh0OiIpOwotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdHlsZWRUZXh0LnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLXZvaWQgY3JlYXRlQXZhaWxhYmxlVHlwZXMoQ29tcG9zaXRlIHBhcmVudCl7Ci0JZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJHZXQgQXZhaWxhYmxlIFR5cGVzIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdC5yZW1vdmVBbGwoKTsKLQkJCVN0cmluZ1tdIG5hbWVzID0gY2xpcGJvYXJkLmdldEF2YWlsYWJsZVR5cGVOYW1lcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWxpc3QuYWRkKG5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjZGZjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZDsKLQotcHVibGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpcnN0TmFtZTsKLQlTdHJpbmcgbGFzdE5hbWU7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlVHJhbnNmZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA5ZTNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLQotcHVibGljIGNsYXNzIE15VHlwZVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIm5hbWVfbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUeXBlVHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHlwZVRyYW5zZmVyKCk7Ci0JCi1wdWJsaWMgc3RhdGljIE15VHlwZVRyYW5zZmVyIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pIG9iamVjdDsJCi0JdHJ5IHsKLQkJLy8gd3JpdGUgZGF0YSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gYXNrIHN1cGVyIHRvIGNvbnZlcnQgdG8gcE1lZGl1bQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG15VHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyAgaSsrKXsKLQkJCWJ5dGVbXSBidWZmZXIgPSBteVR5cGVzW2ldLmZpcnN0TmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJYnVmZmVyID0gbXlUeXBlc1tpXS5maXJzdE5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJfQotCQlieXRlW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShidWZmZXIsIHRyYW5zZmVyRGF0YSk7CQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsJCi0JaWYgKGlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQotCQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSlzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCU15VHlwZVtdIG15RGF0YSA9IG5ldyBNeVR5cGVbMF07Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJd2hpbGUocmVhZEluLmF2YWlsYWJsZSgpID4gMjApIHsKLQkJCQlNeVR5cGUgZGF0dW0gPSBuZXcgTXlUeXBlKCk7Ci0JCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJCWJ5dGVbXSBuYW1lID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQobmFtZSk7Ci0JCQkJZGF0dW0uZmlyc3ROYW1lID0gbmV3IFN0cmluZyhuYW1lKTsKLQkJCQlzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCQluYW1lID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQobmFtZSk7Ci0JCQkJZGF0dW0ubGFzdE5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOwotCQkJCU15VHlwZVtdIG5ld015RGF0YSA9IG5ldyBNeVR5cGVbbXlEYXRhLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobXlEYXRhLCAwLCBuZXdNeURhdGEsIDAsIG15RGF0YS5sZW5ndGgpOwotCQkJCW5ld015RGF0YVtteURhdGEubGVuZ3RoXSA9IGRhdHVtOwotCQkJCW15RGF0YSA9IG5ld015RGF0YTsKLQkJCX0KLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG15RGF0YTsKLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde01ZVFlQRU5BTUV9OwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gbmV3IGludFtdIHtNWVRZUEVJRH07Ci19Ci1ib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IG51bGwgfHwgIShvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGVbXSkgfHwgKChNeVR5cGVbXSlvYmplY3QpLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0JTXlUeXBlW10gbXlUeXBlcyA9IChNeVR5cGVbXSlvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChteVR5cGVzW2ldID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpcnN0TmFtZSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maXJzdE5hbWUubGVuZ3RoKCkgPT0gMCB8fAotCQkJbXlUeXBlc1tpXS5sYXN0TmFtZSA9PSBudWxsIHx8Ci0JCQlteVR5cGVzW2ldLmxhc3ROYW1lLmxlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9BbGlnbmFibGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzE5MWZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPkFsaWduYWJsZVRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0Ci0gKiBzdXBlcmNsYXNzIG9mIGV4YW1wbGUgY29udHJvbHMgdGhhdCBjYW4gYmUKLSAqIGFsaWduZWQuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFsaWduYWJsZVRhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBBbGlnbm1lbnQgQ29udHJvbHMgKi8KLQlCdXR0b24gbGVmdEJ1dHRvbiwgcmlnaHRCdXR0b24sIGNlbnRlckJ1dHRvbjsKLQotCS8qIEFsaWdubWVudCBHcm91cCAqLwotCUdyb3VwIGFsaWdubWVudEdyb3VwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUFsaWduYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJYWxpZ25tZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlhbGlnbm1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8Ci0JCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWFsaWdubWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbGlnbm1lbnQiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29udHJvbHMgKi8KLQkJbGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMZWZ0IikpOwotCQljZW50ZXJCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJY2VudGVyQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNlbnRlciIpKTsKLQkJcmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJcmlnaHRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJpZ2h0IikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24gKCkpIHJldHVybjsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QWxpZ25tZW50ICgpOwotCQkJfQotCQl9OwotCQlsZWZ0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWNlbnRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlyaWdodEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCAhPSAwKSB7Ci0JCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbnRyb2xzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQ0VOVEVSKSAhPSAwKTsKLQkJCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbnRyb2xzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9CdXR0b25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0J1dHRvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTUwN2MyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0J1dHRvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiA8Y29kZT5CdXR0b25UYWI8L2NvZGU+IGlzIHRoZSBjbGFzcyB0aGF0Ci0gKiBkZW1vbnN0cmF0ZXMgU1dUIGJ1dHRvbnMuCi0gKi8KLWNsYXNzIEJ1dHRvblRhYiBleHRlbmRzIEFsaWduYWJsZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUJ1dHRvbiBidXR0b24xLCBidXR0b24yLCBidXR0b24zLCBidXR0b240LCBidXR0b241LCBidXR0b242OwotCUdyb3VwIHRleHRCdXR0b25Hcm91cCwgaW1hZ2VCdXR0b25Hcm91cDsKLQotCS8qIEFsaWdubWVudCB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlCdXR0b24gdXBCdXR0b24sIGRvd25CdXR0b247Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHB1c2hCdXR0b24sIGNoZWNrQnV0dG9uLCByYWRpb0J1dHRvbiwgdG9nZ2xlQnV0dG9uLCBhcnJvd0J1dHRvbiwgZmxhdEJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQnV0dG9uVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQl1cEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQl1cEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVXAiKSk7Ci0JCWRvd25CdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJZG93bkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRG93biIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCXNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCk7Ci0JCQl9Ci0JCX07Ci0JCXVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0ZXh0IGJ1dHRvbnMgKi8KLQkJdGV4dEJ1dHRvbkdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl0ZXh0QnV0dG9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfQnV0dG9ucyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSBidXR0b25zICovCi0JCWltYWdlQnV0dG9uR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbWFnZUJ1dHRvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2VCdXR0b25Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJaW1hZ2VCdXR0b25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfQnV0dG9ucyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHB1c2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5QVVNIOwotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DSEVDSzsKLQkJaWYgKHJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUkFESU87Ci0JCWlmICh0b2dnbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5UT0dHTEU7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5MRUZUOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkJaWYgKGFycm93QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzdHlsZSB8PSBTV1QuQVJST1c7IAotCQkJaWYgKHVwQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVVA7Ci0JCQlpZiAoZG93bkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkRPV047Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwkJCQotCQl9Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWJ1dHRvbjEgPSBuZXcgQnV0dG9uKHRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b24xLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJYnV0dG9uMiA9IG5ldyBCdXR0b24odGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjIuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlidXR0b24zID0gbmV3IEJ1dHRvbih0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uMy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaHJlZSIpKTsKLQkJYnV0dG9uNCA9IG5ldyBCdXR0b24oaW1hZ2VCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b240LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlidXR0b241ID0gbmV3IEJ1dHRvbihpbWFnZUJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjUuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlidXR0b242ID0gbmV3IEJ1dHRvbihpbWFnZUJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjYuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcHVzaEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXB1c2hCdXR0b24uc2V0VGV4dCgiU1dULlBVU0giKTsKLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCAoIlNXVC5SQURJTyIpOwotCQl0b2dnbGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl0b2dnbGVCdXR0b24uc2V0VGV4dCAoIlNXVC5UT0dHTEUiKTsKLQkJYXJyb3dCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlhcnJvd0J1dHRvbi5zZXRUZXh0ICgiU1dULkFSUk9XIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtidXR0b24xLCBidXR0b24yLCBidXR0b24zLCBidXR0b240LCBidXR0b241LCBidXR0b242fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiVGV4dCIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkJ1dHRvbiI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QWxpZ25tZW50ICgpIHsKLQkJaW50IGFsaWdubWVudCA9IDA7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuUklHSFQ7Ci0JCWlmICh1cEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5VUDsKLQkJaWYgKGRvd25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuRE9XTjsKLQkJYnV0dG9uMS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjIuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b24zLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uNC5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjUuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b242LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoYXJyb3dCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQgKHRydWUpOwotCQl9IGVsc2UgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJY2VudGVyQnV0dG9uLnNldEVuYWJsZWQgKHRydWUpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCX0KLQkJdXBCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5VUCkgIT0gMCk7Ci0JCWRvd25CdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5ET1dOKSAhPSAwKTsKLQkJcHVzaEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULlBVU0gpICE9IDApOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkNIRUNLKSAhPSAwKTsKLQkJcmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCk7Ci0JCXRvZ2dsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULlRPR0dMRSkgIT0gMCk7Ci0JCWFycm93QnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuQVJST1cpICE9IDApOwotCQlmbGF0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DQ29tYm9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyMzI5Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DQ29tYm9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIENDb21ib1RhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNDb21ibyBjb21ibzE7Ci0JR3JvdXAgY29tYm9Hcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGZsYXRCdXR0b24sIHJlYWRPbmx5QnV0dG9uOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzEiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzQiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzciKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDQ29tYm9UYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGNvbWJvIGJveCAqLwotCQljb21ib0dyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY29tYm9Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY29tYm9Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29tYm9Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0NvbWJvIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQljb21ibzEgPSBuZXcgQ0NvbWJvIChjb21ib0dyb3VwLCBzdHlsZSk7Ci0JCWNvbWJvMS5zZXRJdGVtcyAoTGlzdERhdGEpOwotCQlpZiAoTGlzdERhdGEubGVuZ3RoID49IDMpIHsKLQkJCWNvbWJvMS5zZXRUZXh0KExpc3REYXRhIFsyXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y29tYm8xfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJFZGl0YWJsZSIsICJJdGVtcyIsICJTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVmlzaWJsZUl0ZW1Db3VudCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNDb21ibyI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DTGFiZWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1ZmM4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DTGFiZWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDTGFiZWxUYWIgZXh0ZW5kcyBBbGlnbmFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ0xhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDM7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNoYWRvd0luQnV0dG9uLCBzaGFkb3dPdXRCdXR0b24sIHNoYWRvd05vbmVCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNMYWJlbFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCBsYWJlbHMgKi8KLQkJdGV4dExhYmVsR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbV9MYWJlbHMiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2hhZG93SW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0lOOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJJR0hUOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlsYWJlbDEgPSBuZXcgQ0xhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDEuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lIikpOwotCQlsYWJlbDEuc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlsYWJlbDIgPSBuZXcgQ0xhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDIuc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlsYWJlbDMgPSBuZXcgQ0xhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDMuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSArICJcbiIgKyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lX1R3b19UaHJlZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2hhZG93Tm9uZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfTk9ORSIpOwotCQlzaGFkb3dJbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd0luQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX0lOIik7Ci0JCXNoYWRvd091dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19PVVQiKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICgoZXZlbnQud2lkZ2V0LmdldFN0eWxlKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24gKCkpIHJldHVybjsKLQkJCQl9Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfTsKLQkJc2hhZG93SW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc2hhZG93T3V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNoYWRvd05vbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtsYWJlbDEsIGxhYmVsMiwgbGFiZWwzfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ0xhYmVsIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCkgewotCQlpbnQgYWxpZ25tZW50ID0gMDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJbGFiZWwxLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwyLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwzLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJY2VudGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiAoU1dULlNIQURPV19JTiB8IFNXVC5TSEFET1dfT1VUKSkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkyYjQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NUYWJGb2xkZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDVGFiRm9sZGVyVGFiIGV4dGVuZHMgVGFiIHsKLQlpbnQgbGFzdFNlbGVjdGVkVGFiID0gMDsKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNUYWJGb2xkZXIgdGFiRm9sZGVyMTsKLQlHcm91cCB0YWJGb2xkZXJHcm91cCwgaXRlbUdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gdG9wQnV0dG9uLCBib3R0b21CdXR0b24sIGZsYXRCdXR0b24sIGNsb3NlQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBDVGFiSXRlbXMxID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMiIpfTsKLQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlICJGb250cyIgZ3JvdXAgKi8KLQlCdXR0b24gZm9yZWdyb3VuZFNlbGVjdGlvbkJ1dHRvbiwgYmFja2dyb3VuZFNlbGVjdGlvbkJ1dHRvbiwgaXRlbUZvbnRCdXR0b247Ci0JSW1hZ2UgZm9yZWdyb3VuZFNlbGVjdGlvbkltYWdlLCBiYWNrZ3JvdW5kU2VsZWN0aW9uSW1hZ2U7Ci0JQ29sb3IgZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yLCBiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3I7Ci0JRm9udCBpdGVtRm9udDsKLQkKLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIHNpbXBsZVRhYkJ1dHRvbiwgc2luZ2xlVGFiQnV0dG9uLCBpbWFnZUJ1dHRvbiwgc2hvd01pbkJ1dHRvbiwgc2hvd01heEJ1dHRvbiwgdW5zZWxlY3RlZENsb3NlQnV0dG9uLCB1bnNlbGVjdGVkSW1hZ2VCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ1RhYkZvbGRlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJGb250cyIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDb2xvckdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQljb2xvckdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb2xvcnMiKSk7Ci0JCQotCQluZXcgTGFiZWwgKGNvbG9yR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWZvcmVncm91bmRCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQotCQluZXcgTGFiZWwgKGNvbG9yR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWJhY2tncm91bmRCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQotCQluZXcgTGFiZWwgKGNvbG9yR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdGlvbl9Gb3JlZ3JvdW5kX0NvbG9yIikpOwotCQlmb3JlZ3JvdW5kU2VsZWN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQkKLQkJbmV3IExhYmVsIChjb2xvckdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3Rpb25fQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJYmFja2dyb3VuZFNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJCi0JCWZvbnRCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWZvbnRCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udCIpKTsKLQkJZm9udEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCQotCQlpdGVtRm9udEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJaXRlbUZvbnRCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSXRlbV9Gb250IikpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCQkKLQkJQnV0dG9uIGRlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQlkZWZhdWx0c0J1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWZhdWx0cyIpKTsKLQotCQlTaGVsbCBzaGVsbCA9IGNvbnRyb2xHcm91cC5nZXRTaGVsbCAoKTsKLQkJZmluYWwgQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZmluYWwgRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2cgKHNoZWxsKTsKLQotCQkvKiBDcmVhdGUgaW1hZ2VzIHRvIGRpc3BsYXkgY3VycmVudCBjb2xvcnMgKi8KLQkJaW50IGltYWdlU2l6ZSA9IDEyOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCQlmb3JlZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlU2l6ZSwgaW1hZ2VTaXplKTsKLQkJYmFja2dyb3VuZEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7Ci0JCWZvcmVncm91bmRTZWxlY3Rpb25JbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCQliYWNrZ3JvdW5kU2VsZWN0aW9uSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlU2l6ZSwgaW1hZ2VTaXplKTsKLQotCQkvKiBBZGQgbGlzdGVuZXJzIHRvIHNldCB0aGUgY29sb3JzIGFuZCBmb250ICovCi0JCWZvcmVncm91bmRCdXR0b24uc2V0SW1hZ2UoZm9yZWdyb3VuZEltYWdlKTsgLy8gc2V0cyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uCi0JCWZvcmVncm91bmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yIG9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQkJCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDApIG9sZENvbG9yID0gY29udHJvbHMgWzBdLmdldEZvcmVncm91bmQgKCk7Ci0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBjb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOyAvLyBzYXZlIG9sZCBmb3JlZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChldmVudC5kaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJYmFja2dyb3VuZEJ1dHRvbi5zZXRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOyAvLyBzZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24KLQkJYmFja2dyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBjb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7IC8vIHNhdmUgb2xkIGJhY2tncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQliYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlmb3JlZ3JvdW5kU2VsZWN0aW9uQnV0dG9uLnNldEltYWdlKGZvcmVncm91bmRTZWxlY3Rpb25JbWFnZSk7IC8vIHNldHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbgotCQlmb3JlZ3JvdW5kU2VsZWN0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGZvcmVncm91bmRTZWxlY3Rpb25Db2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRDb2xvciA9IGNvbnRyb2xzIFswXS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJCX0KLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGZvcmVncm91bmRTZWxlY3Rpb25Db2xvcjsgLy8gc2F2ZSBvbGQgZm9yZWdyb3VuZCBjb2xvciB0byBkaXNwb3NlIHdoZW4gZG9uZQotCQkJCWZvcmVncm91bmRTZWxlY3Rpb25Db2xvciA9IG5ldyBDb2xvciAoZXZlbnQuZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWJhY2tncm91bmRTZWxlY3Rpb25CdXR0b24uc2V0SW1hZ2UoYmFja2dyb3VuZFNlbGVjdGlvbkltYWdlKTsgLy8gc2V0cyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uCi0JCWJhY2tncm91bmRTZWxlY3Rpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yIG9sZENvbG9yID0gYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQkJCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDApIG9sZENvbG9yID0gY29udHJvbHMgWzBdLmdldEJhY2tncm91bmQgKCk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBjb2xvcgotCQkJCX0KLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yOyAvLyBzYXZlIG9sZCBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yID0gbmV3IENvbG9yIChldmVudC5kaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJZm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGb250IG9sZEZvbnQgPSBmb250OwotCQkJCWlmIChvbGRGb250ID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkRm9udCA9IGNvbnRyb2xzIFswXS5nZXRGb250ICgpOwotCQkJCX0KLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBmb250Ci0JCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRGb250ID0gZm9udDsgLy8gZGlzcG9zZSBvbGQgZm9udCB3aGVuIGRvbmUKLQkJCQlmb250ID0gbmV3IEZvbnQgKGV2ZW50LmRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0IHRoZSBjb2xvcnMgYW5kIGZvbnQgKi8KLQkJaXRlbUZvbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRm9udCBvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgb2xkRm9udCA9IHRhYkZvbGRlcjEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoKTsKLQkJCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQkJaXRlbUZvbnQgPSBuZXcgRm9udCAoZXZlbnQuZGlzcGxheSwgZm9udERhdGEpOwotCQkJCXNldEl0ZW1Gb250ICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlkZWZhdWx0c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZm9yZWdyb3VuZEltYWdlICE9IG51bGwpIGZvcmVncm91bmRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSBiYWNrZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpIGJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQkJZm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJCQliYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWZvbnQgPSBudWxsOwkJCQkKLQkJCQlpZiAoZm9yZWdyb3VuZFNlbGVjdGlvbkltYWdlICE9IG51bGwpIGZvcmVncm91bmRTZWxlY3Rpb25JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGJhY2tncm91bmRTZWxlY3Rpb25JbWFnZSAhPSBudWxsKSBiYWNrZ3JvdW5kU2VsZWN0aW9uSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yICE9IG51bGwpIGJhY2tncm91bmRTZWxlY3Rpb25Db2xvci5kaXNwb3NlKCk7Ci0JCQkJZm9yZWdyb3VuZFNlbGVjdGlvbkNvbG9yID0gbnVsbDsKLQkJCQliYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3IgPSBudWxsOwotCQkJCWlmIChpdGVtRm9udCAhPSBudWxsKSBpdGVtRm9udC5kaXNwb3NlKCk7Ci0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQlzaW1wbGVUYWJCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaW1wbGVUYWJCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9TaW1wbGVfVGFicyIpKTsKLQkJc2ltcGxlVGFiQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJc2ltcGxlVGFiQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRTaW1wbGVUYWJzKCk7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCQlzaW5nbGVUYWJCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaW5nbGVUYWJCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9TaW5nbGVfVGFicyIpKTsKLQkJc2luZ2xlVGFiQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNpbmdsZVRhYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0U2luZ2xlVGFicygpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNob3dNaW5CdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaG93TWluQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfTWluX1Zpc2libGUiKSk7Ci0JCXNob3dNaW5CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2hvd01pbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0TWluaW1pemVWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hvd01heEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNob3dNYXhCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9NYXhfVmlzaWJsZSIpKTsKLQkJc2hvd01heEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzaG93TWF4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRNYXhpbWl6ZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWltYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfSW1hZ2UiKSk7Ci0JCWltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJbWFnZXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9VbnNlbGVjdGVkX0ltYWdlX1Zpc2libGUiKSk7Ci0JCXVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZSgpOwotCQkJfQotCQl9KTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfVW5zZWxlY3RlZF9DbG9zZV9WaXNpYmxlIikpOwotCQl1bnNlbGVjdGVkQ2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl1bnNlbGVjdGVkQ2xvc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBDVGFiRm9sZGVyICovCi0JCXRhYkZvbGRlckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRUZXh0ICgiQ1RhYkZvbGRlciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHRvcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5UT1A7Ci0JCWlmIChib3R0b21CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9UVE9NOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNMT1NFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRhYkZvbGRlcjEgPSBuZXcgQ1RhYkZvbGRlciAodGFiRm9sZGVyR3JvdXAsIHN0eWxlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDVGFiSXRlbXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlcjEsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChDVGFiSXRlbXMxW2ldKTsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHRhYkZvbGRlcjEsIFNXVC5SRUFEX09OTFkpOwotCQkJdGV4dC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbV9jb250ZW50IikgKyAiOiAiICsgaSk7Ci0JCQlpdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JCX0KLQkJdGFiRm9sZGVyMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWxhc3RTZWxlY3RlZFRhYiA9IHRhYkZvbGRlcjEuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCX0KLQkJfSk7Ci0JCXRhYkZvbGRlcjEuc2V0U2VsZWN0aW9uKGxhc3RTZWxlY3RlZFRhYik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvcEJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPUCIpOwotCQl0b3BCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3R0b21CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlib3R0b21CdXR0b24uc2V0VGV4dCAoIlNXVC5CT1RUT00iKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0xPU0UiKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICgoZXZlbnQud2lkZ2V0LmdldFN0eWxlKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24gKCkpIHJldHVybjsKLQkJCQl9Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfTsKLQkJdG9wQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWJvdHRvbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlib3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZmxhdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGN1c3RvbSBldmVudCBuYW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgY3VzdG9tIGV2ZW50IG5hbWVzCi0JICovCi0JU3RyaW5nIFtdIGdldEN1c3RvbUV2ZW50TmFtZXMgKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkNUYWJGb2xkZXJFdmVudCJ9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIHRhYkZvbGRlcjEuZ2V0SXRlbXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHt0YWJGb2xkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ1RhYkZvbGRlciI7Ci0JfQotCi0JLyoqCi0JICogSG9va3MgdGhlIGN1c3RvbSBsaXN0ZW5lciBzcGVjaWZpZWQgYnkgZXZlbnROYW1lLgotCSAqLwotCXZvaWQgaG9va0N1c3RvbUxpc3RlbmVyIChmaW5hbCBTdHJpbmcgZXZlbnROYW1lKSB7Ci0JCWlmIChldmVudE5hbWUgPT0gIkNUYWJGb2xkZXJFdmVudCIpIHsKLQkJCXRhYkZvbGRlcjEuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lciAobmV3IENUYWJGb2xkZXIyQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2xvc2UgKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxCi0JICogVHJlZUl0ZW1zIHRvIGRlZmF1bHQgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3I7Ci0JCWZvcmVncm91bmRTZWxlY3Rpb25Db2xvciA9IG51bGw7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yOwotCQliYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3IgPSBudWxsOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJaXRlbUZvbnQgPSBudWxsOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQkJc3VwZXIucmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQl9Ci0JCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKSB7Ci0JCWlmIChmb3JlZ3JvdW5kU2VsZWN0aW9uQnV0dG9uID09IG51bGwgfHwgdGFiRm9sZGVyMSA9PSBudWxsKSByZXR1cm47Ci0JCXRhYkZvbGRlcjEuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChmb3JlZ3JvdW5kU2VsZWN0aW9uQ29sb3IpOwotCQkvLyBTZXQgdGhlIGZvcmVncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGNvbG9yIGp1c3Qgc2V0LgotCQlDb2xvciBjb2xvciA9IGZvcmVncm91bmRTZWxlY3Rpb25Db2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpOwotCQlkcmF3SW1hZ2UgKGZvcmVncm91bmRTZWxlY3Rpb25JbWFnZSwgY29sb3IpOwotCQlmb3JlZ3JvdW5kU2VsZWN0aW9uQnV0dG9uLnNldEltYWdlIChmb3JlZ3JvdW5kU2VsZWN0aW9uSW1hZ2UpOwotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQkKLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpIHsKLQkJaWYgKGJhY2tncm91bmRTZWxlY3Rpb25CdXR0b24gPT0gbnVsbCB8fCB0YWJGb2xkZXIxID09IG51bGwpIHJldHVybjsKLQkJdGFiRm9sZGVyMS5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKGJhY2tncm91bmRTZWxlY3Rpb25Db2xvcik7Ci0JCS8vIFNldCB0aGUgYmFja2dyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgY29sb3IganVzdCBzZXQuCi0JCUNvbG9yIGNvbG9yID0gYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkJhY2tncm91bmQgKCk7Ci0JCWRyYXdJbWFnZSAoYmFja2dyb3VuZFNlbGVjdGlvbkltYWdlLCBjb2xvcik7Ci0JCWJhY2tncm91bmRTZWxlY3Rpb25CdXR0b24uc2V0SW1hZ2UgKGJhY2tncm91bmRTZWxlY3Rpb25JbWFnZSk7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvbnQgKCkgewotCQlpZiAoaW5zdGFuY2Uuc3RhcnR1cCkgcmV0dXJuOwotCQlpZiAoaXRlbUZvbnRCdXR0b24gPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBmb250IGJ1dHRvbiBvbiB0aGlzIHRhYgotCQlDVGFiSXRlbVtdIGl0ZW1zID0gdGFiRm9sZGVyMS5nZXRJdGVtcygpOwotCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJaXRlbXNbMF0uc2V0Rm9udChpdGVtRm9udCk7Ci0JCX0KLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldEZvbnQoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlKCk7Ci0JCXNldFNpbXBsZVRhYnMoKTsKLQkJc2V0U2luZ2xlVGFicygpOwotCQlzZXRJbWFnZXMoKTsKLQkJc2V0TWluaW1pemVWaXNpYmxlKCk7Ci0JCXNldE1heGltaXplVmlzaWJsZSgpOwotCQlzZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKCk7Ci0JCXNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2hhcGUgdGhhdCB0aGUgQ1RhYkZvbGRlciB3aWxsIHVzZSB0byByZW5kZXIgaXRzZWxmLiAKLQkgKi8KLQl2b2lkIHNldFNpbXBsZVRhYnMgKCkgewotCQl0YWJGb2xkZXIxLnNldFNpbXBsZSAoc2ltcGxlVGFiQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiB0YWJzIHRoYXQgdGhlIENUYWJGb2xkZXIgc2hvdWxkIGRpc3BsYXkuCi0JICovCi0Jdm9pZCBzZXRTaW5nbGVUYWJzICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRTaW5nbGUgKHNpbmdsZVRhYkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIGFuIGltYWdlIGludG8gZWFjaCBpdGVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEltYWdlcyAoKSB7Ci0JCWJvb2xlYW4gc2V0SW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCUNUYWJJdGVtIGl0ZW1zW10gPSB0YWJGb2xkZXIxLmdldEl0ZW1zICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2V0SW1hZ2UpIHsKLQkJCQlpdGVtc1tpXS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZW1zW2ldLnNldEltYWdlIChudWxsKTsKLQkJCX0KLQkJfQotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbWluaW1pemUgYnV0dG9uCi0JICovCi0Jdm9pZCBzZXRNaW5pbWl6ZVZpc2libGUgKCkgewotCQl0YWJGb2xkZXIxLnNldE1pbmltaXplVmlzaWJsZShzaG93TWluQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG1heGltaXplIGJ1dHRvbgotCSAqLwotCXZvaWQgc2V0TWF4aW1pemVWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRNYXhpbWl6ZVZpc2libGUoc2hvd01heEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjbG9zZSBidXR0b24gb24gdW5zZWxlY3RlZCB0YWJzCi0JICovCi0Jdm9pZCBzZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKHVuc2VsZWN0ZWRDbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBpbWFnZSBvbiB1bnNlbGVjdGVkIHRhYnMKLQkgKi8KLQl2b2lkIHNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUgKCkgewotCQl0YWJGb2xkZXIxLnNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUodW5zZWxlY3RlZEltYWdlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgQ1RhYkl0ZW0gMC4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb250ICgpIHsKLQkJaWYgKGluc3RhbmNlLnN0YXJ0dXApIHJldHVybjsKLQkJdGFiRm9sZGVyMS5nZXRJdGVtICgwKS5zZXRGb250IChpdGVtRm9udCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ2FudmFzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DYW52YXNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1MWU0Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DYW52YXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIENhbnZhc1RhYiBleHRlbmRzIFRhYiB7Ci0Jc3RhdGljIGludCBjb2xvcnMgW10gPSB7Ci0JCVNXVC5DT0xPUl9SRUQsCi0JCVNXVC5DT0xPUl9HUkVFTiwKLQkJU1dULkNPTE9SX0JMVUUsCi0JCVNXVC5DT0xPUl9NQUdFTlRBLAotCQlTV1QuQ09MT1JfWUVMTE9XLAotCQlTV1QuQ09MT1JfQ1lBTiwKLQkJU1dULkNPTE9SX0RBUktfUkVELAotCQlTV1QuQ09MT1JfREFSS19HUkVFTiwKLQkJU1dULkNPTE9SX0RBUktfQkxVRSwKLQkJU1dULkNPTE9SX0RBUktfTUFHRU5UQSwKLQkJU1dULkNPTE9SX0RBUktfWUVMTE9XLAotCQlTV1QuQ09MT1JfREFSS19DWUFOCi0JfTsKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNhbnZhcyBjYW52YXM7Ci0JR3JvdXAgY2FudmFzR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBub0JhY2tncm91bmRCdXR0b24sIG5vRm9jdXNCdXR0b24sIG5vTWVyZ2VQYWludHNCdXR0b24sIG5vUmVkcmF3UmVzaXplQnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBjYXJldEJ1dHRvbiwgZmlsbERhbWFnZUJ1dHRvbjsKLQotCWludCBwYWludENvdW50OwotCWludCBjeCwgY3k7Ci0JaW50IG1heFgsIG1heFk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNhbnZhc1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY2FyZXRCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQljYXJldEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2FyZXQiKSk7Ci0JCWZpbGxEYW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsRGFtYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxsRGFtYWdlIikpOwotCQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWNhcmV0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDYXJldCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY2FudmFzIHdpZGdldCAqLwotCQljYW52YXNHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNhbnZhc0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljYW52YXNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY2FudmFzR3JvdXAuc2V0VGV4dCAoIkNhbnZhcyIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChub0JhY2tncm91bmRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk9fQkFDS0dST1VORDsKLQkJaWYgKG5vRm9jdXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk9fRk9DVVM7Ci0JCWlmIChub01lcmdlUGFpbnRzQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX01FUkdFX1BBSU5UUzsKLQkJaWYgKG5vUmVkcmF3UmVzaXplQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX1JFRFJBV19SRVNJWkU7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJcGFpbnRDb3VudCA9IDA7IGN4ID0gMDsgY3kgPSAwOwotCQljYW52YXMgPSBuZXcgQ2FudmFzIChjYW52YXNHcm91cCwgc3R5bGUpOwotCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJcGFpbnRDb3VudCsrOwotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlpZiAoZmlsbERhbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJQ29sb3IgY29sb3IgPSBlLmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKGNvbG9ycyBbcGFpbnRDb3VudCAlIGNvbG9ycy5sZW5ndGhdKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoZS54LCBlLnksIGUud2lkdGgsIGUuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJUG9pbnQgc2l6ZSA9IGNhbnZhcy5nZXRTaXplICgpOwotCQkJCWdjLmRyYXdBcmMoY3ggKyAxLCBjeSArIDEsIHNpemUueCAtIDIsIHNpemUueSAtIDIsIDAsIDM2MCk7Ci0JCQkJZ2MuZHJhd1JlY3RhbmdsZShjeCArIChzaXplLnggLSAxMCkgLyAyLCBjeSArIChzaXplLnkgLSAxMCkgLyAyLCAxMCwgMTApOwotCQkJfQotCQl9KTsKLQkJY2FudmFzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJCQlQb2ludCBzaXplID0gY2FudmFzLmdldFNpemUgKCk7Ci0JCQkJbWF4WCA9IHNpemUueCAqIDMgLyAyOyBtYXhZID0gc2l6ZS55ICogMyAvIDI7Ci0JCQkJcmVzaXplU2Nyb2xsQmFycyAoKTsKLQkJCX0KLQkJfSk7Ci0JCVNjcm9sbEJhciBiYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzY3JvbGxIb3Jpem9udGFsICgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJYmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJYmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNjcm9sbFZlcnRpY2FsICgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSF9TQ1JPTEwiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WX1NDUk9MTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQlub0JhY2tncm91bmRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub0JhY2tncm91bmRCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19CQUNLR1JPVU5EIik7Ci0JCW5vRm9jdXNCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub0ZvY3VzQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fRk9DVVMiKTsKLQkJbm9NZXJnZVBhaW50c0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vTWVyZ2VQYWludHNCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19NRVJHRV9QQUlOVFMiKTsKLQkJbm9SZWRyYXdSZXNpemVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULk5PX1JFRFJBV19SRVNJWkUiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y2FudmFzfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNhbnZhcyI7Ci0JfQotCQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIG1heGltdW0gYW5kIHRodW1iIG9mIGJvdGggc2Nyb2xsYmFycy4KLQkgKi8KLQl2b2lkIHJlc2l6ZVNjcm9sbEJhcnMgKCkgewotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCVNjcm9sbEJhciBiYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5zZXRNYXhpbXVtKG1heFgpOwotCQkJYmFyLnNldFRodW1iKGNsaWVudEFyZWEud2lkdGgpOwotCQkJYmFyLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS53aWR0aCk7Ci0JCX0KLQkJYmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJYmFyLnNldE1heGltdW0obWF4WSk7Ci0JCQliYXIuc2V0VGh1bWIoY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJYmFyLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2Nyb2xscyB0aGUgY2FudmFzIGhvcml6b250YWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsQmFyCi0JICovCi0Jdm9pZCBzY3JvbGxIb3Jpem9udGFsIChTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgeCA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh4ICsgbWF4WCA8IGJvdW5kcy53aWR0aCkgewotCQkJeCA9IGJvdW5kcy53aWR0aCAtIG1heFg7Ci0JCX0KLQkJY2FudmFzLnNjcm9sbCh4LCBjeSwgY3gsIGN5LCBtYXhYLCBtYXhZLCBmYWxzZSk7Ci0JCWN4ID0geDsKLQl9Ci0KLQkvKioKLQkgKiBTY3JvbGxzIHRoZSBjYW52YXMgdmVydGljYWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsQmFyCi0JICovCi0Jdm9pZCBzY3JvbGxWZXJ0aWNhbCAoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoeSArIG1heFkgPCBib3VuZHMuaGVpZ2h0KSB7Ci0JCQl5ID0gYm91bmRzLmhlaWdodCAtIG1heFk7Ci0JCX0KLQkJY2FudmFzLnNjcm9sbChjeCwgeSwgY3gsIGN5LCBtYXhYLCBtYXhZLCBmYWxzZSk7Ci0JCWN5ID0geTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIG9yIGNsZWFycyB0aGUgY2FyZXQgaW4gdGhlICJFeGFtcGxlIiB3aWRnZXQuCi0JICovCi0Jdm9pZCBzZXRDYXJldCAoKSB7Ci0JCUNhcmV0IG9sZENhcmV0ID0gY2FudmFzLmdldENhcmV0ICgpOwotCQlpZiAoY2FyZXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDYXJldCBuZXdDYXJldCA9IG5ldyBDYXJldChjYW52YXMsIFNXVC5OT05FKTsKLQkJCUZvbnQgZm9udCA9IGNhbnZhcy5nZXRGb250KCk7Ci0JCQluZXdDYXJldC5zZXRGb250KGZvbnQpOwotCQkJR0MgZ2MgPSBuZXcgR0MoY2FudmFzKTsKLQkJCWdjLnNldEZvbnQoZm9udCk7Ci0JCQluZXdDYXJldC5zZXRCb3VuZHMoMSwgMSwgMSwgZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQljYW52YXMuc2V0Q2FyZXQgKG5ld0NhcmV0KTsKLQkJCWNhbnZhcy5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJY2FudmFzLnNldENhcmV0IChudWxsKTsKLQkJfQotCQlpZiAob2xkQ2FyZXQgIT0gbnVsbCkgb2xkQ2FyZXQuZGlzcG9zZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19CQUNLR1JPVU5EKSAhPSAwKTsKLQkJbm9Gb2N1c0J1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fRk9DVVMpICE9IDApOwotCQlub01lcmdlUGFpbnRzQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19NRVJHRV9QQUlOVFMpICE9IDApOwotCQlub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fUkVEUkFXX1JFU0laRSkgIT0gMCk7Ci0JCXNldENhcmV0ICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbWJvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db21ib1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTI5MDcyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbWJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDb21ib1RhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNvbWJvIGNvbWJvMTsKLQlHcm91cCBjb21ib0dyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gZHJvcERvd25CdXR0b24sIHJlYWRPbmx5QnV0dG9uLCBzaW1wbGVCdXR0b247Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YSA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzAiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMSIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzMiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNCIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzYiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNyIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF84Iil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNvbWJvVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjb21ibyBib3ggKi8KLQkJY29tYm9Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWNvbWJvR3JvdXAuc2V0VGV4dCAoIkNvbWJvIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoZHJvcERvd25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRFJPUF9ET1dOOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoc2ltcGxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTVBMRTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWNvbWJvMSA9IG5ldyBDb21ibyAoY29tYm9Hcm91cCwgc3R5bGUpOwotCQljb21ibzEuc2V0SXRlbXMgKExpc3REYXRhKTsKLQkJaWYgKExpc3REYXRhLmxlbmd0aCA+PSAzKSB7Ci0JCQljb21ibzEuc2V0VGV4dChMaXN0RGF0YSBbMl0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJZHJvcERvd25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlzaW1wbGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaW1wbGVCdXR0b24uc2V0VGV4dCgiU1dULlNJTVBMRSIpOwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y29tYm8xfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJJdGVtcyIsICJPcmllbnRhdGlvbiIsICJTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVmlzaWJsZUl0ZW1Db3VudCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNvbWJvIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuRFJPUF9ET1dOKSAhPSAwKTsKLQkJc2ltcGxlQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5TSU1QTEUpICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0RW5hYmxlZCghc2ltcGxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNlNjE4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19jb250cm9sIik7Ci0JcHJpdmF0ZSBTaGVsbFRhYiBzaGVsbFRhYjsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JSW1hZ2UgaW1hZ2VzW107Ci0KLQlzdGF0aWMgZmluYWwgaW50IGNpQ2xvc2VkRm9sZGVyID0gMCwgY2lPcGVuRm9sZGVyID0gMSwgY2lUYXJnZXQgPSAyOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImNsb3NlZEZvbGRlci5naWYiLAotCQkib3BlbkZvbGRlci5naWYiLAotCQkidGFyZ2V0LmdpZiIgfTsKLQotCWJvb2xlYW4gc3RhcnR1cCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgQ29udHJvbEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIENvbnRyb2xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdFJlc291cmNlcygpOwotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJVGFiIFtdIHRhYnMgPSBjcmVhdGVUYWJzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCSAgICBpdGVtLnNldFRleHQgKHRhYnMgW2ldLmdldFRhYlRleHQgKCkpOwotCQkgICAgaXRlbS5zZXRDb250cm9sICh0YWJzIFtpXS5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpKTsKLQkJICAgIGl0ZW0uc2V0RGF0YSAodGFicyBbaV0pOwotCQl9Ci0JCXN0YXJ0dXAgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSBzZXQgb2YgZXhhbXBsZSBUYWJzCi0JICovCi0JVGFiW10gY3JlYXRlVGFicygpIHsKLQkJcmV0dXJuIG5ldyBUYWIgW10gewotCQkJbmV3IEJ1dHRvblRhYiAodGhpcyksCi0JCQluZXcgQ2FudmFzVGFiICh0aGlzKSwKLQkJCW5ldyBDb21ib1RhYiAodGhpcyksCi0JCQluZXcgQ29vbEJhclRhYiAodGhpcyksCi0JCQluZXcgRGlhbG9nVGFiICh0aGlzKSwKLQkJCW5ldyBHcm91cFRhYiAodGhpcyksCi0JCQluZXcgTGFiZWxUYWIgKHRoaXMpLAotCQkJbmV3IExpbmtUYWIgKHRoaXMpLAotCQkJbmV3IExpc3RUYWIgKHRoaXMpLAotCQkJbmV3IE1lbnVUYWIgKHRoaXMpLAotCQkJbmV3IFByb2dyZXNzQmFyVGFiICh0aGlzKSwKLQkJCW5ldyBTYXNoVGFiICh0aGlzKSwKLQkJCXNoZWxsVGFiID0gbmV3IFNoZWxsVGFiKHRoaXMpLAotCQkJbmV3IFNsaWRlclRhYiAodGhpcyksCi0JCQluZXcgU3Bpbm5lclRhYiAodGhpcyksCi0JCQluZXcgVGFiRm9sZGVyVGFiICh0aGlzKSwKLQkJCW5ldyBUYWJsZVRhYiAodGhpcyksCi0JCQluZXcgVGV4dFRhYiAodGhpcyksCi0JCQluZXcgVG9vbEJhclRhYiAodGhpcyksCi0JCQluZXcgVHJlZVRhYiAodGhpcyksCi0JCX07Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIENvbnRyb2xFeGFtcGxlLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvKgotCQkgKiBEZXN0cm95IGFueSBzaGVsbHMgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkJICogYnkgdGhlIFNoZWxscyB0YWIuICBXaGVuIGEgc2hlbGwgaXMgZGlzcG9zZWQsCi0JCSAqIGFsbCBjaGlsZCBzaGVsbHMgYXJlIGFsc28gZGlzcG9zZWQuICBUaGVyZWZvcmUKLQkJICogaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIGZvciBkaXNwb3NlZCBzaGVsbHMKLQkJICogaW4gdGhlIHNoZWxscyBsaXN0IHRvIGF2b2lkIGRpc3Bvc2luZyBhIHNoZWxsCi0JCSAqIHR3aWNlLgotCQkgKi8KLQkJaWYgKHNoZWxsVGFiICE9IG51bGwpIHNoZWxsVGFiLmNsb3NlQWxsU2hlbGxzICgpOwotCQlzaGVsbFRhYiA9IG51bGw7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWZpbmFsIENsYXNzIGNsYXp6ID0gQ29udHJvbEV4YW1wbGUuY2xhc3M7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc291cmNlU3RyZWFtKTsKLQkJCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8KLQkJCWdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6Ci0JCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIjsKLQkJZnJlZVJlc291cmNlcygpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbmV3IENvbnRyb2xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzZXRTaGVsbFNpemUoZGlzcGxheSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXRhYkZvbGRlci5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBzaGVsbCB0byBpdCdzICJwYWNrZWQiIHNpemUsCi0JICogdW5sZXNzIHRoYXQgbWFrZXMgaXQgYmlnZ2VyIHRoYW4gdGhlIGRpc3BsYXksCi0JICogaW4gd2hpY2ggY2FzZSBzZXQgaXQgdG8gOS8xMCBvZiBkaXNwbGF5IHNpemUuCi0JICovCi0Jc3RhdGljIHZvaWQgc2V0U2hlbGxTaXplIChEaXNwbGF5IGRpc3BsYXksIFNoZWxsIHNoZWxsKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmIChzaXplLnggPiBib3VuZHMud2lkdGgpIHNpemUueCA9IGJvdW5kcy53aWR0aCAqIDkgLyAxMDsKLQkJaWYgKHNpemUueSA+IGJvdW5kcy5oZWlnaHQpIHNpemUueSA9IGJvdW5kcy5oZWlnaHQgKiA5IC8gMTA7Ci0JCXNoZWxsLnNldFNpemUgKHNpemUpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzVjMDdjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Nvb2xCYXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBDb29sQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwIHRoYXQgY29udGFpbnMgdGhlbSAqLwotCUNvb2xCYXIgY29vbEJhcjsKLQlDb29sSXRlbSBwdXNoSXRlbSwgZHJvcERvd25JdGVtLCByYWRpb0l0ZW0sIGNoZWNrSXRlbSwgdGV4dEl0ZW07Ci0JR3JvdXAgY29vbEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0JQnV0dG9uIGRyb3BEb3duQnV0dG9uLCBmbGF0QnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBsb2NrZWRCdXR0b247Ci0JCi0JUG9pbnRbXSBzaXplczsKLQlpbnRbXSB3cmFwSW5kaWNlczsKLQlpbnRbXSBvcmRlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ29vbEJhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWxvY2tlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWxvY2tlZEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTG9ja2VkIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlsb2NrZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExvY2tlZCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJY29vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY29vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWNvb2xCYXJHcm91cC5zZXRUZXh0ICgiQ29vbEJhciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCksIGl0ZW1TdHlsZSA9IDA7Ci0KLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0LCBpdGVtLCBhbmQgaXRlbSB0b29sQmFyIHN0eWxlcyAqLwotCQlpbnQgdG9vbEJhclN0eWxlID0gU1dULkZMQVQ7Ci0JCWJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJCXRvb2xCYXJTdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJfQotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCQl0b29sQmFyU3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQkJdmVydGljYWwgPSB0cnVlOwotCQl9Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGRyb3BEb3duQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtU3R5bGUgfD0gU1dULkRST1BfRE9XTjsKLQkKLQkJLyoKLQkJKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkJKi8KLQkJY29vbEJhciA9IG5ldyBDb29sQmFyIChjb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgcHVzaCBidXR0b24gdG9vbGJhciBjb29sIGl0ZW0gKi8KLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsJCQotCQlwdXNoSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJcHVzaEl0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCXB1c2hJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCQkKLQkJLyogQ3JlYXRlIHRoZSBkcm9wZG93biB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlkcm9wRG93bkl0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCWRyb3BEb3duSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJZHJvcERvd25JdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkvKiBDcmVhdGUgdGhlIHJhZGlvIGJ1dHRvbiB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCXJhZGlvSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJcmFkaW9JdGVtLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQlyYWRpb0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBjaGVjayBidXR0b24gdG9vbGJhciBjb29sIGl0ZW0gKi8KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCB0b29sQmFyU3R5bGUpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJY2hlY2tJdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQljaGVja0l0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCWNoZWNrSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIHRleHQgY29vbCBpdGVtICovCi0JCWlmICghdmVydGljYWwpIHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0IChjb29sQmFyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCQl0ZXh0SXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJCXRleHRJdGVtLnNldENvbnRyb2wgKHRleHQpOwotCQkJdGV4dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJUG9pbnQgdGV4dFNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQl0ZXh0U2l6ZSA9IHRleHRJdGVtLmNvbXB1dGVTaXplKHRleHRTaXplLngsIHRleHRTaXplLnkpOwotCQkJdGV4dEl0ZW0uc2V0TWluaW11bVNpemUodGV4dFNpemUpOwotCQkJdGV4dEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0ZXh0U2l6ZSk7Ci0JCQl0ZXh0SXRlbS5zZXRTaXplKHRleHRTaXplKTsKLQkJfQotCi0JCS8qIFNldCB0aGUgc2l6ZXMgYWZ0ZXIgYWRkaW5nIGFsbCBjb29sIGl0ZW1zICovCi0JCUNvb2xJdGVtW10gY29vbEl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvb2xJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBjb29sSXRlbXNbaV07Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjb29sSXRlbS5nZXRDb250cm9sKCk7Ci0JCQlQb2ludCBzaXplID0gY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJUG9pbnQgY29vbFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRvb2xCYXIpIHsKLQkJCQlUb29sQmFyIGJhciA9IChUb29sQmFyKWNvbnRyb2w7Ci0JCQkJaWYgKGJhci5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCQkJaWYgKHZlcnRpY2FsKSB7Ci0JCQkJCQlzaXplLnkgPSBiYXIuZ2V0SXRlbSgwKS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzaXplLnggPSBiYXIuZ2V0SXRlbSgwKS5nZXRXaWR0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29vbEl0ZW0uc2V0TWluaW11bVNpemUoc2l6ZSk7Ci0JCQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKGNvb2xTaXplKTsKLQkJCWNvb2xJdGVtLnNldFNpemUoY29vbFNpemUpOwotCQl9Ci0JCQotCQkvKiBJZiB3ZSBoYXZlIHNhdmVkIHN0YXRlLCByZXN0b3JlIGl0ICovCi0JCWlmIChvcmRlciAhPSBudWxsICYmIG9yZGVyLmxlbmd0aCA9PSBjb29sQmFyLmdldEl0ZW1Db3VudCgpKSB7Ci0JCQljb29sQmFyLnNldEl0ZW1MYXlvdXQob3JkZXIsIHdyYXBJbmRpY2VzLCBzaXplcyk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sQmFyLnNldFdyYXBJbmRpY2VzKG5ldyBpbnRbXSB7MSwgM30pOwotCQl9Ci0JCQotCQkvKiBBZGQgYSBsaXN0ZW5lciB0byByZXNpemUgdGhlIGdyb3VwIGJveCB0byBtYXRjaCB0aGUgY29vbGJhciAqLwotCQljb29sQmFyLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZUdyb3VwLmxheW91dCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQlHcm91cCBpdGVtR3JvdXAgPSBuZXcgR3JvdXAoc3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWl0ZW1Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJaXRlbUdyb3VwLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkl0ZW1fU3R5bGVzIikpOwotCQlkcm9wRG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULkNIRUNLKTsKLQkJZHJvcERvd25CdXR0b24uc2V0VGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJZHJvcERvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKiBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHRvb2xiYXIgaWYgYXBwbGljYWJsZSAqLwotCQlpZiAoY29vbEJhciAhPSBudWxsKSB7Ci0JCQlzaXplcyA9IGNvb2xCYXIuZ2V0SXRlbVNpemVzKCk7Ci0JCQl3cmFwSW5kaWNlcyA9IGNvb2xCYXIuZ2V0V3JhcEluZGljZXMoKTsKLQkJCW9yZGVyID0gY29vbEJhci5nZXRJdGVtT3JkZXIoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMoKTsJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCXJldHVybiBjb29sQmFyLmdldEl0ZW1zKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7Y29vbEJhcn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDb29sQmFyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuVkVSVElDQUwpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlmbGF0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0SXRlbSgwKS5nZXRTdHlsZSAoKSAmIFNXVC5EUk9QX0RPV04pICE9IDApOwotCQlzZXRXaWRnZXRMb2NrZWQgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGhlYWRlciB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldExvY2tlZCAoKSB7Ci0JCWNvb2xCYXIuc2V0TG9ja2VkIChsb2NrZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogTGlzdGVucyB0byB3aWRnZXRTZWxlY3RlZCgpIGV2ZW50cyBvbiBTV1QuRFJPUF9ET1dOIHR5cGUgVG9vbEl0ZW1zCi0JICogYW5kIG9wZW5zL2Nsb3NlcyBhIG1lbnUgd2hlbiBhcHByb3ByaWF0ZS4KLQkgKi8KLQljbGFzcyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCXByaXZhdGUgTWVudSBtZW51ID0gbnVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBDcmVhdGUgdGhlIG1lbnUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY3JlYXRlZAotCQkJaWYgKG1lbnUgPT0gbnVsbCkgewotCQkJCS8vIExhenkgY3JlYXRlIHRoZSBtZW51LgotCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCgpOwotCQkJCW1lbnUgPSBuZXcgTWVudShzaGVsbCk7Ci0JCQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQkJCQl2aXNpYmxlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewotCQkJCQlmaW5hbCBTdHJpbmcgdGV4dCA9IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wRG93bkRhdGFfIiArIGkpOwotCQkJCQlpZiAodGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQltZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJLyoKLQkJCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkJCSAqLwotCQkJCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIGEgZHJvcCBkb3duIHRvb2wKLQkJCSAqIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIG1haW4gYXJlYSBhbmQgaW4gdGhlIGRyb3AKLQkJCSAqIGRvd24gYXJyb3cuICBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwgdG8gZGV0ZXJtaW5lCi0JCQkgKiB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qCi0JCQkJICogVGhlIGRyb3AgZG93biBhcnJvdyB3YXMgc2VsZWN0ZWQuCi0JCQkJICovCi0JCQkJaWYgKHZpc2libGUpIHsKLQkJCQkJLy8gSGlkZSB0aGUgbWVudSB0byBnaXZlIHRoZSBBcnJvdyB0aGUgYXBwZWFyYW5jZSBvZiBiZWluZyBhIHRvZ2dsZSBidXR0b24uCi0JCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJLy8gUG9zaXRpb24gdGhlIG1lbnUgYmVsb3cgYW5kIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSB0aGUgZHJvcCBkb3duIHRvb2wgYnV0dG9uLgotCQkJCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQotCQkJCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJCQlzZXRNZW51VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogTWFpbiBhcmVhIG9mIGRyb3AgZG93biB0b29sIGl0ZW0gc2VsZWN0ZWQuCi0JCQkJICogQW4gYXBwbGljYXRpb24gd291bGQgaW52b2tlIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIHRvb2wgaXRlbS4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0TWVudVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQltZW51LnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyB0byB3aWRnZXRTZWxlY3RlZCgpIGV2ZW50cyBvbiBTV1QuRFJPUF9ET1dOIHR5cGUgQ29vbEl0ZW1zCi0JICogYW5kIG9wZW5zL2Nsb3NlcyBhIG1lbnUgd2hlbiBhcHByb3ByaWF0ZS4KLQkgKi8KLQljbGFzcyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCXByaXZhdGUgTWVudSBtZW51ID0gbnVsbDsKLQkJCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkvKioKLQkJCSAqIEEgc2VsZWN0aW9uIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiB0aGUgY29vbCBpdGVtCi0JCQkgKiBpcyBzZWxlY3RlZCBieSBpdHMgZ3JpcHBlciBvciBpZiB0aGUgZHJvcCBkb3duIGFycm93Ci0JCQkgKiAob3IgJ2NoZXZyb24nKSBpcyBzZWxlY3RlZC4gRXhhbWluZSB0aGUgZXZlbnQgZGV0YWlsCi0JCQkgKiB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIHdpZGdldCB3YXMgc2VsZWN0ZWQuCi0JCQkgKi8KLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJLyogSWYgdGhlIHBvcHVwIG1lbnUgaXMgYWxyZWFkeSB1cCAoaS5lLiB1c2VyIHByZXNzZWQgYXJyb3cgdHdpY2UpLAotCQkJCSAqIHRoZW4gZGlzcG9zZSBpdC4KLQkJCQkgKi8KLQkJCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJCW1lbnUuZGlzcG9zZSgpOwotCQkJCQltZW51ID0gbnVsbDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQkvKiBHZXQgdGhlIGNvb2wgaXRlbSBhbmQgY29udmVydCBpdHMgYm91bmRzIHRvIGRpc3BsYXkgY29vcmRpbmF0ZXMuICovCi0JCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGNvb2xJdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlpdGVtQm91bmRzLndpZHRoID0gZXZlbnQueCAtIGl0ZW1Cb3VuZHMueDsKLQkJCQlQb2ludCBwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCAoaXRlbUJvdW5kcy54LCBpdGVtQm91bmRzLnkpKTsKLQkJCQlpdGVtQm91bmRzLnggPSBwdC54OwotCQkJCWl0ZW1Cb3VuZHMueSA9IHB0Lnk7Ci0JCQkJCi0JCQkJLyogR2V0IHRoZSB0b29sYmFyIGZyb20gdGhlIGNvb2wgaXRlbS4gKi8KLQkJCQlUb29sQmFyIHRvb2xCYXIgPSAoVG9vbEJhcikgY29vbEl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCQlUb29sSXRlbVtdIHRvb2xzID0gdG9vbEJhci5nZXRJdGVtcyAoKTsKLQkJCQlpbnQgdG9vbENvdW50ID0gdG9vbHMubGVuZ3RoOwotCQkJCQkJCQkKLQkJCQkvKiBDb252ZXJ0IHRoZSBib3VuZHMgb2YgZWFjaCB0b29sIGl0ZW0gdG8gZGlzcGxheSBjb29yZGluYXRlcywKLQkJCQkgKiBhbmQgZGV0ZXJtaW5lIHdoaWNoIG9uZXMgYXJlIHBhc3QgdGhlIGJvdW5kcyBvZiB0aGUgY29vbCBpdGVtLgotCQkJCSAqLwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHRvb2xDb3VudCkgewotCQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEJvdW5kcy54LCB0b29sQm91bmRzLnkpKTsKLQkJCQkJdG9vbEJvdW5kcy54ID0gcHQueDsKLQkJCQkJdG9vbEJvdW5kcy55ID0gcHQueTsKLQkJCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkJICAJCWlmICghaW50ZXJzZWN0aW9uLmVxdWFscyAodG9vbEJvdW5kcykpIGJyZWFrOwotCQkJICAJCWkrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogQ3JlYXRlIGEgcG9wLXVwIG1lbnUgd2l0aCBpdGVtcyBmb3IgZWFjaCBvZiB0aGUgaGlkZGVuIGJ1dHRvbnMuICovCi0JCQkJbWVudSA9IG5ldyBNZW51IChjb29sQmFyKTsKLQkJCQlmb3IgKGludCBqID0gaTsgaiA8IHRvb2xDb3VudDsgaisrKSB7Ci0JCQkJCVRvb2xJdGVtIHRvb2wgPSB0b29sc1tqXTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSB0b29sLmdldEltYWdlKCk7Ci0JCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQluZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCh0b29sLmdldFN0eWxlKCkgJiBTV1QuRFJPUF9ET1dOKSAhPSAwKSB7Ci0JCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DQVNDQURFKTsKLQkJCQkJCQltZW51SXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSB0b29sLmdldFRvb2xUaXBUZXh0KCk7Ci0JCQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCQlNZW51IG0gPSBuZXcgTWVudShtZW51KTsKLQkJCQkJCQltZW51SXRlbS5zZXRNZW51KG0pOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgOTsgKytrKSB7Ci0JCQkJCQkJCXRleHQgPSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJvcERvd25EYXRhXyIgKyBrKTsKLQkJCQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJCQkJCQkJTWVudUl0ZW0gbWkgPSBuZXcgTWVudUl0ZW0obSwgU1dULk5PTkUpOwotCQkJCQkJCQkJbWkuc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCQkJCS8qIEFwcGxpY2F0aW9uIGNvZGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIGZvciB0aGUgc3VibWVudSBpdGVtIHdvdWxkIGdvIGhlcmUuICovCi0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQluZXcgTWVudUl0ZW0obSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQkJbWVudUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCQkJCVN0cmluZyB0ZXh0ID0gdG9vbC5nZXRUb29sVGlwVGV4dCgpOwotCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIG1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCQl9Ci0JCQkJCQkvKiBBcHBsaWNhdGlvbiBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIG1lbnUgaXRlbSB3b3VsZCBnbyBoZXJlLiAqLwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8qIERpc3BsYXkgdGhlIHBvcC11cCBtZW51IGF0IHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgYXJyb3cgYnV0dG9uLgotCQkJCSAqIERpc3Bvc2UgdGhlIG1lbnUgd2hlbiB0aGUgdXNlciBpcyBkb25lIHdpdGggaXQuCi0JCQkJICovCi0JCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gY29vbEJhci5nZXREaXNwbGF5ICgpOwotCQkJCXdoaWxlIChtZW51ICE9IG51bGwgJiYgIW1lbnUuaXNEaXNwb3NlZCgpICYmIG1lbnUuaXNWaXNpYmxlICgpKSB7Ci0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQkJfQotCQkJCWlmIChtZW51ICE9IG51bGwpIHsKLQkJCQkJbWVudS5kaXNwb3NlICgpOwotCQkJCQltZW51ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ3VzdG9tQ29udHJvbEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4YWRjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db250cm9sRXhhbXBsZSBleHRlbmRzIENvbnRyb2xFeGFtcGxlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBDdXN0b21Db250cm9sRXhhbXBsZSBlbWJlZGRlZAotCSAqIGluc2lkZSB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ29udHJvbEV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlciAocGFyZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VycyB0aGUgc2V0IG9mIGV4YW1wbGUgVGFicwotCSAqLwotCVRhYltdIGNyZWF0ZVRhYnMoKSB7Ci0JCXJldHVybiBuZXcgVGFiIFtdIHsKLQkJCW5ldyBDQ29tYm9UYWIgKHRoaXMpLAotCQkJbmV3IENMYWJlbFRhYiAodGhpcyksCi0JCQluZXcgQ1RhYkZvbGRlclRhYiAodGhpcyksCi0JCQluZXcgU2FzaEZvcm1UYWIgKHRoaXMpLAotCQkJbmV3IFN0eWxlZFRleHRUYWIgKHRoaXMpLAotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBJbnZva2VzIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ3VzdG9tQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBuZXcgQ3VzdG9tQ29udHJvbEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJjdXN0b20ud2luZG93LnRpdGxlIikpOwotCQlzZXRTaGVsbFNpemUoZGlzcGxheSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9EaWFsb2dUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RpYWxvZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjlkY2YzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RpYWxvZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgRGlhbG9nVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUdyb3VwIGRpYWxvZ1N0eWxlR3JvdXAsIHJlc3VsdEdyb3VwOwotCVRleHQgdGV4dFdpZGdldDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQ29tYm8gZGlhbG9nQ29tYm87Ci0JQnV0dG9uIGNyZWF0ZUJ1dHRvbjsKLQlCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQlCdXR0b24geWVzQnV0dG9uLCBub0J1dHRvbjsKLQlCdXR0b24gcmV0cnlCdXR0b247Ci0JQnV0dG9uIGFib3J0QnV0dG9uLCBpZ25vcmVCdXR0b247Ci0JQnV0dG9uIGljb25FcnJvckJ1dHRvbiwgaWNvbkluZm9ybWF0aW9uQnV0dG9uLCBpY29uUXVlc3Rpb25CdXR0b247Ci0JQnV0dG9uIGljb25XYXJuaW5nQnV0dG9uLCBpY29uV29ya2luZ0J1dHRvbjsKLQlCdXR0b24gbW9kZWxlc3NCdXR0b24sIHByaW1hcnlNb2RhbEJ1dHRvbiwgYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiwgc3lzdGVtTW9kYWxCdXR0b247Ci0JQnV0dG9uIHNhdmVCdXR0b24sIG9wZW5CdXR0b24sIG11bHRpQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBGaWx0ZXJFeHRlbnNpb25zCT0geyIqLnR4dCIsICIqLmJhdCIsICIqLmRvYyIsICIqIn07Ci0Jc3RhdGljIFN0cmluZyBbXSBGaWx0ZXJOYW1lcwkJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMCIpLAotCQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzEiKSwKLQkJCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsdGVyTmFtZV8yIiksCi0JCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMyIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlEaWFsb2dUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGJ1dHRvbiBzdHlsZSBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHNlbGVjdGlvbiBldmVudAotCSAqLwotCXZvaWQgYnV0dG9uU3R5bGVTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkvKgotCQkgKiBPbmx5IGNlcnRhaW4gY29tYmluYXRpb25zIG9mIGJ1dHRvbiBzdHlsZXMgYXJlCi0JCSAqIHN1cHBvcnRlZCBmb3IgdmFyaW91cyBkaWFsb2dzLiAgTWFrZSBzdXJlIHRoZQotCQkgKiBjb250cm9sIHdpZGdldCByZWZsZWN0cyBvbmx5IHZhbGlkIGNvbWJpbmF0aW9ucy4KLQkJICovCi0JCWJvb2xlYW4gb2sgPSBva0J1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCWJvb2xlYW4gY2FuY2VsID0gY2FuY2VsQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiB5ZXMgPSB5ZXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIG5vID0gbm9CdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGFib3J0ID0gYWJvcnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIHJldHJ5ID0gcmV0cnlCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGlnbm9yZSA9IGlnbm9yZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCQotCQlva0J1dHRvbi5zZXRFbmFibGVkICghKHllcyB8fCBubyB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUpKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKCEoYWJvcnQgfHwgaWdub3JlIHx8ICh5ZXMgIT0gbm8pKSk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHJldHJ5IHx8IGFib3J0IHx8IGlnbm9yZSB8fCAoY2FuY2VsICYmICF5ZXMgJiYgIW5vKSkpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHJldHJ5IHx8IGFib3J0IHx8IGlnbm9yZSB8fCAoY2FuY2VsICYmICF5ZXMgJiYgIW5vKSkpOwotCQlyZXRyeUJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHllcyB8fCBubykpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8pKTsKLQkJaWdub3JlQnV0dG9uLnNldEVuYWJsZWQgKCEob2sgfHwgY2FuY2VsIHx8IHllcyB8fCBubykpOwotCQkKLQkJY3JlYXRlQnV0dG9uLnNldEVuYWJsZWQgKAotCQkJCSEob2sgfHwgY2FuY2VsIHx8IHllcyB8fCBubyB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUpIHx8Ci0JCQkJb2sgfHwKLQkJCQkob2sgJiYgY2FuY2VsKSB8fAotCQkJCSh5ZXMgJiYgbm8pIHx8Ci0JCQkJKHllcyAmJiBubyAmJiBjYW5jZWwpIHx8Ci0JCQkJKHJldHJ5ICYmIGNhbmNlbCkgfHwKLQkJCQkoYWJvcnQgJiYgcmV0cnkgJiYgaWdub3JlKSk7Ci0JCQotCi0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY3JlYXRlIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgY3JlYXRlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyogQ29tcHV0ZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAob2tCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBva0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5PSzsKLQkJaWYgKGNhbmNlbEJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGNhbmNlbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DQU5DRUw7Ci0JCWlmICh5ZXNCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiB5ZXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuWUVTOwotCQlpZiAobm9CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBub0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OTzsKLQkJaWYgKHJldHJ5QnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgcmV0cnlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVUUlk7Ci0JCWlmIChhYm9ydEJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGFib3J0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkFCT1JUOwotCQlpZiAoaWdub3JlQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWdub3JlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklHTk9SRTsKLQkJaWYgKGljb25FcnJvckJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25FcnJvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0VSUk9SOwotCQlpZiAoaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fSU5GT1JNQVRJT047Ci0JCWlmIChpY29uUXVlc3Rpb25CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uUXVlc3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9RVUVTVElPTjsKLQkJaWYgKGljb25XYXJuaW5nQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbldhcm5pbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9XQVJOSU5HOwotCQlpZiAoaWNvbldvcmtpbmdCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uV29ya2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX1dPUktJTkc7Ci0JCWlmIChwcmltYXJ5TW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBwcmltYXJ5TW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUFJJTUFSWV9NT0RBTDsKLQkJaWYgKGFwcGxpY2F0aW9uTW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkFQUExJQ0FUSU9OX01PREFMOwotCQlpZiAoc3lzdGVtTW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TWVNURU1fTU9EQUw7Ci0JCWlmIChzYXZlQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgc2F2ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TQVZFOwotCQlpZiAob3BlbkJ1dHRvbi5nZXRFbmFibGVkICgpICYmIG9wZW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuT1BFTjsKLQkJaWYgKG11bHRpQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgbXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCi0JCS8qIE9wZW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyB0eXBlICovCi0JCVN0cmluZyBuYW1lID0gZGlhbG9nQ29tYm8uZ2V0VGV4dCAoKTsKLQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3JEaWFsb2ciKSkpIHsKLQkJCUNvbG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwgLHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRSR0IgKG5ldyBSR0IgKDEwMCwgMTAwLCAxMDApKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlSR0IgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yRGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlyZWN0b3J5RGlhbG9nIikpKSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaXJlY3RvcnlEaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlRGlhbG9nIikpKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldEZpbGVOYW1lIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygicmVhZG1lX3R4dCIpKTsKLQkJCWRpYWxvZy5zZXRGaWx0ZXJOYW1lcyAoRmlsdGVyTmFtZXMpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMgKEZpbHRlckV4dGVuc2lvbnMpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlRGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpKSkgewotCQkJRm9udERpYWxvZyBkaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlGb250RGF0YSByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIikpKSB7Ci0JCQlQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlQcmludGVyRGF0YSByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHJpbnREaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWlmIChuYW1lLmVxdWFscyhDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpKSkgewotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveCAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQkvKgotCQkJICogVGhlIHJlc3VsdGluZyBpbnRlZ2VyIGRlcGVuZHMgb24gdGhlIG9yaWdpbmFsCi0JCQkgKiBkaWFsb2cgc3R5bGUuICBEZWNvZGUgdGhlIHJlc3VsdCBhbmQgZGlzcGxheSBpdC4KLQkJCSAqLwotCQkJc3dpdGNoIChyZXN1bHQpIHsKLQkJCQljYXNlIFNXVC5PSzoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULk9LIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuWUVTOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuWUVTIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTk86Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5OTyJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULkNBTkNFTCJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkFCT1JUOiAKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULkFCT1JUIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUkVUUlk6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5SRVRSWSJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULklHTk9SRToKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULklHTk9SRSJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEl0IGNvbnNpc3RzIG9mIHRoZQotCQkgKiBzdHlsZSBncm91cCwgdGhlIGRpc3BsYXkgZ3JvdXAgYW5kIHRoZSBzaXplIGdyb3VwLgotCQkgKi8JCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dD0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcnMiKSk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgYSBncm91cCB0byBob2xkIHRoZSBkaWFsb2cgc3R5bGUgY29tYm8gYm94IGFuZAotCQkgKiBjcmVhdGUgZGlhbG9nIGJ1dHRvbi4KLQkJICovCi0JCWRpYWxvZ1N0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaWFsb2dfVHlwZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb21ibyAqLwotCQlTdHJpbmcgW10gc3RyaW5ncyA9IHsKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvckRpYWxvZyIpLCAKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaXJlY3RvcnlEaWFsb2ciKSwKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlRGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpLAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpLAotCQl9OwotCQlkaWFsb2dDb21ibyA9IG5ldyBDb21ibyAoZGlhbG9nU3R5bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWRpYWxvZ0NvbWJvLnNldEl0ZW1zIChzdHJpbmdzKTsKLQkJZGlhbG9nQ29tYm8uc2V0VGV4dCAoc3RyaW5ncyBbMF0pOwotCQlkaWFsb2dDb21iby5zZXRWaXNpYmxlSXRlbUNvdW50KHN0cmluZ3MubGVuZ3RoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjcmVhdGUgZGlhbG9nIGJ1dHRvbiAqLwotCQljcmVhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGRpYWxvZ1N0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDcmVhdGVfRGlhbG9nIikpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdmFyaW91cyBkaWFsb2cgYnV0dG9uIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIGJ1dHRvblN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCdXR0b25fU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGJ1dHRvbiBzdHlsZSBidXR0b25zICovCi0JCW9rQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJb2tCdXR0b24uc2V0VGV4dCAoIlNXVC5PSyIpOwotCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljYW5jZWxCdXR0b24uc2V0VGV4dCAoIlNXVC5DQU5DRUwiKTsKLQkJeWVzQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJeWVzQnV0dG9uLnNldFRleHQgKCJTV1QuWUVTIik7Ci0JCW5vQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9CdXR0b24uc2V0VGV4dCAoIlNXVC5OTyIpOwotCQlyZXRyeUJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJldHJ5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVUUlkiKTsKLQkJYWJvcnRCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlhYm9ydEJ1dHRvbi5zZXRUZXh0ICgiU1dULkFCT1JUIik7Ci0JCWlnbm9yZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRUZXh0ICgiU1dULklHTk9SRSIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGljb24gc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgaWNvblN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpY29uU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaWNvblN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWljb25TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJY29uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBpY29uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJaWNvbkVycm9yQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fRVJST1IiKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fSU5GT1JNQVRJT04iKTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fUVVFU1RJT04iKTsKLQkJaWNvbldhcm5pbmdCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1dBUk5JTkciKTsKLQkJaWNvbldvcmtpbmdCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1dPUktJTkciKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtb2RhbCBzdHlsZSBjb250cm9scyAqLwotCQlHcm91cCBtb2RhbFN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJbW9kYWxTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNb2RhbF9TdHlsZXMiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbW9kYWwgc3R5bGUgYnV0dG9ucyAqLwotCQltb2RlbGVzc0J1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbW9kZWxlc3NCdXR0b24uc2V0VGV4dCAoIlNXVC5NT0RFTEVTUyIpOwotCQlwcmltYXJ5TW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXByaW1hcnlNb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlBSSU1BUllfTU9EQUwiKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkFQUExJQ0FUSU9OX01PREFMIik7Ci0JCXN5c3RlbU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNZU1RFTV9NT0RBTCIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGZpbGUgZGlhbG9nIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIGZpbGVEaWFsb2dTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZmlsZURpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWZpbGVEaWFsb2dTdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlmaWxlRGlhbG9nU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZV9EaWFsb2dfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGZpbGUgZGlhbG9nIHN0eWxlIGJ1dHRvbnMgKi8KLQkJb3BlbkJ1dHRvbiA9IG5ldyBCdXR0b24oZmlsZURpYWxvZ1N0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW9wZW5CdXR0b24uc2V0VGV4dCgiU1dULk9QRU4iKTsKLQkJc2F2ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGZpbGVEaWFsb2dTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzYXZlQnV0dG9uLnNldFRleHQgKCJTV1QuU0FWRSIpOwotCQltdWx0aUJ1dHRvbiA9IG5ldyBCdXR0b24oZmlsZURpYWxvZ1N0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpQnV0dG9uLnNldFRleHQoIlNXVC5NVUxUSSIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG9yaWVudGF0aW9uIGdyb3VwICovCi0JCWlmIChSVExfU1VQUE9SVF9FTkFCTEUpIHsKLQkJCWNyZWF0ZU9yaWVudGF0aW9uR3JvdXAoKTsKLQkJfQotCQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJZGlhbG9nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWRpYWxvZ1NlbGVjdGVkIChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkIChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25TdHlsZUxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYnV0dG9uU3R5bGVTZWxlY3RlZCAoZXZlbnQpOwotCQkJfQotCQl9OwotCQlva0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCXllc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCW5vQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJcmV0cnlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlhYm9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCWlnbm9yZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3Igc3R5bGUgYnV0dG9ucyAqLwotCQlva0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW5vQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJcmV0cnlCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlzYXZlQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJb3BlbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW9wZW5CdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJbXVsdGlCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJbW9kZWxlc3NCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQlleGFtcGxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCi0JCS8qCi0JCSAqIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB3aWRnZXQgdG8gZGlzcGxheQotCQkgKiB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgZXhhbXBsZSBkaWFsb2dzLgotCQkgKi8KLQkJcmVzdWx0R3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlyZXN1bHRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJcmVzdWx0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcmVzdWx0R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpYWxvZ19SZXN1bHQiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgYSBtdWx0aSBsaW5lZCwgc2Nyb2xsZWQgdGV4dCB3aWRnZXQgZm9yIG91dHB1dC4KLQkJICovCi0JCXRleHRXaWRnZXQgPSBuZXcgVGV4dChyZXN1bHRHcm91cCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl0ZXh0V2lkZ2V0LnNldExheW91dERhdGEgKGdyaWREYXRhKTsJCi0JfQotCQotCS8qKgotCSAqIFRoZSBwbGF0Zm9ybSBkaWFsb2dzIGRvIG5vdCBoYXZlIFNXVCBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBjcmVhdGVMaXN0ZW5lcnNHcm91cCAoKSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGlhbG9nIHR5cGUgY29tYm8gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLQkgKi8KLQl2b2lkIGRpYWxvZ1NlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKiBFbmFibGUvRGlzYWJsZSB0aGUgYnV0dG9ucyAqLwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZ0NvbWJvLmdldFRleHQgKCk7Ci0JCWJvb2xlYW4gaXNNZXNzYWdlQm94ID0gbmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IikpOwotCQlib29sZWFuIGlzRmlsZURpYWxvZyA9IG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlyZXRyeUJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpZ25vcmVCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbkVycm9yQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uUXVlc3Rpb25CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0RW5hYmxlZCAgKGlzTWVzc2FnZUJveCk7Ci0JCXNhdmVCdXR0b24uc2V0RW5hYmxlZCAoaXNGaWxlRGlhbG9nKTsKLQkJb3BlbkJ1dHRvbi5zZXRFbmFibGVkIChpc0ZpbGVEaWFsb2cpOwotCQltdWx0aUJ1dHRvbi5zZXRFbmFibGVkIChpc0ZpbGVEaWFsb2cpOwotCQotCQkvKiBVbnNlbGVjdCB0aGUgYnV0dG9ucyAqLwotCQlpZiAoIWlzTWVzc2FnZUJveCkgewotCQkJb2tCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQljYW5jZWxCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl5ZXNCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlub0J1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXJldHJ5QnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJYWJvcnRCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlpZ25vcmVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiRGlhbG9nIjsKLQl9Ci0JCi0JLyoqCi0JICogUmVjcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQlpZiAodGV4dFdpZGdldCA9PSBudWxsKSB7Ci0JCQlzdXBlci5yZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQl9IAotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0dyb3VwVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWI1MGUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0dyb3VwVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBHcm91cFRhYiBleHRlbmRzIFRhYiB7Ci0JQnV0dG9uIHRpdGxlQnV0dG9uOwotCQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgZ3JvdXAxOwotCUdyb3VwIGdyb3VwR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBzaGFkb3dFdGNoZWRJbkJ1dHRvbiwgc2hhZG93RXRjaGVkT3V0QnV0dG9uLCBzaGFkb3dJbkJ1dHRvbiwgc2hhZG93T3V0QnV0dG9uLCBzaGFkb3dOb25lQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUdyb3VwVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGVfVGV4dCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFRpdGxlVGV4dCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgR3JvdXAgKi8KLQkJZ3JvdXBHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdyb3VwR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWdyb3VwR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWdyb3VwR3JvdXAuc2V0VGV4dCAoIkdyb3VwIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2hhZG93RXRjaGVkSW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0VUQ0hFRF9JTjsKLQkJaWYgKHNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfRVRDSEVEX09VVDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJZ3JvdXAxID0gbmV3IEdyb3VwIChncm91cEdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfRVRDSEVEX0lOIik7Ci0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJc2hhZG93RXRjaGVkT3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93RXRjaGVkT3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX0VUQ0hFRF9PVVQiKTsKLQkJc2hhZG93SW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19JTiIpOwotCQlzaGFkb3dPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfT1VUIik7Ci0JCXNoYWRvd05vbmVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX05PTkUiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX07Ci0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzaGFkb3dJbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzaGFkb3dPdXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge2dyb3VwMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJHcm91cCI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGl0bGUgdGV4dCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRUaXRsZVRleHQgKCkgewotCQlpZiAodGl0bGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlncm91cDEuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlX1RleHQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlncm91cDEuc2V0VGV4dCAoIiIpOwotCQl9Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19FVENIRURfSU4pICE9IDApOwotCQlzaGFkb3dFdGNoZWRPdXRCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19FVENIRURfT1VUKSAhPSAwKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19JTikgIT0gMCk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX09VVCkgIT0gMCk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19OT05FKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGdyb3VwMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlzZXRUaXRsZVRleHQgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGFiZWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwZmUwYzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGFiZWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIExhYmVsVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDMsIGxhYmVsNCwgbGFiZWw1LCBsYWJlbDY7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXAsIGltYWdlTGFiZWxHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgc2VwYXJhdG9yQnV0dG9uLCBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGFiZWxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgbGFiZWxzICovCi0JCXRleHRMYWJlbEdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRleHRMYWJlbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUZXh0X0xhYmVscyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSBsYWJlbHMgKi8KLQkJaW1hZ2VMYWJlbEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5TSEFET1dfTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJaW1hZ2VMYWJlbEdyb3VwLnNldExheW91dCAoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWltYWdlTGFiZWxHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJaW1hZ2VMYWJlbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZV9MYWJlbHMiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAod3JhcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAoc2VwYXJhdG9yQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNFUEFSQVRPUjsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoc2hhZG93SW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0lOOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChzaGFkb3dOb25lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19OT05FOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJbGFiZWwxID0gbmV3IExhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDEuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lIikpOwotCQlsYWJlbDIgPSBuZXcgTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUd28iKSk7Ci0JCWxhYmVsMyA9IG5ldyBMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlsYWJlbDMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIldyYXBfVGV4dCIpKTsKLQkJfSBlbHNlIHsKLQkJCWxhYmVsMy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGhyZWUiKSk7Ci0JCX0KLQkJbGFiZWw0ID0gbmV3IExhYmVsIChpbWFnZUxhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWw0LnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJbGFiZWw1ID0gbmV3IExhYmVsIChpbWFnZUxhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWw1LnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWxhYmVsNiA9IG5ldyBMYWJlbChpbWFnZUxhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWw2LnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXNlcGFyYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNlcGFyYXRvckJ1dHRvbi5zZXRUZXh0ICgiU1dULlNFUEFSQVRPUiIpOwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCUdyb3VwIHN0eWxlU3ViR3JvdXAgPSBuZXcgR3JvdXAgKHN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVTdWJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2hhZG93SW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZVN1Ykdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19JTiIpOwotCQlzaGFkb3dPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZVN1Ykdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfT1VUIik7Ci0JCXNoYWRvd05vbmVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZVN1Ykdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX05PTkUiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCgiU1dULkJPUkRFUiIpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKChldmVudC53aWRnZXQuZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgIT0gMCkgewotCQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCX0KLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9OwotCQlzaGFkb3dJbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzaGFkb3dPdXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge2xhYmVsMSwgbGFiZWwyLCBsYWJlbDMsIGxhYmVsNCwgbGFiZWw1LCBsYWJlbDZ9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJMYWJlbCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QWxpZ25tZW50ICgpIHsKLQkJaW50IGFsaWdubWVudCA9IDA7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuUklHSFQ7Ci0JCWxhYmVsMS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWxhYmVsMi5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWxhYmVsMy5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWxhYmVsNC5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWxhYmVsNS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWxhYmVsNi5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJYm9vbGVhbiBpc1NlcGFyYXRvciA9IChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0VQQVJBVE9SKSAhPSAwOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoIWlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuV1JBUCkgIT0gMCk7Ci0JCWxlZnRCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJY2VudGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoIWlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuQ0VOVEVSKSAhPSAwKTsKLQkJcmlnaHRCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCXNoYWRvd0luQnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfSU4pICE9IDApOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19PVVQpICE9IDApOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfTk9ORSkgIT0gMCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkhPUklaT05UQUwpICE9IDApOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuVkVSVElDQUwpICE9IDApOwkJCi0JCXdyYXBCdXR0b24uc2V0RW5hYmxlZCAoIWlzU2VwYXJhdG9yKTsKLQkJbGVmdEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQljZW50ZXJCdXR0b24uc2V0RW5hYmxlZCAoIWlzU2VwYXJhdG9yKTsKLQkJcmlnaHRCdXR0b24uc2V0RW5hYmxlZCAoIWlzU2VwYXJhdG9yKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaW5rVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaW5rVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWZmODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlua1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIExpbmtUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JTGluayBsaW5rMTsKLQlHcm91cCBsaW5rR3JvdXA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUxpbmtUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGxpc3QgKi8KLQkJbGlua0dyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlua0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlsaW5rR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWxpbmtHcm91cC5zZXRUZXh0ICgiTGluayIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCQkKLQkJdHJ5IHsKLQkJCWxpbmsxID0gbmV3IExpbmsgKGxpbmtHcm91cCwgc3R5bGUpOwotCQkJbGluazEuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmtUZXh0IikpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQkvLyB0ZW1wb3JhcnkgY29kZSBmb3IgcGhvdG9uCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAobGlua0dyb3VwLCBTV1QuQ0VOVEVSIHwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dCAoIkxpbmsgd2lkZ2V0IG5vdCBzdXBvcnRlZCIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLS8vCQkgdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQlpZiAobGluazEgIT0gbnVsbCkgcmV0dXJuIG5ldyBDb250cm9sIFtdIHtsaW5rMX07Ci0JCXJldHVybiBuZXcgQ29udHJvbFtdIHt9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiTGluayI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaXN0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaXN0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMTMxNWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIExpc3RUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JTGlzdCBsaXN0MTsKLQlHcm91cCBsaXN0R3JvdXA7Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV84Iil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUxpc3RUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGxpc3QgKi8KLQkJbGlzdEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlzdEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlsaXN0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWxpc3RHcm91cC5zZXRUZXh0ICgiTGlzdCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxpc3QxID0gbmV3IExpc3QgKGxpc3RHcm91cCwgc3R5bGUpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtsaXN0MX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiSXRlbXMiLCAiU2VsZWN0aW9uIiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiTGlzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTWVudVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTWVudVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdmODMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIE1lbnVUYWIgZXh0ZW5kcyBUYWIgewkKLQkvKiBXaWRnZXRzIGFkZGVkIHRvIHRoZSAiTWVudSBTdHlsZSIsICJNZW51SXRlbSBTdHlsZSIgYW5kICJPdGhlciIgZ3JvdXBzICovCi0JQnV0dG9uIGJhckJ1dHRvbiwgZHJvcERvd25CdXR0b24sIHBvcFVwQnV0dG9uLCBub1JhZGlvR3JvdXBCdXR0b24sIGxlZnRUb1JpZ2h0QnV0dG9uLCByaWdodFRvTGVmdEJ1dHRvbjsKLQlCdXR0b24gY2hlY2tCdXR0b24sIGNhc2NhZGVCdXR0b24sIHB1c2hCdXR0b24sIHJhZGlvQnV0dG9uLCBzZXBhcmF0b3JCdXR0b247Ci0JQnV0dG9uIGltYWdlc0J1dHRvbiwgYWNjZWxlcmF0b3JzQnV0dG9uLCBtbmVtb25pY3NCdXR0b24sIHN1Yk1lbnVCdXR0b24sIHN1YlN1Yk1lbnVCdXR0b247Ci0JQnV0dG9uIGNyZWF0ZUJ1dHRvbiwgY2xvc2VBbGxCdXR0b247Ci0JR3JvdXAgbWVudUl0ZW1TdHlsZUdyb3VwOwotCi0JLyogVmFyaWFibGVzIHVzZWQgdG8gdHJhY2sgdGhlIG9wZW4gc2hlbGxzICovCi0JaW50IHNoZWxsQ291bnQgPSAwOwotCVNoZWxsIFtdIHNoZWxscyA9IG5ldyBTaGVsbCBbNF07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCU1lbnVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIGFsbCB0aGUgZXhhbXBsZSBzaGVsbHMuCi0JICovCi0Jdm9pZCBjbG9zZUFsbFNoZWxscygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGk8c2hlbGxDb3VudDsgaSsrKSB7Ci0JCQlpZiAoc2hlbGxzW2ldICE9IG51bGwgJiAhc2hlbGxzIFtpXS5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQkJc2hlbGxzIFtpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJc2hlbGxDb3VudCA9IDA7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgQ3JlYXRlIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCi0JCS8qCi0JCSAqIFJlbWVtYmVyIHRoZSBleGFtcGxlIHNoZWxscyBzbyB0aGV5Ci0JCSAqIGNhbiBiZSBkaXNwb3NlZCBieSB0aGUgdXNlci4KLQkJICovCi0JCWlmIChzaGVsbENvdW50ID49IHNoZWxscy5sZW5ndGgpIHsKLQkJCVNoZWxsIFtdIG5ld1NoZWxscyA9IG5ldyBTaGVsbCBbc2hlbGxzLmxlbmd0aCArIDRdOwotCQkJU3lzdGVtLmFycmF5Y29weSAoc2hlbGxzLCAwLCBuZXdTaGVsbHMsIDAsIHNoZWxscy5sZW5ndGgpOwotCQkJc2hlbGxzID0gbmV3U2hlbGxzOwotCQl9Ci0JCi0JCWludCBvcmllbnRhdGlvbiA9IDA7Ci0JCWlmIChsZWZ0VG9SaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgb3JpZW50YXRpb24gfD0gU1dULkxFRlRfVE9fUklHSFQ7Ci0JCWlmIChyaWdodFRvTGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgb3JpZW50YXRpb24gfD0gU1dULlJJR0hUX1RPX0xFRlQ7Ci0JCWludCByYWRpb0JlaGF2aW9yID0gMDsKLQkJaWYgKG5vUmFkaW9Hcm91cEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcmFkaW9CZWhhdmlvciB8PSBTV1QuTk9fUkFESU9fR1JPVVA7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIHNoZWxsIGFuZCBtZW51KHMpICovCi0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChTV1QuU0hFTExfVFJJTSB8IG9yaWVudGF0aW9uKTsKLQkJc2hlbGxzIFtzaGVsbENvdW50XSA9IHNoZWxsOwotCQlpZiAoYmFyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJLyogQ3JlYXRlIG1lbnUgYmFyLiAqLwotCQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIgfCByYWRpb0JlaGF2aW9yKTsKLQkJCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCQlob29rTGlzdGVuZXJzKG1lbnVCYXIpOwotCi0JCQlpZiAoZHJvcERvd25CdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgY2FzY2FkZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCS8qIENyZWF0ZSBjYXNjYWRlIGJ1dHRvbiBhbmQgZHJvcC1kb3duIG1lbnUgaW4gbWVudSBiYXIuICovCi0JCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiQ2FzY2FkZSIpKTsKLQkJCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCQkJCU1lbnUgZHJvcERvd25NZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04gfCByYWRpb0JlaGF2aW9yKTsKLQkJCQlpdGVtLnNldE1lbnUoZHJvcERvd25NZW51KTsKLQkJCQlob29rTGlzdGVuZXJzKGRyb3BEb3duTWVudSk7Ci0JCi0JCQkJLyogQ3JlYXRlIHZhcmlvdXMgbWVudSBpdGVtcywgZGVwZW5kaW5nIG9uIHNlbGVjdGlvbnMuICovCi0JCQkJY3JlYXRlTWVudUl0ZW1zKGRyb3BEb3duTWVudSwgc3ViTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSwgc3ViU3ViTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwb3BVcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJLyogQ3JlYXRlIHBvcC11cCBtZW51LiAqLwotCQkJTWVudSBwb3BVcE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULlBPUF9VUCB8IHJhZGlvQmVoYXZpb3IpOwotCQkJc2hlbGwuc2V0TWVudShwb3BVcE1lbnUpOwotCQkJaG9va0xpc3RlbmVycyhwb3BVcE1lbnUpOwotCi0JCQkvKiBDcmVhdGUgdmFyaW91cyBtZW51IGl0ZW1zLCBkZXBlbmRpbmcgb24gc2VsZWN0aW9ucy4gKi8KLQkJCWNyZWF0ZU1lbnVJdGVtcyhwb3BVcE1lbnUsIHN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCksIHN1YlN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JCQotCQkvKiBTZXQgdGhlIHNpemUsIHRpdGxlIGFuZCBvcGVuIHRoZSBzaGVsbC4gKi8KLQkJc2hlbGwuc2V0U2l6ZSAoMzAwLCAxMDApOwotCQlzaGVsbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSArIHNoZWxsQ291bnQpOwotCQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCWUuZ2MuZHJhd1N0cmluZyhDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUG9wdXBNZW51SGVyZSIpLCAyMCwgMjApOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJc2hlbGxDb3VudCsrOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgZ3JvdXAuIAotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGlzIGlzIHRoZSBncm91cCBvbiB0aGUKLQkJICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiAgRm9yIE1lbnVUYWIsIGl0IGNvbnNpc3RzIG9mCi0JCSAqIHRoZSBNZW51IHN0eWxlIGdyb3VwLCB0aGUgTWVudUl0ZW0gc3R5bGUgZ3JvdXAgYW5kIHRoZSAnb3RoZXInIGdyb3VwLgotCQkgKi8JCQotCQljb250cm9sR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIHRydWUpKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcnMiKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbWVudSBzdHlsZSBjb250cm9scyAqLwotCQlzdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJc3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudV9TdHlsZXMiKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbWVudSBpdGVtIHN0eWxlIGNvbnRyb2xzICovCi0JCW1lbnVJdGVtU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1lbnVJdGVtU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbWVudUl0ZW1TdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW1lbnVJdGVtU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fU3R5bGVzIikpOwotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgJ290aGVyJyBjb250cm9scyAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlvdGhlckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPdGhlciIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBtZW51IHN0eWxlIGJ1dHRvbnMgKi8KLQkJYmFyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFyQnV0dG9uLnNldFRleHQgKCJTV1QuQkFSIik7Ci0JCWRyb3BEb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZHJvcERvd25CdXR0b24uc2V0VGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJcG9wVXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlwb3BVcEJ1dHRvbi5zZXRUZXh0ICgiU1dULlBPUF9VUCIpOwotCQlub1JhZGlvR3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub1JhZGlvR3JvdXBCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19SQURJT19HUk9VUCIpOwotCQlsZWZ0VG9SaWdodEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxlZnRUb1JpZ2h0QnV0dG9uLnNldFRleHQgKCJTV1QuTEVGVF9UT19SSUdIVCIpOwotCQlsZWZ0VG9SaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJpZ2h0VG9MZWZ0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJcmlnaHRUb0xlZnRCdXR0b24uc2V0VGV4dCAoIlNXVC5SSUdIVF9UT19MRUZUIik7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbWVudSBpdGVtIHN0eWxlIGJ1dHRvbnMgKi8KLQkJY2FzY2FkZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2FzY2FkZUJ1dHRvbi5zZXRUZXh0ICgiU1dULkNBU0NBREUiKTsKLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQnV0dG9uLnNldFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJcHVzaEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcHVzaEJ1dHRvbi5zZXRUZXh0ICgiU1dULlBVU0giKTsKLQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQgKCJTV1QuUkFESU8iKTsKLQkJc2VwYXJhdG9yQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0VGV4dCAoIlNXVC5TRVBBUkFUT1IiKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgJ290aGVyJyBidXR0b25zICovCi0JCWltYWdlc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWltYWdlc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VzIikpOwotCQlhY2NlbGVyYXRvcnNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlhY2NlbGVyYXRvcnNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFjY2VsZXJhdG9ycyIpKTsKLQkJbW5lbW9uaWNzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbW5lbW9uaWNzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNbmVtb25pY3MiKSk7Ci0JCXN1Yk1lbnVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzdWJNZW51QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTdWJNZW51IikpOwotCQlzdWJTdWJNZW51QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViU3ViTWVudSIpKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgImNyZWF0ZSIgYW5kICJjbG9zZUFsbCIgYnV0dG9ucyAoYW5kIGEgJ2ZpbGxlcicgbGFiZWwgdG8gcGxhY2UgdGhlbSkgKi8KLQkJbmV3IExhYmVsKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljcmVhdGVCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJY3JlYXRlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDcmVhdGVfU2hlbGwiKSk7Ci0JCWNsb3NlQWxsQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlX0FsbF9TaGVsbHMiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWNyZWF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljcmVhdGVCdXR0b25TZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCWNsb3NlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNsb3NlQWxsU2hlbGxzICgpOwotCQkJfQotCQl9KTsKLQkJc3ViTWVudUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdWJTdWJNZW51QnV0dG9uLnNldEVuYWJsZWQgKHN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQliYXJCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJZHJvcERvd25CdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcG9wVXBCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJY2FzY2FkZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlwdXNoQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXNlcGFyYXRvckJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlzdWJTdWJNZW51QnV0dG9uLnNldEVuYWJsZWQgKHN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyogQ3JlYXRlIHZhcmlvdXMgbWVudSBpdGVtcywgZGVwZW5kaW5nIG9uIHNlbGVjdGlvbnMuICovCi0Jdm9pZCBjcmVhdGVNZW51SXRlbXMoTWVudSBtZW51LCBib29sZWFuIGNyZWF0ZVN1Yk1lbnUsIGJvb2xlYW4gY3JlYXRlU3ViU3ViTWVudSkgewotCQlNZW51SXRlbSBpdGVtOwotCQlpZiAocHVzaEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCJQdXNoIikpOwotCQkJaWYgKGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArIFNXVC5NT0QyICsgJ1AnKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCQl9Ci0JCQotCQlpZiAoc2VwYXJhdG9yQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCX0KLQkJCi0JCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiQ2hlY2siKSk7Ci0JCQlpZiAoYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgU1dULk1PRDIgKyAnQycpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCQl9Ci0JCQkJCi0JCWlmIChyYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiMVJhZGlvIikpOwotCQkJaWYgKGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArIFNXVC5NT0QyICsgJzEnKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCQlpdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0KLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIjJSYWRpbyIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICcyJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCi0JCWlmIChjcmVhdGVTdWJNZW51ICYmIGNhc2NhZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8qIENyZWF0ZSBjYXNjYWRlIGJ1dHRvbiBhbmQgZHJvcC1kb3duIG1lbnUgZm9yIHRoZSBzdWItbWVudS4gKi8KLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiQ2FzY2FkZSIpKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJCU1lbnUgc3ViTWVudSA9IG5ldyBNZW51KG1lbnUuZ2V0U2hlbGwoKSwgU1dULkRST1BfRE9XTik7Ci0JCQlpdGVtLnNldE1lbnUoc3ViTWVudSk7Ci0JCQlob29rTGlzdGVuZXJzKHN1Yk1lbnUpOwotCQkJCi0JCQljcmVhdGVNZW51SXRlbXMoc3ViTWVudSwgY3JlYXRlU3ViU3ViTWVudSwgZmFsc2UpOwotCQl9Ci0JfQotCQotCVN0cmluZyBnZXRNZW51SXRlbVRleHQoU3RyaW5nIGl0ZW0pIHsKLQkJYm9vbGVhbiBjYXNjYWRlID0gaXRlbS5lcXVhbHMoIkNhc2NhZGUiKTsKLQkJYm9vbGVhbiBtbmVtb25pYyA9IG1uZW1vbmljc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBhY2NlbGVyYXRvciA9IGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJY2hhciBhY2NlbGVyYXRvcktleSA9IGl0ZW0uY2hhckF0KDApOwotCQlpZiAobW5lbW9uaWMgJiYgYWNjZWxlcmF0b3IgJiYgIWNhc2NhZGUpIHsKLQkJCXJldHVybiBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpdGVtICsgIldpdGhNbmVtb25pYyIpICsgIlx0Q3RybCtTaGlmdCsiICsgYWNjZWxlcmF0b3JLZXk7Ci0JCX0KLQkJaWYgKGFjY2VsZXJhdG9yICYmICFjYXNjYWRlKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSkgKyAiXHRDdHJsK1NoaWZ0KyIgKyBhY2NlbGVyYXRvcktleTsKLQkJfQotCQlpZiAobW5lbW9uaWMpIHsKLQkJCXJldHVybiBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpdGVtICsgIldpdGhNbmVtb25pYyIpOwotCQl9Ci0JCXJldHVybiBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpdGVtKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiTWVudSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUHJvZ3Jlc3NCYXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzYTM2NzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUHJvZ3Jlc3NCYXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgUHJvZ3Jlc3NCYXJUYWIgZXh0ZW5kcyBSYW5nZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjE7Ci0JR3JvdXAgcHJvZ3Jlc3NCYXJHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gc21vb3RoQnV0dG9uOwotCUJ1dHRvbiBpbmRldGVybWluYXRlQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVByb2dyZXNzQmFyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHByb2dyZXNzIGJhciAqLwotCQlwcm9ncmVzc0Jhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJcHJvZ3Jlc3NCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJcHJvZ3Jlc3NCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJcHJvZ3Jlc3NCYXJHcm91cC5zZXRUZXh0ICgiUHJvZ3Jlc3NCYXIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNtb290aEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoaW5kZXRlcm1pbmF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JTkRFVEVSTUlOQVRFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXByb2dyZXNzQmFyMSA9IG5ldyBQcm9ncmVzc0JhciAocHJvZ3Jlc3NCYXJHcm91cCwgc3R5bGUpOwotCQlwcm9ncmVzc0JhcjEuc2V0TWF4aW11bSAoMTAwKTsKLQkJcHJvZ3Jlc3NCYXIxLnNldFNlbGVjdGlvbiAoNTApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQgKCJTV1QuU01PT1RIIik7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmRldGVybWluYXRlQnV0dG9uLnNldFRleHQgKCJTV1QuSU5ERVRFUk1JTkFURSIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7cHJvZ3Jlc3NCYXIxfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiUHJvZ3Jlc3NCYXIiOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKGluZGV0ZXJtaW5hdGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzZWxlY3Rpb25TY2FsZS5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQltaW5pbXVtU2NhbGUuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJbWF4aW11bVNjYWxlLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblNjYWxlLnNldEVuYWJsZWQgKHRydWUpOwotCQkJbWluaW11bVNjYWxlLnNldEVuYWJsZWQgKHRydWUpOwotCQkJbWF4aW11bVNjYWxlLnNldEVuYWJsZWQgKHRydWUpOwotCQl9Ci0JCW1heGltdW1TY2FsZS5zZXRNYXhpbXVtIChwcm9ncmVzc0JhcjEuZ2V0TWF4aW11bSAoKSk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChwcm9ncmVzc0JhcjEuZ2V0U3R5bGUgKCkgJiBTV1QuU01PT1RIKSAhPSAwKTsKLQkJaW5kZXRlcm1pbmF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChwcm9ncmVzc0JhcjEuZ2V0U3R5bGUgKCkgJiBTV1QuSU5ERVRFUk1JTkFURSkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJcHJvZ3Jlc3NCYXIxLnNldE1heGltdW0gKG1heGltdW1TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTY2FsZXMgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpIHsKLQkJcHJvZ3Jlc3NCYXIxLnNldE1pbmltdW0gKG1pbmltdW1TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTY2FsZXMgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvblNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXVwZGF0ZVNjYWxlcyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNjYWxlIHdpZGdldHMgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlIHNldCAKLQkgKiBvbiB0aGUgIkV4YW1wbGUiIHdpZGdldC4KLQkgKi8KLQl2b2lkIHVwZGF0ZVNjYWxlcyAoKSB7Ci0JCW1pbmltdW1TY2FsZS5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRNaW5pbXVtICgpKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0U2VsZWN0aW9uIChwcm9ncmVzc0JhcjEuZ2V0U2VsZWN0aW9uICgpKTsKLQkJbWF4aW11bVNjYWxlLnNldFNlbGVjdGlvbiAocHJvZ3Jlc3NCYXIxLmdldE1heGltdW0gKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1JhbmdlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NWQ0ZDE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1JhbmdlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1hYnN0cmFjdCBjbGFzcyBSYW5nZVRhYiBleHRlbmRzIFRhYiB7Ci0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbjsKLQlib29sZWFuIG9yaWVudGF0aW9uQnV0dG9ucyA9IHRydWU7Ci0KLQkvKiBTY2FsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlTY2FsZSBtaW5pbXVtU2NhbGUsIHNlbGVjdGlvblNjYWxlLCBtYXhpbXVtU2NhbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JUmFuZ2VUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENyZWF0ZSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY3JlYXRlTWluaW11bUdyb3VwICgpOwotCQljcmVhdGVNYXhpbXVtR3JvdXAgKCk7Ci0JCWNyZWF0ZVNlbGVjdGlvbkdyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIG1heGltdW0KLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlTWF4aW11bUdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIG1heGltdW1Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1heGltdW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbWF4aW11bUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNYXhpbXVtIikpOwotCQltYXhpbXVtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIGEgc2NhbGUgd2lkZ2V0ICovCi0JCW1heGltdW1TY2FsZSA9IG5ldyBTY2FsZSAobWF4aW11bUdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1heGltdW1TY2FsZS5zZXRNYXhpbXVtICgxMDApOwotCQltYXhpbXVtU2NhbGUuc2V0U2VsZWN0aW9uICgxMDApOwotCQltYXhpbXVtU2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQltYXhpbXVtU2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTAwOwotCQltYXhpbXVtU2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCW1heGltdW1TY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRNYXhpbXVtICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBtaW5pbXVtCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU1pbmltdW1Hcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBtaW5pbXVtR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltaW5pbXVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1pbmltdW1Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWluaW11bSIpKTsKLQkJbWluaW11bUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIHNjYWxlIHdpZGdldCAqLwotCQltaW5pbXVtU2NhbGUgPSBuZXcgU2NhbGUgKG1pbmltdW1Hcm91cCwgU1dULk5PTkUpOwotCQltaW5pbXVtU2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJbWluaW11bVNjYWxlLnNldFNlbGVjdGlvbigwKTsKLQkJbWluaW11bVNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJbWluaW11bVNjYWxlLnNldEluY3JlbWVudCAoNSk7Ci0JCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTAwOwotCQltaW5pbXVtU2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbWluaW11bVNjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRNaW5pbXVtICgpOwotCQkJfQotCQl9KTsKLQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBzZWxlY3Rpb24KLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlU2VsZWN0aW9uR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgc2VsZWN0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJc2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlbGVjdGlvbiIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgc2NhbGUgd2lkZ2V0ICovCi0JCXNlbGVjdGlvblNjYWxlID0gbmV3IFNjYWxlIChzZWxlY3Rpb25Hcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3Rpb25TY2FsZS5zZXRNYXhpbXVtICgxMDApOwotCQlzZWxlY3Rpb25TY2FsZS5zZXRTZWxlY3Rpb24gKDUwKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQlzZWxlY3Rpb25TY2FsZS5zZXRJbmNyZW1lbnQgKDUpOwotCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJc2VsZWN0aW9uU2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFNlbGVjdGlvbiAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlpZiAob3JpZW50YXRpb25CdXR0b25zKSB7Ci0JCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCX0KLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJc2V0V2lkZ2V0TWluaW11bSAoKTsKLQkJc2V0V2lkZ2V0TWF4aW11bSAoKTsKLQkJc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmIChjb250cm9scy5sZW5ndGggIT0gMCkgewotCQkJaWYgKG9yaWVudGF0aW9uQnV0dG9ucykgewotCQkJCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULkhPUklaT05UQUwpICE9IDApOwotCQkJCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbnRyb2xzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCQl9Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaEZvcm1UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hGb3JtVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTMzYmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaEZvcm1UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFNhc2hGb3JtVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUdyb3VwIHNhc2hGb3JtR3JvdXA7Ci0JU2FzaEZvcm0gZm9ybTsKLQlMaXN0IGxpc3QxLCBsaXN0MjsKLQlUZXh0IHRleHQ7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc21vb3RoQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTAgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzciKX07IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICAKLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhMSA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzAiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8yIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV81IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpfTsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2FzaEZvcm1UYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc2FzaGZvcm0gd2lkZ2V0ICovCi0JCXNhc2hGb3JtR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzYXNoRm9ybUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzYXNoRm9ybUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlzYXNoRm9ybUdyb3VwLnNldFRleHQgKCJTYXNoRm9ybSIpOwotCX0KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHNtb290aEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlmb3JtID0gbmV3IFNhc2hGb3JtIChzYXNoRm9ybUdyb3VwLCBzdHlsZSk7Ci0JCWxpc3QxID0gbmV3IExpc3QgKGZvcm0sIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGEwKTsKLQkJbGlzdDIgPSBuZXcgTGlzdCAoZm9ybSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QyLnNldEl0ZW1zIChMaXN0RGF0YTEpOwotCQl0ZXh0ID0gbmV3IFRleHQgKGZvcm0sIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNdWx0aV9saW5lIikpOyAvLyROT04tTkxTLTEkCi0JCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezEsIDEsIDF9KTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNtb290aEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNtb290aEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNNT09USCIpOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtmb3JtfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaEZvcm0iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGZvcm0uZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdlOGY0OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTYXNoVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVNhc2ggaFNhc2gsIHZTYXNoOwotCUNvbXBvc2l0ZSBzYXNoQ29tcDsKLQlHcm91cCBzYXNoR3JvdXA7Ci0JTGlzdCBsaXN0MSwgbGlzdDIsIGxpc3QzOwotCVRleHQgdGV4dDsKLQlCdXR0b24gc21vb3RoQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTAgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF84Iil9OwotCQkJCQkJCQkgIAotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qIENvbnN0YW50cyAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU0FTSF9XSURUSCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBTQVNIX0xJTUlUID0gMjA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2FzaFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNhc2ggd2lkZ2V0cyAqLwotCQlzYXNoR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlzYXNoR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNhc2hHcm91cC5zZXRUZXh0ICgiU2FzaCIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlIHBhZ2UuICBUaGlzIGV4YW1wbGUgZG9lcyBub3QgdXNlIGxheW91dHMuCi0JCSAqLwotCQlzYXNoQ29tcCA9IG5ldyBDb21wb3NpdGUoc2FzaEdyb3VwLCBTV1QuQk9SREVSKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBsaXN0IGFuZCB0ZXh0IHdpZGdldHMgKi8KLQkJbGlzdDEgPSBuZXcgTGlzdCAoc2FzaENvbXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGEwKTsKLQkJbGlzdDIgPSBuZXcgTGlzdCAoc2FzaENvbXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Mi5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQkJdGV4dCA9IG5ldyBUZXh0IChzYXNoQ29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpX2xpbmUiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgc2FzaGVzICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc21vb3RoQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCQl2U2FzaCA9IG5ldyBTYXNoIChzYXNoQ29tcCwgU1dULlZFUlRJQ0FMIHwgc3R5bGUpOwotCQloU2FzaCA9IG5ldyBTYXNoIChzYXNoQ29tcCwgU1dULkhPUklaT05UQUwgfCBzdHlsZSk7Ci0JCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQloU2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB2U2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZXZlbnQueSA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueSwgU0FTSF9MSU1JVCksIHJlY3QuaGVpZ2h0IC0gU0FTSF9MSU1JVCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQloU2FzaC5zZXRCb3VuZHMgKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlsYXlvdXQgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdlNhc2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gdlNhc2guZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWV2ZW50LnggPSBNYXRoLm1pbiAoTWF0aC5tYXggKGV2ZW50LngsIFNBU0hfTElNSVQpLCByZWN0LndpZHRoIC0gU0FTSF9MSU1JVCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQl2U2FzaC5zZXRCb3VuZHMgKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlsYXlvdXQgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2FzaENvbXAuYWRkQ29udHJvbExpc3RlbmVyIChuZXcgQ29udHJvbEFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQgKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCXJlc2l6ZWQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCQotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsJCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNtb290aEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNtb290aEJ1dHRvbi5zZXRUZXh0KCJTV1QuU01PT1RIIik7Ci0JfQotCQotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJc2FzaENvbXAuZGlzcG9zZSgpOwotCQlzYXNoQ29tcCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtoU2FzaCwgdlNhc2h9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaCI7Ci0JfQotCQotCS8qKgotCSAqIExheW91dCB0aGUgbGlzdCBhbmQgdGV4dCB3aWRnZXRzIGFjY29yZGluZyB0byB0aGUgbmV3Ci0JICogcG9zaXRpb25zIG9mIHRoZSBzYXNoZXMuLmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgbGF5b3V0ICgpIHsKLQkJCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJUmVjdGFuZ2xlIGhTYXNoQm91bmRzID0gaFNhc2guZ2V0Qm91bmRzICgpOwotCQlSZWN0YW5nbGUgdlNhc2hCb3VuZHMgPSB2U2FzaC5nZXRCb3VuZHMgKCk7Ci0JCQotCQlsaXN0MS5zZXRCb3VuZHMgKDAsIDAsIHZTYXNoQm91bmRzLngsIGhTYXNoQm91bmRzLnkpOwotCQlsaXN0Mi5zZXRCb3VuZHMgKHZTYXNoQm91bmRzLnggKyB2U2FzaEJvdW5kcy53aWR0aCwgMCwgY2xpZW50QXJlYS53aWR0aCAtICh2U2FzaEJvdW5kcy54ICsgdlNhc2hCb3VuZHMud2lkdGgpLCBoU2FzaEJvdW5kcy55KTsKLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQpKTsKLQkKLQkJLyoqCi0JCSogSWYgdGhlIGhvcml6b250YWwgc2FzaCBoYXMgYmVlbiBtb3ZlZCB0aGVuIHRoZSB2ZXJ0aWNhbAotCQkqIHNhc2ggaXMgZWl0aGVyIHRvbyBsb25nIG9yIHRvbyBzaG9ydCBhbmQgaXRzIHNpemUgbXVzdAotCQkqIGJlIGFkanVzdGVkLgotCQkqLwotCQl2U2FzaEJvdW5kcy5oZWlnaHQgPSBoU2FzaEJvdW5kcy55OwotCQl2U2FzaC5zZXRCb3VuZHMgKHZTYXNoQm91bmRzKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKSB7Ci0JCXNhc2hHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChoU2FzaC5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNoZWxsIHJlc2l6ZWQgZXZlbnQuCi0JICovCi0Jdm9pZCByZXNpemVkICgpIHsKLQkKLQkJLyogR2V0IHRoZSBjbGllbnQgYXJlYSBmb3IgdGhlIHNoZWxsICovCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCi0JCS8qCi0JCSogTWFrZSBsaXN0IDEgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAxIGluIHRoZSB0b3AgbGVmdCBxdWFkcmFudCBvZiB0aGUgdGFiLgotCQkqLwotCQlSZWN0YW5nbGUgbGlzdDFCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlICgwLCAwLCAoY2xpZW50QXJlYS53aWR0aCAtIFNBU0hfV0lEVEgpIC8gMiwgKGNsaWVudEFyZWEuaGVpZ2h0IC0gU0FTSF9XSURUSCkgLyAyKTsKLQkJbGlzdDEuc2V0Qm91bmRzIChsaXN0MUJvdW5kcyk7Ci0JCi0JCS8qCi0JCSogTWFrZSBsaXN0IDIgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAyIGluIHRoZSB0b3AgcmlnaHQgcXVhZHJhbnQgb2YgdGhlIHRhYi4KLQkJKi8KLQkJbGlzdDIuc2V0Qm91bmRzIChsaXN0MUJvdW5kcy53aWR0aCArIFNBU0hfV0lEVEgsIDAsIGNsaWVudEFyZWEud2lkdGggLSAobGlzdDFCb3VuZHMud2lkdGggKyBTQVNIX1dJRFRIKSwgbGlzdDFCb3VuZHMuaGVpZ2h0KTsKLQkKLQkJLyoKLQkJKiBNYWtlIHRoZSB0ZXh0IGFyZWEgdGhlIGZ1bGwgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgdGhlIHRleHQgYXJlYSBpbiB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHRhYi4KLQkJKi8KLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgpKTsKLQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2hlcyAqLwotCQl2U2FzaC5zZXRCb3VuZHMgKGxpc3QxQm91bmRzLndpZHRoLCAwLCBTQVNIX1dJRFRILCBsaXN0MUJvdW5kcy5oZWlnaHQpOwotCQloU2FzaC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCwgY2xpZW50QXJlYS53aWR0aCwgU0FTSF9XSURUSCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWJlYzQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Njcm9sbGFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWFic3RyYWN0IGNsYXNzIFNjcm9sbGFibGVUYWIgZXh0ZW5kcyBUYWIgewotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8JCi0JQnV0dG9uIHNpbmdsZUJ1dHRvbiwgbXVsdGlCdXR0b24sIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBib3JkZXJCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2Nyb2xsYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2luZ2xlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2luZ2xlQnV0dG9uLnNldFRleHQgKCJTV1QuU0lOR0xFIik7Ci0JCW11bHRpQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbXVsdGlCdXR0b24uc2V0VGV4dCAoIlNXVC5NVUxUSSIpOwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhfU0NST0xMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmIChjb250cm9scy5sZW5ndGggIT0gMCl7Ci0JCQlzaW5nbGVCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULlNJTkdMRSkgIT0gMCk7Ci0JCQltdWx0aUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuSF9TQ1JPTEwpICE9IDApOwotCQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29udHJvbHMgWzBdLmdldFN0eWxlICgpICYgU1dULlZfU0NST0xMKSAhPSAwKTsKLQkJCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb250cm9scyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NoZWxsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TaGVsbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGY1ZGRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NoZWxsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTaGVsbFRhYiBleHRlbmRzIFRhYiB7CQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXBzLCBhbmQgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBub1BhcmVudEJ1dHRvbiwgcGFyZW50QnV0dG9uOwotCUJ1dHRvbiBub1RyaW1CdXR0b24sIGNsb3NlQnV0dG9uLCB0aXRsZUJ1dHRvbiwgbWluQnV0dG9uLCBtYXhCdXR0b24sIGJvcmRlckJ1dHRvbiwgcmVzaXplQnV0dG9uLCBvblRvcEJ1dHRvbiwgdG9vbEJ1dHRvbjsKLQlCdXR0b24gY3JlYXRlQnV0dG9uLCBjbG9zZUFsbEJ1dHRvbjsKLQlCdXR0b24gbW9kZWxlc3NCdXR0b24sIHByaW1hcnlNb2RhbEJ1dHRvbiwgYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiwgc3lzdGVtTW9kYWxCdXR0b247Ci0JQnV0dG9uIGltYWdlQnV0dG9uOwotCUdyb3VwIHBhcmVudFN0eWxlR3JvdXAsIG1vZGFsU3R5bGVHcm91cDsKLQotCS8qIFZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIHRoZSBvcGVuIHNoZWxscyAqLwotCWludCBzaGVsbENvdW50ID0gMDsKLQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGwgWzRdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTaGVsbFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgYWxsIHRoZSBleGFtcGxlIHNoZWxscy4KLQkgKi8KLQl2b2lkIGNsb3NlQWxsU2hlbGxzKCkgewotCQlmb3IgKGludCBpID0gMDsgaTxzaGVsbENvdW50OyBpKyspIHsKLQkJCWlmIChzaGVsbHNbaV0gIT0gbnVsbCAmICFzaGVsbHMgW2ldLmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlzaGVsbHMgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlzaGVsbENvdW50ID0gMDsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRoZSBDcmVhdGUgYnV0dG9uIHNlbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBldmVudCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyoKLQkJICogUmVtZW1iZXIgdGhlIGV4YW1wbGUgc2hlbGxzIHNvIHRoZXkKLQkJICogY2FuIGJlIGRpc3Bvc2VkIGJ5IHRoZSB1c2VyLgotCQkgKi8KLQkJaWYgKHNoZWxsQ291bnQgPj0gc2hlbGxzLmxlbmd0aCkgewotCQkJU2hlbGwgW10gbmV3U2hlbGxzID0gbmV3IFNoZWxsIFtzaGVsbHMubGVuZ3RoICsgNF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5IChzaGVsbHMsIDAsIG5ld1NoZWxscywgMCwgc2hlbGxzLmxlbmd0aCk7Ci0JCQlzaGVsbHMgPSBuZXdTaGVsbHM7Ci0JCX0KLQkKLQkJLyogQ29tcHV0ZSB0aGUgc2hlbGwgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gU1dULk5PTkU7Ci0JCWlmIChub1RyaW1CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5OT19UUklNOwotCQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DTE9TRTsKLQkJaWYgKHRpdGxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVElUTEU7Ci0JCWlmIChtaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NSU47Ci0JCWlmIChtYXhCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NQVg7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChyZXNpemVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SRVNJWkU7Ci0JCWlmIChvblRvcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk9OX1RPUDsKLQkJaWYgKHRvb2xCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5UT09MOwotCQlpZiAobW9kZWxlc3NCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NT0RFTEVTUzsKLQkJaWYgKHByaW1hcnlNb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlBSSU1BUllfTU9EQUw7Ci0JCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQVBQTElDQVRJT05fTU9EQUw7Ci0JCWlmIChzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlNZU1RFTV9NT0RBTDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzaGVsbCB3aXRoIG9yIHdpdGhvdXQgYSBwYXJlbnQgKi8KLQkJaWYgKG5vUGFyZW50QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc2hlbGxzIFtzaGVsbENvdW50XSA9IG5ldyBTaGVsbCAoc3R5bGUpOwotCQl9IGVsc2UgewotCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJc2hlbGxzIFtzaGVsbENvdW50XSA9IG5ldyBTaGVsbCAoc2hlbGwsIHN0eWxlKTsKLQkJfQotCQlmaW5hbCBTaGVsbCBjdXJyZW50U2hlbGwgPSBzaGVsbHMgW3NoZWxsQ291bnRdOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjdXJyZW50U2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEJvdW5kcygyMCwgMjAsIDEyMCwgMzApOwotCQlCdXR0b24gY2xvc2VCdXR0b24gPSBuZXcgQnV0dG9uKGN1cnJlbnRTaGVsbCwgU1dULlBVU0gpOwotCQljbG9zZUJ1dHRvbi5zZXRCb3VuZHMoMTYwLCAyMCwgMTIwLCAzMCk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlIikpOwotCQljbG9zZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWN1cnJlbnRTaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIHNpemUsIHRpdGxlLCBhbmQgaW1hZ2UsIGFuZCBvcGVuIHRoZSBzaGVsbCAqLwotCQljdXJyZW50U2hlbGwuc2V0U2l6ZSAoMzAwLCAxMDApOwotCQljdXJyZW50U2hlbGwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikgKyBzaGVsbENvdW50KTsKLQkJaWYgKGltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBjdXJyZW50U2hlbGwuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWhvb2tMaXN0ZW5lcnMgKGN1cnJlbnRTaGVsbCk7Ci0JCWN1cnJlbnRTaGVsbC5vcGVuICgpOwotCQlzaGVsbENvdW50Kys7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBJdCBjb25zaXN0cyBvZiB0aGUKLQkJICogc3R5bGUgZ3JvdXAsIHRoZSAnb3RoZXInIGdyb3VwIGFuZCB0aGUgc2l6ZSBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGRlY29yYXRpb24gc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMykpOwotCQlzdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWNvcmF0aW9uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtb2RhbCBzdHlsZSBjb250cm9scyAqLwotCQltb2RhbFN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vZGFsX1N0eWxlcyIpKTsJCQotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgJ290aGVyJyBjb250cm9scyAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwYXJlbnQgc3R5bGUgY29udHJvbHMgKi8KLQkJcGFyZW50U3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlwYXJlbnRTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJlbnQiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgcGFyZW50IHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9QYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlub1BhcmVudEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fUGFyZW50IikpOwotCQlwYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwYXJlbnRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmVudCIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBkZWNvcmF0aW9uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9UcmltQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9UcmltQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fVFJJTSIpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0xPU0UiKTsKLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlRJVExFIik7Ci0JCW1pbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1pbkJ1dHRvbi5zZXRUZXh0ICgiU1dULk1JTiIpOwotCQltYXhCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXhCdXR0b24uc2V0VGV4dCAoIlNXVC5NQVgiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCXJlc2l6ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFU0laRSIpOwotCQlvblRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW9uVG9wQnV0dG9uLnNldFRleHQgKCJTV1QuT05fVE9QIik7Ci0JCXRvb2xCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0b29sQnV0dG9uLnNldFRleHQgKCJTV1QuVE9PTCIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbW9kZWxlc3NCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW1vZGVsZXNzQnV0dG9uLnNldFRleHQgKCJTV1QuTU9ERUxFU1MiKTsKLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAnb3RoZXInIGJ1dHRvbnMgKi8KLQkJaW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKSk7Ci0KLQkJLyogQ3JlYXRlIHRoZSAiY3JlYXRlIiBhbmQgImNsb3NlQWxsIiBidXR0b25zICovCi0JCWNyZWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQljcmVhdGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNyZWF0ZV9TaGVsbCIpKTsKLQkJY2xvc2VBbGxCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlX0FsbF9TaGVsbHMiKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJY2xvc2VBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2xvc2VBbGxTaGVsbHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZGVjb3JhdGlvbkJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJbm9UcmltQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCW1pbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJbWF4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlib3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCXJlc2l6ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlub1BhcmVudEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQltb2RlbGVzc0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYSBkZWNvcmF0aW9uIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRpb25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKiBNYWtlIHN1cmUgaWYgdGhlIG1vZGFsIHN0eWxlIGlzIFNXVC5BUFBMSUNBVElPTl9NT0RBTCBvciAKLQkJICogU1dULlNZU1RFTV9NT0RBTCB0aGUgc3R5bGUgU1dULkNMT1NFIGlzIGFsc28gc2VsZWN0ZWQuCi0JCSAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGNhbiBjbG9zZSB0aGUgc2hlbGwuCi0JCSAqLwotCQlCdXR0b24gd2lkZ2V0ID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQlpZiAod2lkZ2V0ID09IGFwcGxpY2F0aW9uTW9kYWxCdXR0b24gfHwgd2lkZ2V0ID09IHN5c3RlbU1vZGFsQnV0dG9uKSB7Ci0JCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCQlub1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl9IAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh3aWRnZXQgPT0gY2xvc2VCdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCX0KLQkJfQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIGlmIHRoZSBObyBUcmltIGJ1dHRvbiBpcyBzZWxlY3RlZCB0aGVuCi0JCSAqIGFsbCBvdGhlciBkZWNvcmF0aW9uIGJ1dHRvbnMgYXJlIGRlc2VsZWN0ZWQuCi0JCSAqLwotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCAhPSBub1RyaW1CdXR0b24pIHsKLQkJCW5vVHJpbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCA9PSBub1RyaW1CdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJbm9UcmltQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJdGl0bGVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQltaW5CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQltYXhCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXNpemVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2hlbGwiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2xpZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZTllN2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2xpZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTbGlkZXJUYWIgZXh0ZW5kcyBSYW5nZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlTY2FsZSBzY2FsZTE7Ci0JU2xpZGVyIHNsaWRlcjE7Ci0JR3JvdXAgc2xpZGVyR3JvdXAsIHNjYWxlR3JvdXA7Ci0KLQkvKiBTY2FsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlTY2FsZSBpbmNyZW1lbnRTY2FsZSwgcGFnZUluY3JlbWVudFNjYWxlLCB0aHVtYlNjYWxlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTbGlkZXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQljcmVhdGVUaHVtYkdyb3VwICgpOwotCQljcmVhdGVJbmNyZW1lbnRHcm91cCAoKTsKLQkJY3JlYXRlUGFnZUluY3JlbWVudEdyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNsaWRlciAqLwotCQlzbGlkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNsaWRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzbGlkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJc2xpZGVyR3JvdXAuc2V0VGV4dCAoIlNsaWRlciIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNjYWxlICovCi0JCXNjYWxlR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzY2FsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzY2FsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlzY2FsZUdyb3VwLnNldFRleHQgKCJTY2FsZSIpOwotCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc2NhbGUxID0gbmV3IFNjYWxlIChzY2FsZUdyb3VwLCBzdHlsZSk7Ci0JCXNjYWxlMS5zZXRNYXhpbXVtICgxMDApOwotCQlzY2FsZTEuc2V0U2VsZWN0aW9uICg1MCk7Ci0JCXNjYWxlMS5zZXRJbmNyZW1lbnQgKDUpOwotCQlzY2FsZTEuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQlzbGlkZXIxID0gbmV3IFNsaWRlcihzbGlkZXJHcm91cCwgc3R5bGUpOwotCQlzbGlkZXIxLnNldE1heGltdW0gKDEwMCk7Ci0JCXNsaWRlcjEuc2V0U2VsZWN0aW9uICg1MCk7Ci0JCXNsaWRlcjEuc2V0SW5jcmVtZW50KDUpOwotCQlzbGlkZXIxLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJc2xpZGVyMS5zZXRUaHVtYiAoMTApOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBpbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5jcmVtZW50IikpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQlpbmNyZW1lbnRTY2FsZSA9IG5ldyBTY2FsZSAoaW5jcmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJaW5jcmVtZW50U2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJaW5jcmVtZW50U2NhbGUuc2V0U2VsZWN0aW9uICg1KTsKLQkJaW5jcmVtZW50U2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQlpbmNyZW1lbnRTY2FsZS5zZXRJbmNyZW1lbnQgKDUpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTAwOwotCQlpbmNyZW1lbnRTY2FsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJaW5jcmVtZW50U2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHBhZ2UgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBwYWdlSW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFnZV9JbmNyZW1lbnQiKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCi0JCS8qIENyZWF0ZSB0aGUgc2NhbGUgd2lkZ2V0ICovCi0JCXBhZ2VJbmNyZW1lbnRTY2FsZSA9IG5ldyBTY2FsZSAocGFnZUluY3JlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5zZXRNYXhpbXVtICgxMDApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0U2VsZWN0aW9uICgxMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5zZXRQYWdlSW5jcmVtZW50ICgxMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5zZXRJbmNyZW1lbnQgKDUpOwotCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJcGFnZUluY3JlbWVudFNjYWxlLnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgdGh1bWIKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlVGh1bWJHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCB0aHVtYkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdGh1bWJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGh1bWJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGh1bWIiKSk7Ci0JCXRodW1iR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgc2NhbGUgd2lkZ2V0ICovCi0JCXRodW1iU2NhbGUgPSBuZXcgU2NhbGUgKHRodW1iR3JvdXAsIFNXVC5OT05FKTsKLQkJdGh1bWJTY2FsZS5zZXRNYXhpbXVtICgxMDApOwotCQl0aHVtYlNjYWxlLnNldFNlbGVjdGlvbiAoMTApOwotCQl0aHVtYlNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJdGh1bWJTY2FsZS5zZXRJbmNyZW1lbnQgKDUpOwotCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJdGh1bWJTY2FsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQl0aHVtYlNjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRUaHVtYiAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7c2NhbGUxLCBzbGlkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJjYXJib24iKSkgcmV0dXJuICJTL1MiOwotCQlyZXR1cm4gIlNsaWRlci9TY2FsZSI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQlzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpOwotCQlzZXRXaWRnZXRUaHVtYiAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldEluY3JlbWVudCAoKSB7Ci0JCXNsaWRlcjEuc2V0SW5jcmVtZW50IChpbmNyZW1lbnRTY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQlzY2FsZTEuc2V0SW5jcmVtZW50IChpbmNyZW1lbnRTY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzbGlkZXIxLnNldE1heGltdW0gKG1heGltdW1TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQlzY2FsZTEuc2V0TWF4aW11bSAobWF4aW11bVNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXNsaWRlcjEuc2V0TWluaW11bSAobWluaW11bVNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNjYWxlMS5zZXRNaW5pbXVtIChtaW5pbXVtU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcGFnZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKSB7Ci0JCXNsaWRlcjEuc2V0UGFnZUluY3JlbWVudCAocGFnZUluY3JlbWVudFNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNjYWxlMS5zZXRQYWdlSW5jcmVtZW50IChwYWdlSW5jcmVtZW50U2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNsaWRlcjEuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCQlzY2FsZTEuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25TY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0aHVtYiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRUaHVtYiAoKSB7Ci0JCXNsaWRlcjEuc2V0VGh1bWIgKHRodW1iU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TcGlubmVyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TcGlubmVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OWJlNjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3Bpbm5lclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgU3Bpbm5lclRhYiBleHRlbmRzIFJhbmdlVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU3Bpbm5lciBzcGlubmVyMTsKLQlHcm91cCBzcGlubmVyR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiByZWFkT25seUJ1dHRvbiwgd3JhcEJ1dHRvbjsKLQkKLQkvKiBTY2FsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlTY2FsZSBpbmNyZW1lbnRTY2FsZSwgcGFnZUluY3JlbWVudFNjYWxlLCBkaWdpdHNTY2FsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTcGlubmVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCWNyZWF0ZUluY3JlbWVudEdyb3VwICgpOwotCQljcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZURpZ2l0c0dyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNwaW5uZXIgKi8KLQkJc3Bpbm5lckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc3Bpbm5lckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzcGlubmVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXNwaW5uZXJHcm91cC5zZXRUZXh0ICgiU3Bpbm5lciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULldSQVA7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlzcGlubmVyMSA9IG5ldyBTcGlubmVyIChzcGlubmVyR3JvdXAsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBtYXhpbXVtCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU1heGltdW1Hcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlTWF4aW11bUdyb3VwKCk7Ci0JCW1heGltdW1TY2FsZS5zZXRNYXhpbXVtICgxMDAwKTsKLQkJbWF4aW11bVNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgc2VsZWN0aW9uCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNlbGVjdGlvbkdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTZWxlY3Rpb25Hcm91cCgpOwotCQlzZWxlY3Rpb25TY2FsZS5zZXRNYXhpbXVtICgxMDAwKTsKLQkJc2VsZWN0aW9uU2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgaW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluY3JlbWVudCIpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzY2FsZSB3aWRnZXQgKi8KLQkJaW5jcmVtZW50U2NhbGUgPSBuZXcgU2NhbGUgKGluY3JlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudFNjYWxlLnNldE1heGltdW0gKDEwMCk7Ci0JCWluY3JlbWVudFNjYWxlLnNldFNlbGVjdGlvbiAoMSk7Ci0JCWluY3JlbWVudFNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJaW5jcmVtZW50U2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJaW5jcmVtZW50U2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWluY3JlbWVudFNjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQlwYWdlSW5jcmVtZW50U2NhbGUgPSBuZXcgU2NhbGUgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0TWF4aW11bSAoMTAwKTsKLQkJcGFnZUluY3JlbWVudFNjYWxlLnNldFNlbGVjdGlvbiAoMTApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0UGFnZUluY3JlbWVudCAoMTApOwotCQlwYWdlSW5jcmVtZW50U2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCXBhZ2VJbmNyZW1lbnRTY2FsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlwYWdlSW5jcmVtZW50U2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGRpZ2l0cwotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVEaWdpdHNHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBkaWdpdHNHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRpZ2l0c0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlkaWdpdHNHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlnaXRzIikpOwotCQlkaWdpdHNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIHNjYWxlIHdpZGdldCAqLwotCQlkaWdpdHNTY2FsZSA9IG5ldyBTY2FsZSAoZGlnaXRzR3JvdXAsIFNXVC5OT05FKTsKLQkJZGlnaXRzU2NhbGUuc2V0TWF4aW11bSAoOCk7Ci0JCWRpZ2l0c1NjYWxlLnNldFNlbGVjdGlvbiAoMCk7Ci0JCWRpZ2l0c1NjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDEwKTsKLQkJZGlnaXRzU2NhbGUuc2V0SW5jcmVtZW50ICg1KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJZGlnaXRzU2NhbGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWRpZ2l0c1NjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0RGlnaXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCW9yaWVudGF0aW9uQnV0dG9ucyA9IGZhbHNlOwotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtzcGlubmVyMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTcGlubmVyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzcGlubmVyMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKHNwaW5uZXIxLmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCXNldFdpZGdldERpZ2l0cyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc3Bpbm5lcjEuc2V0SW5jcmVtZW50IChpbmNyZW1lbnRTY2FsZS5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzcGlubmVyMS5zZXRNYXhpbXVtIChtYXhpbXVtU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpIHsKLQkJc3Bpbm5lcjEuc2V0TWluaW11bSAobWluaW11bVNjYWxlLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzcGlubmVyMS5zZXRQYWdlSW5jcmVtZW50IChwYWdlSW5jcmVtZW50U2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlnaXRzIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldERpZ2l0cyAoKSB7Ci0JCXNwaW5uZXIxLnNldERpZ2l0cyAoZGlnaXRzU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNwaW5uZXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU2NhbGUuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3R5bGVkVGV4dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3R5bGVkVGV4dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg0OGZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1N0eWxlZFRleHRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotY2xhc3MgU3R5bGVkVGV4dFRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCUdyb3VwIHN0eWxlZFRleHRHcm91cCwgc3R5bGVkVGV4dFN0eWxlR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHdyYXBCdXR0b24sIHJlYWRPbmx5QnV0dG9uLCBmdWxsU2VsZWN0aW9uQnV0dG9uOwotCQotCS8qIEJ1dHRvbnMgZm9yIGFkZGluZyBTdHlsZVJhbmdlcyB0byBTdHlsZWRUZXh0ICovCi0JQnV0dG9uIGJvbGRCdXR0b24sIGl0YWxpY0J1dHRvbiwgcmVkQnV0dG9uLCB5ZWxsb3dCdXR0b24sIHVuZGVybGluZUJ1dHRvbiwgc3RyaWtlb3V0QnV0dG9uOwotCUltYWdlIGJvbGRJbWFnZSwgaXRhbGljSW1hZ2UsIHJlZEltYWdlLCB5ZWxsb3dJbWFnZSwgdW5kZXJsaW5lSW1hZ2UsIHN0cmlrZW91dEltYWdlOwotCQotCS8qIFZhcmlhYmxlcyBmb3Igc2F2aW5nIHN0YXRlLiAqLwotCVN0eWxlUmFuZ2VbXSBzdHlsZVJhbmdlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTdHlsZWRUZXh0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJpdG1hcCBpbWFnZS4gCi0JICovCi0JSW1hZ2UgY3JlYXRlQml0bWFwSW1hZ2UgKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIG5hbWUpIHsKLQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gQ29udHJvbEV4YW1wbGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAobmFtZSArICIuYm1wIik7Ci0JCUlucHV0U3RyZWFtIG1hc2tTdHJlYW0gPSBDb250cm9sRXhhbXBsZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChuYW1lICsgIl9tYXNrLmJtcCIpOwotCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlU3RyZWFtKTsKLQkJSW1hZ2VEYXRhIG1hc2sgPSBuZXcgSW1hZ2VEYXRhIChtYXNrU3RyZWFtKTsKLQkJSW1hZ2UgcmVzdWx0ID0gbmV3IEltYWdlIChkaXNwbGF5LCBzb3VyY2UsIG1hc2spOwotCQl0cnkgewotCQkJc291cmNlU3RyZWFtLmNsb3NlICgpOwotCQkJbWFza1N0cmVhbS5jbG9zZSAoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCQotCQkvKiBBZGQgYSBncm91cCBmb3IgbW9kaWZ5aW5nIHRoZSBTdHlsZWRUZXh0IHdpZGdldCAqLwotCQljcmVhdGVTdHlsZWRUZXh0U3R5bGVHcm91cCAoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHN0eWxlZCB0ZXh0IHdpZGdldCAqLwotCQlzdHlsZWRUZXh0R3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzdHlsZWRUZXh0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlZFRleHRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJc3R5bGVkVGV4dEdyb3VwLnNldFRleHQgKCJTdHlsZWRUZXh0Iik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTkdMRTsKLQkJaWYgKG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAod3JhcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc3R5bGVkVGV4dEdyb3VwLCBzdHlsZSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCQlzdHlsZWRUZXh0LmFwcGVuZCAoIlxuIik7Ci0JCXN0eWxlZFRleHQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lX1R3b19UaHJlZSIpKTsKLQkJCi0JCWlmIChzdHlsZVJhbmdlcyAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2VzKHN0eWxlUmFuZ2VzKTsKLQkJCXN0eWxlUmFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRUFEX09OTFkiKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5GVUxMX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGVkVGV4dCBTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZWRUZXh0U3R5bGVHcm91cCAoKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGNvbnRyb2xHcm91cC5nZXREaXNwbGF5ICgpOwotCQlzdHlsZWRUZXh0U3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9TdHlsZXMiKSk7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoNywgZmFsc2UpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQkKLQkJLyogR2V0IGltYWdlcyAqLwotCQlib2xkSW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImJvbGQiKTsKLQkJaXRhbGljSW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgIml0YWxpYyIpOwotCQlyZWRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAicmVkIik7Ci0JCXllbGxvd0ltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJ5ZWxsb3ciKTsKLQkJdW5kZXJsaW5lSW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInVuZGVybGluZSIpOwotCQlzdHJpa2VvdXRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAic3RyaWtlb3V0Iik7Ci0JCQotCQkvKiBDcmVhdGUgY29udHJvbHMgdG8gbW9kaWZ5IHRoZSBTdHlsZWRUZXh0ICovCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlN0eWxlZFRleHRfU3R5bGVfSW5zdHJ1Y3Rpb25zIikpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA3OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCb2xkIikpOwotCQlib2xkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5QVVNIKTsKLQkJYm9sZEJ1dHRvbi5zZXRJbWFnZSAoYm9sZEltYWdlKTsKLQkJbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiVW5kZXJsaW5lIikpOwotCQl1bmRlcmxpbmVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQl1bmRlcmxpbmVCdXR0b24uc2V0SW1hZ2UgKHVuZGVybGluZUltYWdlKTsKLQkJbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJGb3JlZ3JvdW5kX1N0eWxlIikpOwotCQlyZWRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlyZWRCdXR0b24uc2V0SW1hZ2UgKHJlZEltYWdlKTsKLQkJbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRhbGljIikpOwotCQlpdGFsaWNCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlpdGFsaWNCdXR0b24uc2V0SW1hZ2UgKGl0YWxpY0ltYWdlKTsKLQkJbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3RyaWtlb3V0IikpOwotCQlzdHJpa2VvdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlzdHJpa2VvdXRCdXR0b24uc2V0SW1hZ2UgKHN0cmlrZW91dEltYWdlKTsKLQkJbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX1N0eWxlIikpOwotCQl5ZWxsb3dCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQl5ZWxsb3dCdXR0b24uc2V0SW1hZ2UgKHllbGxvd0ltYWdlKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc3R5bGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2VsID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQkJCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCQkJZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJCQkJU3R5bGVSYW5nZSByYW5nZSA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoaSwgMSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGUud2lkZ2V0ID09IGJvbGRCdXR0b24pIHsKLQkJCQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuQk9MRDsKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBpdGFsaWNCdXR0b24pIHsKLQkJCQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuSVRBTElDOwkJCQkJCQotCQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHVuZGVybGluZUJ1dHRvbikgewotCQkJCQkJc3R5bGUudW5kZXJsaW5lID0gIXN0eWxlLnVuZGVybGluZTsKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBzdHJpa2VvdXRCdXR0b24pIHsKLQkJCQkJCXN0eWxlLnN0cmlrZW91dCA9ICFzdHlsZS5zdHJpa2VvdXQ7Ci0JCQkJCX0KLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsJCQkKLQkJCX0KLQkJfTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgY29sb3JMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2VsID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQkJCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCQkJCUNvbG9yIGZnID0gbnVsbCwgYmcgPSBudWxsOwotCQkJCWlmIChlLndpZGdldCA9PSByZWRCdXR0b24pIHsKLQkJCQkJZmcgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHllbGxvd0J1dHRvbikgewotCQkJCQliZyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQkJCX0KLQkJCQlTdHlsZVJhbmdlIHN0eWxlOwotCQkJCWZvciAoaW50IGkgPSBzZWwueDsgaTxzZWwueCtzZWwueTsgaSsrKSB7Ci0JCQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQkJCQlzdHlsZS5mb3JlZ3JvdW5kID0gc3R5bGUuZm9yZWdyb3VuZCAhPSBudWxsID8gbnVsbCA6IGZnOwotCQkJCQkJc3R5bGUuYmFja2dyb3VuZCA9IHN0eWxlLmJhY2tncm91bmQgIT0gbnVsbCA/IG51bGwgOiBiZzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKGksIDEsIGZnLCBiZywgU1dULk5PUk1BTCk7Ci0JCQkJCX0KLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLQkJCX0KLQkJfTsKLQkJYm9sZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJaXRhbGljQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHN0eWxlTGlzdGVuZXIpOwotCQl1bmRlcmxpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc3R5bGVMaXN0ZW5lcik7Ci0JCXN0cmlrZW91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJcmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbG9yTGlzdGVuZXIpOwotCQl5ZWxsb3dCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29sb3JMaXN0ZW5lcik7Ci0JCXllbGxvd0J1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCAoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlib2xkSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWl0YWxpY0ltYWdlLmRpc3Bvc2UoKTsKLQkJCQlyZWRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJeWVsbG93SW1hZ2UuZGlzcG9zZSgpOwotCQkJCXVuZGVybGluZUltYWdlLmRpc3Bvc2UoKTsKLQkJCQlzdHJpa2VvdXRJbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgc3R5bGVkVGV4dCBpZiBhcHBsaWNhYmxlICovCi0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlUmFuZ2VzID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cygpOwkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCUNvbnRyb2wgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2wgW10ge3N0eWxlZFRleHR9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkNhcmV0T2Zmc2V0IiwgIkRvdWJsZUNsaWNrRW5hYmxlZCIsICJFZGl0YWJsZSIsICJIb3Jpem9udGFsSW5kZXgiLCAiSG9yaXpvbnRhbFBpeGVsIiwgIk9yaWVudGF0aW9uIiwgIlNlbGVjdGlvbiIsICJUYWJzIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4IiwgIlRvcFBpeGVsIiwgIldvcmRXcmFwIn07Ci0JfQotCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU3R5bGVkVGV4dCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0RW5hYmxlZCAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRFbmFibGVkICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JCXdyYXBCdXR0b24uc2V0RW5hYmxlZCAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5MThmNzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiA8Y29kZT5UYWI8L2NvZGU+IGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGV2ZXJ5IHBhZ2UKLSAqIGluIHRoZSBleGFtcGxlJ3MgdGFiIGZvbGRlci4gIEVhY2ggcGFnZSBpbiB0aGUgdGFiIGZvbGRlcgotICogZGVzY3JpYmVzIGEgY29udHJvbC4KLSAqCi0gKiBBIFRhYiBpdHNlbGYgaXMgbm90IGEgY29udHJvbCBidXQgaW5zdGVhZCBwcm92aWRlcyBhCi0gKiBoaWVyYXJjaHkgd2l0aCB3aGljaCB0byBzaGFyZSBjb2RlIHRoYXQgaXMgY29tbW9uIHRvCi0gKiBldmVyeSBwYWdlIGluIHRoZSBmb2xkZXIuCi0gKgotICogQSB0eXBpY2FsIHBhZ2UgaW4gYSBUYWIgY29udGFpbnMgYSB0d28gY29sdW1uIGNvbXBvc2l0ZS4KLSAqIFRoZSBsZWZ0IGNvbHVtbiBjb250YWlucyB0aGUgIkV4YW1wbGUiIGdyb3VwLiAgVGhlIHJpZ2h0Ci0gKiBjb2x1bW4gY29udGFpbnMgIkNvbnRyb2wiIGdyb3VwLiAgVGhlICJDb250cm9sIiBncm91cAotICogY29udGFpbnMgY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmFjdCB3aXRoCi0gKiB0aGUgZXhhbXBsZSBjb250cm9sLiAgVGhlICJDb250cm9sIiBncm91cCB0eXBpY2FsbHkKLSAqIGNvbnRhaW5zIGEgIlN0eWxlIiwgIk90aGVyIiBhbmQgIlNpemUiIGdyb3VwLiAgU3ViY2xhc3NlcwotICogY2FuIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzIHRvIGF1Z21lbnQgYSBncm91cCBvciBzdG9wCi0gKiBhIGdyb3VwIGZyb20gYmVpbmcgY3JlYXRlZC4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVGFiIHsKLQkvKiBDb21tb24gY29udHJvbCBidXR0b25zICovCi0JQnV0dG9uIGJvcmRlckJ1dHRvbiwgZW5hYmxlZEJ1dHRvbiwgdmlzaWJsZUJ1dHRvbjsKLQlCdXR0b24gcHJlZmVycmVkQnV0dG9uLCB0b29TbWFsbEJ1dHRvbiwgc21hbGxCdXR0b24sIGxhcmdlQnV0dG9uLCBmaWxsQnV0dG9uOwotCi0JLyogQ29tbW9uIGdyb3VwcyBhbmQgY29tcG9zaXRlcyAqLwotCUNvbXBvc2l0ZSB0YWJGb2xkZXJQYWdlOwotCUdyb3VwIGV4YW1wbGVHcm91cCwgY29udHJvbEdyb3VwLCBsaXN0ZW5lcnNHcm91cCwgb3RoZXJHcm91cCwgc2l6ZUdyb3VwLCBzdHlsZUdyb3VwLCBjb2xvckdyb3VwOwotCi0JLyogQ29udHJvbGxpbmcgaW5zdGFuY2UgKi8KLQlmaW5hbCBDb250cm9sRXhhbXBsZSBpbnN0YW5jZTsKLQotCS8qIFNpemluZyBjb25zdGFudHMgZm9yIHRoZSAiU2l6ZSIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IFRPT19TTUFMTF9TSVpFCT0gMTA7Ci0Jc3RhdGljIGZpbmFsIGludCBTTUFMTF9TSVpFCQk9IDUwOwotCXN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfU0laRQkJPSAxMDA7Ci0JCi0JLyogUmlnaHQtdG8tbGVmdCBzdXBwb3J0ICovCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gUlRMX1NVUFBPUlRfRU5BQkxFID0gZmFsc2U7Ci0JR3JvdXAgb3JpZW50YXRpb25Hcm91cDsKLQlCdXR0b24gcnRsQnV0dG9uLCBsdHJCdXR0b24sIGRlZmF1bHRPcmlldGF0aW9uQnV0dG9uOwotCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBmb3IgdGhlICJDb2xvcnMiIGdyb3VwICovCi0JQnV0dG9uIGZvcmVncm91bmRCdXR0b24sIGJhY2tncm91bmRCdXR0b24sIGZvbnRCdXR0b247Ci0JSW1hZ2UgZm9yZWdyb3VuZEltYWdlLCBiYWNrZ3JvdW5kSW1hZ2U7Ci0JQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JRm9udCBmb250OwotCi0JLyogRXZlbnQgbG9nZ2luZyB2YXJpYWJsZXMgYW5kIGNvbnRyb2xzICovCi0JVGV4dCBldmVudENvbnNvbGU7Ci0JYm9vbGVhbiBsb2dnaW5nID0gZmFsc2U7Ci0JYm9vbGVhbiBbXSBldmVudHNGaWx0ZXI7Ci0JCi0JLyogU2V0L0dldCBBUEkgY29udHJvbHMgKi8KLQlDb21ibyBuYW1lQ29tYm87Ci0JTGFiZWwgcmV0dXJuVHlwZUxhYmVsOwotCUJ1dHRvbiBnZXRCdXR0b24sIHNldEJ1dHRvbjsKLQlUZXh0IHNldFRleHQsIGdldFRleHQ7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFtdIEVWRU5UX05BTUVTID0gewotCQkiTm9uZSIsCi0JCSJLZXlEb3duIiwgIktleVVwIiwKLQkJIk1vdXNlRG93biIsICJNb3VzZVVwIiwgIk1vdXNlTW92ZSIsICJNb3VzZUVudGVyIiwgIk1vdXNlRXhpdCIsICJNb3VzZURvdWJsZUNsaWNrIiwKLQkJIlBhaW50IiwgIk1vdmUiLCAiUmVzaXplIiwgIkRpc3Bvc2UiLAotCQkiU2VsZWN0aW9uIiwgIkRlZmF1bHRTZWxlY3Rpb24iLAotCQkiRm9jdXNJbiIsICJGb2N1c091dCIsCi0JCSJFeHBhbmQiLCAiQ29sbGFwc2UiLAotCQkiSWNvbmlmeSIsICJEZWljb25pZnkiLCAiQ2xvc2UiLAotCQkiU2hvdyIsICJIaWRlIiwKLQkJIk1vZGlmeSIsICJWZXJpZnkiLAotCQkiQWN0aXZhdGUiLCAiRGVhY3RpdmF0ZSIsCi0JCSJIZWxwIiwgIkRyYWdEZXRlY3QiLCAiQXJtIiwgIlRyYXZlcnNlIiwgIk1vdXNlSG92ZXIiLAotCQkiSGFyZEtleURvd24iLCAiSGFyZEtleVVwIiwKLQkJIk1lbnVEZXRlY3QiLAotCQkiU2V0RGF0YSIsCi0JCSJNb3VzZVdoZWVsIiwKLS8vCQkiU2V0dGluZ3MiLCAgLy8gaW50ZW50aW9uYWxseSBjb21tZW50ZWQgLSBldmVudCBvbmx5IGdvZXMgdG8gRGlzcGxheQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGUgIkNvbnRyb2wiIGdyb3VwCi0JICogaXMgdHlwaWNhbGx5IHRoZSByaWdodCBoYW5kIGNvbHVtbiBpbiB0aGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGlzIGlzIHRoZSBncm91cCBvbiB0aGUKLQkJICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiAgSXQgY29uc2lzdHMgb2YgdGhlCi0JCSAqICJTdHlsZSIgZ3JvdXAsIHRoZSAiT3RoZXIiIGdyb3VwIGFuZCB0aGUgIlNpemUiIGdyb3VwLgotCQkgKi8JCi0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSkpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkKLQkJLyogQ3JlYXRlIGluZGl2aWR1YWwgZ3JvdXBzIGluc2lkZSB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JCWNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCWNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCWNyZWF0ZVNldEdldEdyb3VwKCk7Ci0JCWNyZWF0ZVNpemVHcm91cCAoKTsKLQkJY3JlYXRlQ29sb3JHcm91cCAoKTsKLQkJaWYgKFJUTF9TVVBQT1JUX0VOQUJMRSkgewotCQkJY3JlYXRlT3JpZW50YXRpb25Hcm91cCAoKTsKLQkJfQotCQotCQkvKgotCQkgKiBGb3IgZWFjaCBCdXR0b24gY2hpbGQgaW4gdGhlIHN0eWxlIGdyb3VwLCBhZGQgYSBzZWxlY3Rpb24KLQkJICogbGlzdGVuZXIgdGhhdCB3aWxsIHJlY3JlYXRlIHRoZSBleGFtcGxlIGNvbnRyb2xzLiAgSWYgdGhlCi0JCSAqIHN0eWxlIGdyb3VwIGJ1dHRvbiBpcyBhIFJBRElPIGJ1dHRvbiwgZW5zdXJlIHRoYXQgdGhlIHJhZGlvCi0JCSAqIGJ1dHRvbiBpcyBzZWxlY3RlZCBiZWZvcmUgcmVjcmVhdGluZyB0aGUgZXhhbXBsZSBjb250cm9scy4KLQkJICogV2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgUkFESU8gYnV0dG9uLCB0aGUgY3VycmVudCBSQURJTwotCQkgKiBidXR0b24gaW4gdGhlIGdyb3VwIGlzIGRlc2VsZWN0ZWQgYW5kIHRoZSBuZXcgUkFESU8gYnV0dG9uCi0JCSAqIGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkuICBUaGUgbGlzdGVuZXJzIGFyZSBub3RpZmllZCBmb3IKLQkJICogYm90aCB0aGVzZSBvcGVyYXRpb25zIGJ1dCB0eXBpY2FsbHkgb25seSBkbyB3b3JrIHdoZW4gYSBSQURJTwotCQkgKiBidXR0b24gaXMgc2VsZWN0ZWQuCi0JCSAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICgoZXZlbnQud2lkZ2V0LmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSB7Ci0JCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJfQotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX07Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzdHlsZUdyb3VwLmdldENoaWxkcmVuICgpOwotCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbiBbaV0gaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgY2hpbGRyZW4gW2ldOwotCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWlmIChSVExfU1VQUE9SVF9FTkFCTEUpIHsKLQkJCXJ0bEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOyAKLQkJCWx0ckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwkJCi0JCQlkZWZhdWx0T3JpZXRhdGlvbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFwcGVuZCB0aGUgU2V0L0dldCBBUEkgY29udHJvbHMgdG8gdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTZXRHZXRHcm91cCgpIHsKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBidXR0b24gdG8gYWNjZXNzIHNldC9nZXQgQVBJIGZ1bmN0aW9uYWxpdHkuCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgW10gbWV0aG9kTmFtZXMgPSBnZXRNZXRob2ROYW1lcyAoKTsKLQkJaWYgKG1ldGhvZE5hbWVzICE9IG51bGwpIHsKLQkJCUJ1dHRvbiBzZXRHZXRCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQlzZXRHZXRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZXRfR2V0IikpOwotCQkJc2V0R2V0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCXNldEdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQkJCVBvaW50IHB0ID0gYnV0dG9uLmdldExvY2F0aW9uKCk7Ci0JCQkJCXB0ID0gZS5kaXNwbGF5Lm1hcChidXR0b24sIG51bGwsIHB0KTsKLQkJCQkJY3JlYXRlU2V0R2V0RGlhbG9nKHB0LngsIHB0LnksIG1ldGhvZE5hbWVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50Ci0JICogdGhlIHN0YW5kYXJkIGNvbnRyb2xzIGNyZWF0ZWQgaW4gdGhlICJTdHlsZSIsCi0JICogIk90aGVyIiBhbmQgIlNpemUiIGdyb3Vwcy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbG9ycyIgZ3JvdXAuIFRoaXMgaXMgdHlwaWNhbGx5Ci0JICogYSBjaGlsZCBvZiB0aGUgIkNvbnRyb2wiIGdyb3VwLiBTdWJjbGFzc2VzIG92ZXJyaWRlCi0JICogdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIGFuZCBzZXQgc3lzdGVtIGNvbG9ycy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCWNvbG9yR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJY29sb3JHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29sb3JHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbG9ycyIpKTsKLQkJbmV3IExhYmVsIChjb2xvckdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJGb3JlZ3JvdW5kX0NvbG9yIikpOwotCQlmb3JlZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQluZXcgTGFiZWwgKGNvbG9yR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWJhY2tncm91bmRCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWZvbnRCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWZvbnRCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udCIpKTsKLQkJZm9udEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCUJ1dHRvbiBkZWZhdWx0c0J1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVmYXVsdHNCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGVmYXVsdHMiKSk7Ci0KLQkJU2hlbGwgc2hlbGwgPSBjb250cm9sR3JvdXAuZ2V0U2hlbGwgKCk7Ci0JCWZpbmFsIENvbG9yRGlhbG9nIGZvcmVncm91bmREaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZmluYWwgQ29sb3JEaWFsb2cgYmFja2dyb3VuZERpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmaW5hbCBGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwpOwotCi0JCS8qIENyZWF0ZSBpbWFnZXMgdG8gZGlzcGxheSBjdXJyZW50IGNvbG9ycyAqLwotCQlpbnQgaW1hZ2VTaXplID0gMTI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkgKCk7Ci0JCWZvcmVncm91bmRJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCQliYWNrZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlU2l6ZSwgaW1hZ2VTaXplKTsJCi0KLQkJLyogQWRkIGxpc3RlbmVycyB0byBzZXQgdGhlIGNvbG9ycyBhbmQgZm9udCAqLwotCQlmb3JlZ3JvdW5kQnV0dG9uLnNldEltYWdlKGZvcmVncm91bmRJbWFnZSk7IC8vIHNldHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbgotCQlmb3JlZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRDb2xvciA9IGNvbnRyb2xzIFswXS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJCX0KLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZERpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQlSR0IgcmdiID0gZm9yZWdyb3VuZERpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7IC8vIHNhdmUgb2xkIGZvcmVncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQlmb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQliYWNrZ3JvdW5kQnV0dG9uLnNldEltYWdlKGJhY2tncm91bmRJbWFnZSk7IC8vIHNldHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbgotCQliYWNrZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRDb2xvciA9IGNvbnRyb2xzIFswXS5nZXRCYWNrZ3JvdW5kICgpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQl9Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIGJhY2tncm91bmREaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gYmFja2dyb3VuZERpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7IC8vIHNhdmUgb2xkIGJhY2tncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQliYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlmb250QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRGb250ID0gY29udHJvbHMgWzBdLmdldEZvbnQgKCk7Ci0JCQkJfQotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIGZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGZvbnQKLQkJCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCQlpZiAoZm9udERhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZEZvbnQgPSBmb250OyAvLyBkaXNwb3NlIG9sZCBmb250IHdoZW4gZG9uZQotCQkJCWZvbnQgPSBuZXcgRm9udCAoZXZlbnQuZGlzcGxheSwgZm9udERhdGEpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb250ICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWRlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZvcmVncm91bmRJbWFnZSAhPSBudWxsKSBmb3JlZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChiYWNrZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgYmFja2dyb3VuZEltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQkJCWZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJYmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQlmb250ID0gbnVsbDsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLiAgVGhpcyBpcyB0eXBpY2FsbHkKLQkgKiBhIGNoaWxkIG9mIHRoZSAiQ29udHJvbCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCW90aGVyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk90aGVyIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWVuYWJsZWRCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZWRCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRW5hYmxlZCIpKTsKLQkJdmlzaWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdmlzaWJsZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJWaXNpYmxlIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQllbmFibGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKTsKLQkJCX0KLQkJfSk7Ci0JCXZpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpOwotCQkJfQotCQl9KTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCWVuYWJsZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2aXNpYmxlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBldmVudCBjb25zb2xlIHBvcHVwIG1lbnUuCi0JICovCi0Jdm9pZCBjcmVhdGVFdmVudENvbnNvbGVQb3B1cCAoKSB7Ci0JCU1lbnUgcG9wdXAgPSBuZXcgTWVudSAoZXZlbnRDb25zb2xlLmdldFNoZWxsICgpLCBTV1QuUE9QX1VQKTsKLQkJZXZlbnRDb25zb2xlLnNldE1lbnUgKHBvcHVwKTsKLQotCQlNZW51SXRlbSBjdXQgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWN1dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fQ3V0IikpOwotCQljdXQuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuY3V0ICgpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gY29weSA9IG5ldyBNZW51SXRlbSAocG9wdXAsIFNXVC5QVVNIKTsKLQkJY29weS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fQ29weSIpKTsKLQkJY29weS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCWV2ZW50Q29uc29sZS5jb3B5ICgpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gcGFzdGUgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCXBhc3RlLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZW51SXRlbV9QYXN0ZSIpKTsKLQkJcGFzdGUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUucGFzdGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuU0VQQVJBVE9SKTsKLQkJTWVudUl0ZW0gc2VsZWN0QWxsID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fU2VsZWN0QWxsIikpOwotCQlzZWxlY3RBbGwuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuc2VsZWN0QWxsICgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuICBUaGUgIkV4YW1wbGUiIGdyb3VwCi0JICogaXMgdHlwaWNhbGx5IHRoZSBsZWZ0IGhhbmQgY29sdW1uIGluIHRoZSB0YWIuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlleGFtcGxlR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlleGFtcGxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4gb2YgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcGFydGljdWxhcgotCSAqIGV4YW1wbGUgY29udHJvbC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogRG8gbm90aGluZyAqLwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgIkxpc3RlbmVyIHNlbGVjdGlvbiIgZGlhbG9nLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJTZWxlY3Rpb25EaWFsb2cgKCkgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9MaXN0ZW5lcnMiKSk7Ci0JCWRpYWxvZy5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoZGlhbG9nLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoRVZFTlRfTkFNRVNbaV0pOwotCQkJaXRlbS5zZXRDaGVja2VkIChldmVudHNGaWx0ZXJbaV0pOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBbXSBjdXN0b21OYW1lcyA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoY3VzdG9tTmFtZXNbaV0pOwotCQkJaXRlbS5zZXRDaGVja2VkIChldmVudHNGaWx0ZXJbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0pOwotCQl9Ci0JCUJ1dHRvbiBzZWxlY3RBbGwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3RfQWxsIikpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX05BTUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gZGVzZWxlY3RBbGwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGwuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlc2VsZWN0X0FsbCIpKTsKLQkJZGVzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWRlc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOyAvKiBGaWxsZXIgKi8KLQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCW9rLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJPSyIpKTsKLQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24ob2spOwotCQlvay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGg7IGkrKykgewotCQkJCQlldmVudHNGaWx0ZXJbaV0gPSBpdGVtc1tpXS5nZXRDaGVja2VkKCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZXZlbnRzRmlsdGVyW0VWRU5UX05BTUVTLmxlbmd0aCArIGldID0gaXRlbXNbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0uZ2V0Q2hlY2tlZCgpOwotCQkJCX0KLQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZGlhbG9nLnBhY2sgKCk7Ci0JCWRpYWxvZy5vcGVuICgpOwotCQl3aGlsZSAoISBkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaWFsb2cuZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKSBkaWFsb2cuZ2V0RGlzcGxheSgpLnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiTGlzdGVuZXJzIiBncm91cC4gIFRoZSAiTGlzdGVuZXJzIiBncm91cAotCSAqIGdvZXMgYmVsb3cgdGhlICJFeGFtcGxlIiBhbmQgIkNvbnRyb2wiIGdyb3Vwcy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxpc3RlbmVyc0dyb3VwICgpIHsKLQkJbGlzdGVuZXJzR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgZmFsc2UpKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlLCAyLCAxKSk7Ci0JCWxpc3RlbmVyc0dyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGlzdGVuZXJzIikpOwotCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgYnV0dG9uIHRvIGFjY2VzcyB0aGUgJ0xpc3RlbmVycycgZGlhbG9nLgotCQkgKi8KLQkJQnV0dG9uIGxpc3RlbmVyc0J1dHRvbiA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWxpc3RlbmVyc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9MaXN0ZW5lcnMiKSk7Ci0JCWxpc3RlbmVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUxpc3RlbmVyU2VsZWN0aW9uRGlhbG9nICgpOwotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBjaGVja2JveCB0byBhZGQvcmVtb3ZlIGxpc3RlbmVycyB0by9mcm9tIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSAqLwotCQlmaW5hbCBCdXR0b24gbGlzdGVuQ2hlY2tib3ggPSBuZXcgQnV0dG9uIChsaXN0ZW5lcnNHcm91cCwgU1dULkNIRUNLKTsKLQkJbGlzdGVuQ2hlY2tib3guc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJMaXN0ZW4iKSk7Ci0JCWxpc3RlbkNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbG9nZ2luZyA9IGxpc3RlbkNoZWNrYm94LmdldFNlbGVjdGlvbiAoKTsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0byBjbGVhciB0aGUgdGV4dC4KLQkJICovCi0JCUJ1dHRvbiBjbGVhckJ1dHRvbiA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWNsZWFyQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2xlYXIiKSk7Ci0JCWNsZWFyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXZlbnRDb25zb2xlLnNldFRleHQgKCIiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKiBJbml0aWFsaXplIHRoZSBldmVudHNGaWx0ZXIgdG8gbG9nIGFsbCBldmVudHMuICovCi0JCWludCBjdXN0b21FdmVudENvdW50ID0gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKS5sZW5ndGg7Ci0JCWV2ZW50c0ZpbHRlciA9IG5ldyBib29sZWFuIFtFVkVOVF9OQU1FUy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50OyBpKyspIHsKLQkJCWV2ZW50c0ZpbHRlciBbaV0gPSB0cnVlOwotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBldmVudCBjb25zb2xlIFRleHQuICovCi0JCWV2ZW50Q29uc29sZSA9IG5ldyBUZXh0IChsaXN0ZW5lcnNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJZXZlbnRDb25zb2xlLnNldExheW91dERhdGEgKGRhdGEpOwotCQljcmVhdGVFdmVudENvbnNvbGVQb3B1cCAoKTsKLQkJZXZlbnRDb25zb2xlLmFkZEtleUxpc3RlbmVyIChuZXcgS2V5QWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkIChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKChlLmtleUNvZGUgPT0gJ0EnIHx8IGUua2V5Q29kZSA9PSAnYScpICYmIChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSB7Ci0JCQkJCWV2ZW50Q29uc29sZS5zZWxlY3RBbGwgKCk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2b2lkIGNyZWF0ZVNldEdldERpYWxvZyhpbnQgeCwgaW50IHksIFN0cmluZ1tdIG1ldGhvZE5hbWVzKSB7Ci0JCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChldmVudENvbnNvbGUuZ2V0U2hlbGwgKCksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuTU9ERUxFU1MpOwotCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWRpYWxvZy5zZXRUZXh0KGdldFRhYlRleHQoKSArICIgIiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2V0X0dldCIpKTsKLQkJbmFtZUNvbWJvID0gbmV3IENvbWJvKGRpYWxvZywgU1dULlJFQURfT05MWSk7Ci0JCW5hbWVDb21iby5zZXRJdGVtcyhtZXRob2ROYW1lcyk7Ci0JCW5hbWVDb21iby5zZXRUZXh0KG1ldGhvZE5hbWVzWzBdKTsKLQkJbmFtZUNvbWJvLnNldFZpc2libGVJdGVtQ291bnQobWV0aG9kTmFtZXMubGVuZ3RoKTsKLQkJbmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0TGFiZWxzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm5UeXBlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCXJldHVyblR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCXNldEJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCXNldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRWYWx1ZSgpOwotCQkJCXNldFRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJc2V0VGV4dC5zZXRGb2N1cygpOwotCQkJfQotCQl9KTsKLQkJc2V0VGV4dCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzZXRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5QVVNIKTsKLQkJZ2V0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQkJZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0pOwotCQlnZXRUZXh0ID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyNDA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2V0VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXNldExhYmVscygpOwotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihzZXRCdXR0b24pOwotCQlkaWFsb2cucGFjaygpOwotCQlkaWFsb2cuc2V0TG9jYXRpb24oeCwgeSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0Jdm9pZCByZXNldExhYmVscygpIHsKLQkJU3RyaW5nIG1ldGhvZFJvb3QgPSBuYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlyZXR1cm5UeXBlTGFiZWwuc2V0VGV4dChwYXJhbWV0ZXJJbmZvKG1ldGhvZFJvb3QpKTsKLQkJc2V0QnV0dG9uLnNldFRleHQoc2V0TWV0aG9kTmFtZShtZXRob2RSb290KSk7Ci0JCWdldEJ1dHRvbi5zZXRUZXh0KCJnZXQiICsgbWV0aG9kUm9vdCk7Ci0JCXNldFRleHQuc2V0VGV4dCgiIik7Ci0JCWdldFRleHQuc2V0VGV4dCgiIik7Ci0JCWdldFZhbHVlKCk7Ci0JCXNldFRleHQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQlyZXR1cm4gInNldCIgKyBtZXRob2RSb290OwotCX0KLQotCVN0cmluZyBwYXJhbWV0ZXJJbmZvKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFJvb3QpOwotCQlib29sZWFuIGlzQXJyYXkgPSByZXR1cm5UeXBlLmlzQXJyYXkoKTsKLQkJaWYgKGlzQXJyYXkpIHsKLQkJCXR5cGVOYW1lID0gcmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldE5hbWUoKTsKLQkJfQotCQlTdHJpbmcgdHlwZU5hbWVTdHJpbmcgPSB0eXBlTmFtZTsKLQkJaW50IGluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4KzEgPCB0eXBlTmFtZS5sZW5ndGgoKSkgdHlwZU5hbWVTdHJpbmcgPSB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCVN0cmluZyBpbmZvID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluZm9fIiArIHR5cGVOYW1lU3RyaW5nICsgKGlzQXJyYXkgPyAiQSIgOiAiIikpOwotCQlpZiAoaXNBcnJheSkgewotCQkJdHlwZU5hbWVTdHJpbmcgKz0gIltdIjsKLQkJfQotCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcl9JbmZvIiwgbmV3IE9iamVjdFtdIHt0eXBlTmFtZVN0cmluZywgaW5mb30pOwotCX0KLQotCXZvaWQgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gImdldCIgKyBuYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlnZXRUZXh0LnNldFRleHQoIiIpOwotCQlDb250cm9sW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBjb250cm9sc1tpXS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBudWxsKTsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZShjb250cm9sc1tpXSwgbnVsbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKCJudWxsIik7Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldExlbmd0aChyZXN1bHQpOwotCQkJCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSArICJbMF0iKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJCQlnZXRUZXh0LmFwcGVuZChqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXQocmVzdWx0LGopLnRvU3RyaW5nKCkgKyAiXG4iKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWdldFRleHQuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoaSArIDEgPCBjb250cm9scy5sZW5ndGgpIHsKLQkJCQlnZXRUZXh0LmFwcGVuZCgiXG5cbiIpOwotCQkJfQotCQl9Ci0JfQotCi0JQ2xhc3MgZ2V0UmV0dXJuVHlwZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQlDbGFzcyByZXR1cm5UeXBlID0gbnVsbDsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IiArIG1ldGhvZFJvb3Q7Ci0JCUNvbnRyb2xbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzKCk7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gY29udHJvbHNbMF0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbnVsbCk7Ci0JCQlyZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmV0dXJuVHlwZTsKLQl9Ci0JCi0Jdm9pZCBzZXRWYWx1ZSgpIHsKLQkJLyogVGhlIHBhcmFtZXRlciB0eXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGdldCBtZXRob2QncyByZXR1cm4gdHlwZSAqLwotCQlTdHJpbmcgbWV0aG9kUm9vdCA9IG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFJvb3QpOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IHNldE1ldGhvZE5hbWUobWV0aG9kUm9vdCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHNldFRleHQuZ2V0VGV4dCgpOwotCQlDb250cm9sW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBjb250cm9sc1tpXS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cmV0dXJuVHlwZX0pOwotCQkJCVN0cmluZyB0eXBlTmFtZSA9IHJldHVyblR5cGUuZ2V0TmFtZSgpOwotCQkJCU9iamVjdFtdIHBhcmFtZXRlciA9IG51bGw7Ci0JCQkJaWYgKHR5cGVOYW1lLmVxdWFscygiaW50IikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcih2YWx1ZSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJsb25nIikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHtuZXcgTG9uZyh2YWx1ZSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHt2YWx1ZS5sZW5ndGgoKSA9PSAxID8gbmV3IENoYXJhY3Rlcih2YWx1ZS5jaGFyQXQoMCkpIDogbmV3IENoYXJhY3RlcignXDAnKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBCb29sZWFuKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImphdmEubGFuZy5TdHJpbmciKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3ZhbHVlfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50IikpIHsKLQkJCQkJU3RyaW5nIHh5W10gPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBQb2ludChuZXcgSW50ZWdlcih4eVswXSkuaW50VmFsdWUoKSxuZXcgSW50ZWdlcih4eVsxXSkuaW50VmFsdWUoKSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJbSSIpKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmdzW10gPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJCQlpbnRbXSBpbnRzID0gbmV3IGludFtzdHJpbmdzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3RyaW5ncy5sZW5ndGg7IGorKykgewotCQkJCQkJaW50c1tqXSA9IG5ldyBJbnRlZ2VyKHN0cmluZ3Nbal0pLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHtpbnRzfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiW0xqYXZhLmxhbmcuU3RyaW5nOyIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7dmFsdWUuc3BsaXQoIiwiKX07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFyYW1ldGVyID0gcGFyYW1ldGVyRm9yVHlwZSh0eXBlTmFtZSwgdmFsdWUsIGNvbnRyb2xzW2ldKTsKLQkJCQl9Ci0JCQkJbWV0aG9kLmludm9rZShjb250cm9sc1tpXSwgcGFyYW1ldGVyKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZ2V0VGV4dC5zZXRUZXh0KGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7dmFsdWV9OwotCX0KLQotCXZvaWQgY3JlYXRlT3JpZW50YXRpb25Hcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSBPcmllbnRhdGlvbiBncm91cCovCi0JCW9yaWVudGF0aW9uR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlvcmllbnRhdGlvbkdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCW9yaWVudGF0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW9yaWVudGF0aW9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9yaWVudGF0aW9uIikpOwotCQlkZWZhdWx0T3JpZXRhdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWZhdWx0IikpOwotCQlkZWZhdWx0T3JpZXRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlsdHJCdXR0b24gPSBuZXcgQnV0dG9uIChvcmllbnRhdGlvbkdyb3VwLCBTV1QuUkFESU8pOwotCQlsdHJCdXR0b24uc2V0VGV4dCAoIlNXVC5MRUZUX1RPX1JJR0hUIik7Ci0JCXJ0bEJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJ0bEJ1dHRvbi5zZXRUZXh0ICgiU1dULlJJR0hUX1RPX0xFRlQiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlNpemUiIGdyb3VwLiAgVGhlICJTaXplIiBncm91cCBjb250YWlucwotCSAqIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzaXplIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNpemVHcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJc2l6ZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc2l6ZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXNpemVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJc2l6ZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaXplIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCi0JCS8qCi0JCSAqIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBhIHdpZGdldCBpcyB0aGUgc2l6ZSByZXR1cm5lZAotCQkgKiBieSB3aWRnZXQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkuCi0JCSAqIFRoaXMgc2l6ZSBpcyBkZWZpbmVkIG9uIGEgd2lkZ2V0IGJ5IHdpZGdldCBiYXNpcy4KLQkJICogTWFueSB3aWRnZXRzIHdpbGwgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZWlyIGNvbnRlbnRzLgotCQkgKi8KLQkJcHJlZmVycmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByZWZlcnJlZCIpKTsKLQkJdG9vU21hbGxCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvb1NtYWxsQnV0dG9uLnNldFRleHQgKFRPT19TTUFMTF9TSVpFICsgIiBYICIgKyBUT09fU01BTExfU0laRSk7Ci0JCXNtYWxsQnV0dG9uID0gbmV3IEJ1dHRvbihzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNtYWxsQnV0dG9uLnNldFRleHQgKFNNQUxMX1NJWkUgKyAiIFggIiArIFNNQUxMX1NJWkUpOwotCQlsYXJnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULlJBRElPKTsKLQkJbGFyZ2VCdXR0b24uc2V0VGV4dCAoTEFSR0VfU0laRSArICIgWCAiICsgTEFSR0VfU0laRSk7Ci0JCWZpbGxCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWZpbGxCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGwiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9OwotCQlwcmVmZXJyZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0b29TbWFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNtYWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbGFyZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlmaWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCXByZWZlcnJlZEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLiAgVGhlICJTdHlsZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLiAgQ2hhbmdpbmcgYSB3aWRnZXQgIlN0eWxlIiBjYXVzZXMKLQkgKiB0aGUgd2lkZ2V0IHRvIGJlIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlzdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTdHlsZXMiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJLyoKLQkJKiBDcmVhdGUgYSB0d28gY29sdW1uIHBhZ2UuCi0JCSovCi0JCXRhYkZvbGRlclBhZ2UgPSBuZXcgQ29tcG9zaXRlICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSkpOwotCQotCQkvKiBDcmVhdGUgdGhlICJFeGFtcGxlIiBhbmQgIkNvbnRyb2wiIGdyb3Vwcy4gKi8KLQkJY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQljcmVhdGVDb250cm9sR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICJMaXN0ZW5lcnMiIGdyb3VwIHVuZGVyIHRoZSAiQ29udHJvbCIgZ3JvdXAuICovCi0JCWNyZWF0ZUxpc3RlbmVyc0dyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBleGFtcGxlIGFuZCBjb250cm9sIHdpZGdldHMuICovCi0JCWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQlob29rRXhhbXBsZVdpZGdldExpc3RlbmVycyAoKTsKLQkJY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHMgW2ldLmRpc3Bvc2UgKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBkcmF3SW1hZ2UgKEltYWdlIGltYWdlLCBDb2xvciBjb2xvcikgewotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGggLSAxLCBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGN1c3RvbSBldmVudCBuYW1lcwotCSAqLwotCVN0cmluZyBbXSBnZXRDdXN0b21FdmVudE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHN0eWxlIGZvciBhIHdpZGdldAotCSAqCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBzdHlsZSBiaXQKLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFN0eWxlICgpIHsKLQkJaWYgKGx0ckJ1dHRvbiAhPSBudWxsICYmIGx0ckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmV0dXJuIFNXVC5MRUZUX1RPX1JJR0hUOwotCQl9Ci0JCWlmIChydGxCdXR0b24gIT0gbnVsbCAmJiBydGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiBTV1QuUklHSFRfVE9fTEVGVDsKLQkJfQotCQlyZXR1cm4gU1dULk5PTkU7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gbmV3IEl0ZW0gWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqCi0JICogQHJldHVybiB0aGUgdGV4dCBmb3IgdGhlIHRhYiBpdGVtCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIGFsbCBsaXN0ZW5lcnMgdG8gYWxsIGV4YW1wbGUgY29udHJvbHMKLQkgKiBhbmQgZXhhbXBsZSBjb250cm9sIGl0ZW1zLgotCSAqLwotCXZvaWQgaG9va0V4YW1wbGVXaWRnZXRMaXN0ZW5lcnMgKCkgewotCQlpZiAobG9nZ2luZykgewotCQkJQ29udHJvbFtdIGV4YW1wbGVDb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlQ29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzIChleGFtcGxlQ29udHJvbHMgW2ldKTsKLQkJCX0KLQkJCUl0ZW1bXSBleGFtcGxlSXRlbXMgPSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4YW1wbGVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWhvb2tMaXN0ZW5lcnMgKGV4YW1wbGVJdGVtcyBbaV0pOwotCQkJfQotCQkJU3RyaW5nIFtdIGN1c3RvbU5hbWVzID0gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZXZlbnRzRmlsdGVyIFtFVkVOVF9OQU1FUy5sZW5ndGggKyBpXSkgaG9va0N1c3RvbUxpc3RlbmVyIChjdXN0b21OYW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgdGhlIGN1c3RvbSBsaXN0ZW5lciBzcGVjaWZpZWQgYnkgZXZlbnROYW1lLgotCSAqLwotCXZvaWQgaG9va0N1c3RvbUxpc3RlbmVyIChTdHJpbmcgZXZlbnROYW1lKSB7Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIGFsbCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCB3aWRnZXQuCi0JICovCi0Jdm9pZCBob29rTGlzdGVuZXJzIChXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmIChsb2dnaW5nKSB7Ci0JCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZXZlbnRzRmlsdGVyIFtpXSkgd2lkZ2V0LmFkZExpc3RlbmVyIChpLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9ncyBhbiB1bnR5cGVkIGV2ZW50IHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nKEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0b1N0cmluZyA9IEVWRU5UX05BTUVTW2V2ZW50LnR5cGVdICsgIiBbIitldmVudC50eXBlKyJdOiAiOwotCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULktleURvd246Ci0JCQljYXNlIFNXVC5LZXlVcDogdG9TdHJpbmcgKz0gbmV3IEtleUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQljYXNlIFNXVC5Nb3VzZURvdWJsZUNsaWNrOgotCQkJY2FzZSBTV1QuTW91c2VXaGVlbDogCi0JCQljYXNlIFNXVC5Nb3VzZUhvdmVyOiB0b1N0cmluZyArPSBuZXcgTW91c2VFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlBhaW50OiB0b1N0cmluZyArPSBuZXcgUGFpbnRFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vdmU6Ci0JCQljYXNlIFNXVC5SZXNpemU6IHRvU3RyaW5nICs9IG5ldyBDb250cm9sRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOiB0b1N0cmluZyArPSBuZXcgRGlzcG9zZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgotCQkJY2FzZSBTV1QuRGVmYXVsdFNlbGVjdGlvbjogdG9TdHJpbmcgKz0gbmV3IFNlbGVjdGlvbkV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuRm9jdXNJbjoKLQkJCWNhc2UgU1dULkZvY3VzT3V0OiB0b1N0cmluZyArPSBuZXcgRm9jdXNFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkV4cGFuZDoKLQkJCWNhc2UgU1dULkNvbGxhcHNlOiB0b1N0cmluZyArPSBuZXcgVHJlZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSWNvbmlmeToKLQkJCWNhc2UgU1dULkRlaWNvbmlmeToKLQkJCWNhc2UgU1dULkNsb3NlOgotCQkJY2FzZSBTV1QuQWN0aXZhdGU6Ci0JCQljYXNlIFNXVC5EZWFjdGl2YXRlOiB0b1N0cmluZyArPSBuZXcgU2hlbGxFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlNob3c6Ci0JCQljYXNlIFNXVC5IaWRlOiB0b1N0cmluZyArPSAoZXZlbnQud2lkZ2V0IGluc3RhbmNlb2YgTWVudSkgPyBuZXcgTWVudUV2ZW50IChldmVudCkudG9TdHJpbmcgKCkgOiBldmVudC50b1N0cmluZygpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vZGlmeTogdG9TdHJpbmcgKz0gbmV3IE1vZGlmeUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuVmVyaWZ5OiB0b1N0cmluZyArPSBuZXcgVmVyaWZ5RXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5IZWxwOiB0b1N0cmluZyArPSBuZXcgSGVscEV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuQXJtOiB0b1N0cmluZyArPSBuZXcgQXJtRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5UcmF2ZXJzZTogdG9TdHJpbmcgKz0gbmV3IFRyYXZlcnNlRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5IYXJkS2V5RG93bjoKLQkJCWNhc2UgU1dULkhhcmRLZXlVcDoKLQkJCWNhc2UgU1dULkRyYWdEZXRlY3Q6Ci0JCQljYXNlIFNXVC5NZW51RGV0ZWN0OgotCQkJY2FzZSBTV1QuU2V0RGF0YToKLQkJCWRlZmF1bHQ6IHRvU3RyaW5nICs9IGV2ZW50LnRvU3RyaW5nICgpOwotCQl9Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKHRvU3RyaW5nKTsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0JfQotCQotCS8qKgotCSAqIExvZ3MgYSBzdHJpbmcgdG8gdGhlIGV2ZW50IGNvbnNvbGUuCi0JICovCi0Jdm9pZCBsb2cgKFN0cmluZyBzdHJpbmcpIHsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoc3RyaW5nKTsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0JfQotCi0JLyoqCi0JICogTG9ncyBhIHR5cGVkIGV2ZW50IHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nIChTdHJpbmcgZXZlbnROYW1lLCBUeXBlZEV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKGV2ZW50TmFtZSArICI6ICIpOwotCQlldmVudENvbnNvbGUuYXBwZW5kIChldmVudC50b1N0cmluZyAoKSk7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCWRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIGluIG9yZGVyIHRvIHJlc2V0IG90aGVyIGNvbG9ycwotCSAqIGFuZCBmb250cyB0byBkZWZhdWx0IHNldHRpbmdzIGFzIHdlbGwuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCWZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJYmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWZvbnQgPSBudWxsOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpIHsKLQkJaWYgKGJhY2tncm91bmRCdXR0b24gPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBiYWNrZ3JvdW5kIGJ1dHRvbiBvbiB0aGlzIHRhYgotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRyb2xzW2ldLnNldEJhY2tncm91bmQgKGJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQkJLy8gU2V0IHRoZSBiYWNrZ3JvdW5kIGJ1dHRvbidzIGNvbG9yIHRvIG1hdGNoIHRoZSBjb2xvciBqdXN0IHNldC4KLQkJQ29sb3IgY29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsKLQkJZHJhd0ltYWdlIChiYWNrZ3JvdW5kSW1hZ2UsIGNvbG9yKTsKLQkJYmFja2dyb3VuZEJ1dHRvbi5zZXRJbWFnZSAoYmFja2dyb3VuZEltYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKSB7Ci0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0RW5hYmxlZCAoZW5hYmxlZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvbnQgKCkgewotCQlpZiAoaW5zdGFuY2Uuc3RhcnR1cCkgcmV0dXJuOwotCQlpZiAoZm9udEJ1dHRvbiA9PSBudWxsKSByZXR1cm47IC8vIG5vIGZvbnQgYnV0dG9uIG9uIHRoaXMgdGFiCi0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY29udHJvbHNbaV07Ci0JCQljb250cm9sLnNldEZvbnQoZm9udCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKSB7Ci0JCWlmIChmb3JlZ3JvdW5kQnV0dG9uID09IG51bGwpIHJldHVybjsgLy8gbm8gZm9yZWdyb3VuZCBidXR0b24gb24gdGhpcyB0YWIKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9sc1tpXS5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8vIFNldCB0aGUgZm9yZWdyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgY29sb3IganVzdCBzZXQuCi0JCUNvbG9yIGNvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHJldHVybjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gY29udHJvbHMgWzBdLmdldEZvcmVncm91bmQgKCk7Ci0JCWRyYXdJbWFnZSAoZm9yZWdyb3VuZEltYWdlLCBjb2xvcik7Ci0JCWZvcmVncm91bmRCdXR0b24uc2V0SW1hZ2UgKGZvcmVncm91bmRJbWFnZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFNpemUgKCkgewotCQlpbnQgc2l6ZSA9IFNXVC5ERUZBVUxUOwotCQlpZiAocHJlZmVycmVkQnV0dG9uID09IG51bGwpIHJldHVybjsKLQkJaWYgKHByZWZlcnJlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc2l6ZSA9IFNXVC5ERUZBVUxUOwotCQlpZiAodG9vU21hbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHNpemUgPSBUT09fU01BTExfU0laRTsKLQkJaWYgKHNtYWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gU01BTExfU0laRTsKLQkJaWYgKGxhcmdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gTEFSR0VfU0laRTsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCUdyaWREYXRhIGdyaWREYXRhOyAKLQkJCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQl9IGVsc2UgewotCQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhICgpOwotCQkJCWdyaWREYXRhLndpZHRoSGludCA9IHNpemU7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHNpemU7Ci0JCQl9Ci0JCQljb250cm9scyBbaV0uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQl9Ci0JCXRhYkZvbGRlclBhZ2UubGF5b3V0IChjb250cm9scyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4gIFN1YmNsYXNzZXMKLQkgKiByZWltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgIkV4YW1wbGUiIHdpZGdldCBzdGF0ZQotCSAqIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIHdpZGdldC4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXNldEV4YW1wbGVXaWRnZXRFbmFibGVkICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0VmlzaWJpbGl0eSAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCS8vVEVNUE9SQVJZIENPREUKLS8vCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0vLwkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCWxvZyAoIkNvbnRyb2w9IiArIGNvbnRyb2xzIFtpXSArICIsIGJvcmRlciB3aWR0aD0iICsgY29udHJvbHMgW2ldLmdldEJvcmRlcldpZHRoICgpKTsKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFZpc2liaWxpdHkgKCkgewotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHMgW2ldLnNldFZpc2libGUgKHZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWI2YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUYWJGb2xkZXJUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVGFiRm9sZGVyIHRhYkZvbGRlcjE7Ci0JR3JvdXAgdGFiRm9sZGVyR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB0b3BCdXR0b24sIGJvdHRvbUJ1dHRvbjsKLQotCXN0YXRpYyBTdHJpbmcgW10gVGFiSXRlbXMxID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJJdGVtMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW0xXzEiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFiSXRlbTFfMiIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUYWJGb2xkZXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIFRhYkZvbGRlciAqLwotCQl0YWJGb2xkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0VGV4dCAoIlRhYkZvbGRlciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHRvcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5UT1A7Ci0JCWlmIChib3R0b21CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9UVE9NOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQl0YWJGb2xkZXIxID0gbmV3IFRhYkZvbGRlciAodGFiRm9sZGVyR3JvdXAsIHN0eWxlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBUYWJJdGVtczEubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlcjEsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChUYWJJdGVtczFbaV0pOwotCQkJaXRlbS5zZXRUb29sVGlwVGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVG9vbHRpcCIsIG5ldyBTdHJpbmcgW10ge1RhYkl0ZW1zMVtpXX0pKTsKLQkJCVRleHQgY29udGVudCA9IG5ldyBUZXh0KHRhYkZvbGRlcjEsIFNXVC5XUkFQIHwgU1dULk1VTFRJKTsKLQkJCWNvbnRlbnQuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFiSXRlbV9jb250ZW50IikgKyAiOiAiICsgaSk7Ci0JCQlpdGVtLnNldENvbnRyb2woY29udGVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJdG9wQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdG9wQnV0dG9uLnNldFRleHQgKCJTV1QuVE9QIik7Ci0JCXRvcEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJvdHRvbUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWJvdHRvbUJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPVFRPTSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfTsKLQkJdG9wQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWJvdHRvbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIHRhYkZvbGRlcjEuZ2V0SXRlbXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHt0YWJGb2xkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiU2VsZWN0aW9uSW5kZXgifTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQkvKiBPdmVycmlkZSB0byBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGludCBnZXRTZWxlY3Rpb25JbmRleCgpL3NldFNlbGVjdGlvbihpbnQpICovCi0JCXJldHVybiAobWV0aG9kUm9vdC5lcXVhbHMoIlNlbGVjdGlvbkluZGV4IikpID8gInNldFNlbGVjdGlvbiIgOiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmICh2YWx1ZS5lcXVhbHMoIiIpKSByZXR1cm4gbmV3IE9iamVjdFtdIHtuZXcgVGFiSXRlbVswXX07Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0iKSkgewotCQkJVGFiSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWUsICgoVGFiRm9sZGVyKSBjb250cm9sKS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gdmFsdWUuc3BsaXQoIiwiKTsKLQkJCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW3ZhbHVlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IGZpbmRJdGVtKHZhbHVlc1tpXSwgKChUYWJGb2xkZXIpIGNvbnRyb2wpLmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgY29udHJvbCk7Ci0JfQotCi0JVGFiSXRlbSBmaW5kSXRlbShTdHJpbmcgdmFsdWUsIFRhYkl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHModmFsdWUpKSByZXR1cm4gaXRlbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJUYWJGb2xkZXIiOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJdG9wQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYkZvbGRlcjEuZ2V0U3R5bGUgKCkgJiBTV1QuVE9QKSAhPSAwKTsKLQkJYm90dG9tQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYkZvbGRlcjEuZ2V0U3R5bGUgKCkgJiBTV1QuQk9UVE9NKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYkZvbGRlcjEuZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWJsZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA0MzRhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWJsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgVGFibGVUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRhYmxlIHRhYmxlMTsKLQlHcm91cCB0YWJsZUdyb3VwLCBpdGVtR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGNoZWNrQnV0dG9uLCBmdWxsU2VsZWN0aW9uQnV0dG9uLCBoaWRlU2VsZWN0aW9uQnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBtdWx0aXBsZUNvbHVtbnMsIG1vdmVhYmxlQ29sdW1ucywgaGVhZGVyVmlzaWJsZUJ1dHRvbiwgbGluZXNWaXNpYmxlQnV0dG9uOwotCQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlICJDb2xvcnMiIGdyb3VwICovCi0JQnV0dG9uIGl0ZW1Gb3JlZ3JvdW5kQnV0dG9uLCBpdGVtQmFja2dyb3VuZEJ1dHRvbiwgaXRlbUZvbnRCdXR0b247Ci0JQ29sb3IgaXRlbUZvcmVncm91bmRDb2xvciwgaXRlbUJhY2tncm91bmRDb2xvcjsKLQlJbWFnZSBpdGVtRm9yZWdyb3VuZEltYWdlLCBpdGVtQmFja2dyb3VuZEltYWdlOwotCUZvbnQgaXRlbUZvbnQ7Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBjb2x1bW5UaXRsZXMJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMCIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMiIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMyIpfTsKLQkJCQkJCQkJCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8zIikgfSwKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8zIikgfSwKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRhYmxlVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbG9ycyIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDb2xvckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JHcm91cCgpOwotCQkKLQkJaXRlbUdyb3VwID0gbmV3IEdyb3VwIChjb2xvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCWl0ZW1Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlRhYmxlX0l0ZW1fQ29sb3JzIikpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhICgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJaXRlbUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJbmV3IExhYmVsIChpdGVtR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuUFVTSCk7Ci0JCW5ldyBMYWJlbCAoaXRlbUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250IikpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlTaGVsbCBzaGVsbCA9IGNvbG9yR3JvdXAuZ2V0U2hlbGwgKCk7Ci0JCWZpbmFsIENvbG9yRGlhbG9nIGZvcmVncm91bmREaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZmluYWwgQ29sb3JEaWFsb2cgYmFja2dyb3VuZERpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmaW5hbCBGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwpOwotCi0JCWludCBpbWFnZVNpemUgPSAxMjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJaXRlbUZvcmVncm91bmRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0IHRoZSBjb2xvcnMgYW5kIGZvbnQgKi8KLQkJaXRlbUZvcmVncm91bmRCdXR0b24uc2V0SW1hZ2UoaXRlbUZvcmVncm91bmRJbWFnZSk7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvcmVncm91bmQgKCk7Ci0JCQkJZm9yZWdyb3VuZERpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBmb3JlZ3JvdW5kRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZXZlbnQuZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kQnV0dG9uLnNldEltYWdlKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRCYWNrZ3JvdW5kICgpOwotCQkJCWJhY2tncm91bmREaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gYmFja2dyb3VuZERpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtRm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCQlpZiAob2xkRm9udCA9PSBudWxsKSBvbGRGb250ID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvbnQgKCk7Ci0JCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGV2ZW50LmRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRJdGVtRm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChpdGVtQmFja2dyb3VuZEltYWdlICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZEltYWdlICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9udCAhPSBudWxsKSBpdGVtRm9udC5kaXNwb3NlKCk7Ci0JCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQloZWFkZXJWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSGVhZGVyX1Zpc2libGUiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlwbGVfQ29sdW1ucyIpKTsKLQkJbXVsdGlwbGVDb2x1bW5zLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJbW92ZWFibGVDb2x1bW5zID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbW92ZWFibGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNb3ZlYWJsZV9Db2x1bW5zIikpOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lc19WaXNpYmxlIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJbXVsdGlwbGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJbW92ZWFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zTW92ZWFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaW5lc1Zpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGFibGUgKi8KLQkJdGFibGVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRhYmxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYmxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRhYmxlR3JvdXAuc2V0VGV4dCAoIlRhYmxlIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTkdMRTsKLQkJaWYgKG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0hFQ0s7Ci0JCWlmIChmdWxsU2VsZWN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkZVTExfU0VMRUNUSU9OOwotCQlpZiAoaGlkZVNlbGVjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5ISURFX1NFTEVDVElPTjsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgdGFibGUgd2lkZ2V0ICovCi0JCXRhYmxlMSA9IG5ldyBUYWJsZSAodGFibGVHcm91cCwgc3R5bGUpOwotCQotCQkvKiBGaWxsIHRoZSB0YWJsZSB3aXRoIGRhdGEgKi8KLQkJaWYgKG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTEsIFNXVC5OT05FKTsKLQkJCQl0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdGFibGVDb2x1bW4uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiLCBuZXcgU3RyaW5nIFtdIHtjb2x1bW5UaXRsZXNbaV19KSk7Ci0JCQl9Ci0JCQl0YWJsZTEuc2V0U29ydENvbHVtbih0YWJsZTEuZ2V0Q29sdW1uKDApKTsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZTEsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlcyBbaSAlIDNdKTsKLQkJCXNldEl0ZW1UZXh0IChpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5kZXgiKSArIGkpOwotCQl9Ci0JCXBhY2tDb2x1bW5zKCk7Ci0JCXNldENvbHVtbnNNb3ZlYWJsZSgpOwotCX0KLQkKLQl2b2lkIHNldEl0ZW1UZXh0KFRhYmxlSXRlbSBpdGVtLCBpbnQgaSwgU3RyaW5nIG5vZGUpIHsKLQkJaW50IGluZGV4ID0gaSAlIDM7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRhYmxlRGF0YSBbaW5kZXhdWzBdID0gbm9kZTsKLQkJCWl0ZW0uc2V0VGV4dCAodGFibGVEYXRhIFtpbmRleF0pOwotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRUZXh0IChub2RlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQkJaGlkZVNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5ISURFX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJSXRlbSBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBpdGVtcyA9IHRhYmxlMS5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2NvbHVtbnMubGVuZ3RoICsgaXRlbXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zLCAwLCBhbGxJdGVtcywgMCwgY29sdW1ucy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBhbGxJdGVtcywgY29sdW1ucy5sZW5ndGgsIGl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHt0YWJsZTF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkNvbHVtbk9yZGVyIiwgIkl0ZW1Db3VudCIsICJTZWxlY3Rpb24iLCAiU2VsZWN0aW9uSW5kZXgiLCAiU29ydERpcmVjdGlvbiIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCJ9OwotCX0KLQotCVN0cmluZyBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCS8qIE92ZXJyaWRlIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgaW50IGdldFNlbGVjdGlvbkluZGV4KCkvc2V0U2VsZWN0aW9uKGludCkgKi8KLQkJcmV0dXJuIChtZXRob2RSb290LmVxdWFscygiU2VsZWN0aW9uSW5kZXgiKSkgPyAic2V0U2VsZWN0aW9uIiA6ICJzZXQiICsgbWV0aG9kUm9vdDsKLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKHZhbHVlLmVxdWFscygiIikpIHJldHVybiBuZXcgT2JqZWN0W10ge25ldyBUYWJsZUl0ZW1bMF19OyAvLyBidWcgaW4gVGFibGU/Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbSIpKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlLCAoKFRhYmxlKSBjb250cm9sKS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOyIpKSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW3ZhbHVlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IGZpbmRJdGVtKHZhbHVlc1tpXSwgKChUYWJsZSkgY29udHJvbCkuZ2V0SXRlbXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCBjb250cm9sKTsKLQl9Ci0KLQlUYWJsZUl0ZW0gZmluZEl0ZW0oU3RyaW5nIHZhbHVlLCBUYWJsZUl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRhYmxlIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiBUYWJsZUl0ZW0gWzBdCi0JICogdG8gZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQl2b2lkIHJlc2V0Q29sb3JzQW5kRm9udHMgKCkgewotCQlzdXBlci5yZXNldENvbG9yc0FuZEZvbnRzICgpOwotCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWl0ZW1Gb250ID0gbnVsbDsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiBUYWJsZUl0ZW0gWzBdLgotCSAqLwotCXZvaWQgc2V0SXRlbUJhY2tncm91bmQgKCkgewotCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCS8qIFNldCB0aGUgYmFja2dyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgY29sb3IganVzdCBzZXQuICovCi0JCUNvbG9yIGNvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEJhY2tncm91bmQgKCk7Ci0JCWRyYXdJbWFnZSAoaXRlbUJhY2tncm91bmRJbWFnZSwgY29sb3IpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbi5zZXRJbWFnZSAoaXRlbUJhY2tncm91bmRJbWFnZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXS4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb3JlZ3JvdW5kICgpIHsKLQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEZvcmVncm91bmQgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IpOwotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGNvbG9yIGp1c3Qgc2V0LiAqLwotCQlDb2xvciBjb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb3JlZ3JvdW5kICgpOwotCQlkcmF3SW1hZ2UgKGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UsIGNvbG9yKTsKLQkJaXRlbUZvcmVncm91bmRCdXR0b24uc2V0SW1hZ2UgKGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIFRhYmxlSXRlbSAwLgotCSAqLwotCXZvaWQgc2V0SXRlbUZvbnQgKCkgewotCQlpZiAoaW5zdGFuY2Uuc3RhcnR1cCkgcmV0dXJuOwotCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9udCAoaXRlbUZvbnQpOwotCQlwYWNrQ29sdW1ucyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRGb250ICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldEZvbnQoKTsKLQkJcGFja0NvbHVtbnMgKCk7Ci0JfQotCQotCXZvaWQgcGFja0NvbHVtbnMgKCkgewotCQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZTEuZ2V0Q29sdW1uQ291bnQoKTsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZTEuZ2V0Q29sdW1uKGkpOwotCQkJdGFibGVDb2x1bW4ucGFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW92ZWFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zTW92ZWFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IG1vdmVhYmxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQlzZXRXaWRnZXRMaW5lc1Zpc2libGUgKCk7Ci0JCWNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYmxlMS5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodGFibGUxLmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQkJaGlkZVNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJsZTEuZ2V0U3R5bGUgKCkgJiBTV1QuSElERV9TRUxFQ1RJT04pICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBoZWFkZXIgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpIHsKLQkJdGFibGUxLnNldEhlYWRlclZpc2libGUgKGhlYWRlclZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGluZXMgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRMaW5lc1Zpc2libGUgKCkgewotCQl0YWJsZTEuc2V0TGluZXNWaXNpYmxlIChsaW5lc1Zpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UZXh0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UZXh0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ODYzNDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGV4dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgVGV4dFRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVGV4dCB0ZXh0OwotCUdyb3VwIHRleHRHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgcmVhZE9ubHlCdXR0b247Ci0JQnV0dG9uIGxlZnRCdXR0b24sIGNlbnRlckJ1dHRvbiwgcmlnaHRCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRleHRUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB3aWRnZXQgKi8KLQkJdGV4dEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGV4dEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0ZXh0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRleHRHcm91cC5zZXRUZXh0ICgiVGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRleHQgPSBuZXcgVGV4dCAodGV4dEdyb3VwLCBzdHlsZSk7Ci0JCXRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikgKyBUZXh0LkRFTElNSVRFUiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmVfVHdvX1RocmVlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRUFEX09OTFkiKTsKLQotCQlDb21wb3NpdGUgYWxpZ25tZW50R3JvdXAgPSBuZXcgQ29tcG9zaXRlIChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlhbGlnbm1lbnRHcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWxlZnRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJbGVmdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlQiKTsKLQkJY2VudGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkNFTlRFUiIpOwotCQlyaWdodEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlyaWdodEJ1dHRvbi5zZXRUZXh0ICgiU1dULlJJR0hUIik7Ci0JCQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfTsKLQkJbGVmdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQljZW50ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJcmlnaHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7dGV4dH07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiRG91YmxlQ2xpY2tFbmFibGVkIiwgIkVjaG9DaGFyIiwgIkVkaXRhYmxlIiwgIk9yaWVudGF0aW9uIiwgIlNlbGVjdGlvbiIsICJUYWJzIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGV4dCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCXdyYXBCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZjYzM4Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBUb29sQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRvb2xCYXIgaW1hZ2VUb29sQmFyLCB0ZXh0VG9vbEJhciwgaW1hZ2VUZXh0VG9vbEJhcjsKLQlHcm91cCBpbWFnZVRvb2xCYXJHcm91cCwgdGV4dFRvb2xCYXJHcm91cCwgaW1hZ2VUZXh0VG9vbEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b24sIGZsYXRCdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgd3JhcEJ1dHRvbiwgcmlnaHRCdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGNvbWJvQ2hpbGRCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRvb2xCYXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUb29sQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlpbWFnZVRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWltYWdlVG9vbEJhckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZV9Ub29sQmFyIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgdG9vbCBiYXIgKi8KLQkJdGV4dFRvb2xCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRleHRUb29sQmFyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfVG9vbEJhciIpKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgYW5kIHRleHQgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbWFnZVRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWltYWdlVGV4dFRvb2xCYXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VUZXh0X1Rvb2xCYXIiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX09VVDsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qCi0JCSogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSoKLQkJKiBBIHRvb2wgYmFyIG11c3QgY29uc2lzdCBvZiBhbGwgaW1hZ2UgdG9vbAotCQkqIGl0ZW1zIG9yIGFsbCB0ZXh0IHRvb2wgaXRlbXMgYnV0IG5vdCBib3RoLgotCQkqLwotCQotCQkvKiBDcmVhdGUgdGhlIGltYWdlIHRvb2wgYmFyICovCi0JCWltYWdlVG9vbEJhciA9IG5ldyBUb29sQmFyIChpbWFnZVRvb2xCYXJHcm91cCwgc3R5bGUpOwotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaWYgKGNvbWJvQ2hpbGRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoaW1hZ2VUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSB0ZXh0IHRvb2wgYmFyICovCi0JCXRleHRUb29sQmFyID0gbmV3IFRvb2xCYXIgKHRleHRUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoZWNrIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuU0VQQVJBVE9SIik7Ci0JCWlmIChjb21ib0NoaWxkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHRleHRUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BfRG93biIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgYW5kIHRleHQgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUZXh0VG9vbEJhciA9IG5ldyBUb29sQmFyIChpbWFnZVRleHRUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2hlY2siKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlNFUEFSQVRPUiIpOwotCQlpZiAoY29tYm9DaGlsZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChpbWFnZVRleHRUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BfRG93biIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qCi0JCSogRG8gbm90IGFkZCB0aGUgc2VsZWN0aW9uIGV2ZW50IGZvciB0aGlzIGRyb3AgZG93bgotCQkqIHRvb2wgaXRlbS4gIFdpdGhvdXQgaG9va2luZyB0aGUgZXZlbnQsIHRoZSBkcm9wIGRvd24KLQkJKiB3aWRnZXQgZG9lcyBub3RoaW5nIHNwZWNpYWwgd2hlbiB0aGUgZHJvcCBkb3duIGFyZWEKLQkJKiBpcyBzZWxlY3RlZC4KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY29tYm9DaGlsZEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNvbWJvQ2hpbGRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbWJvX2NoaWxkIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljb21ib0NoaWxkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCXNoYWRvd091dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19PVVQiKTsKLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmlnaHRCdXR0b24uc2V0VGV4dCAoIlNXVC5SSUdIVCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlJdGVtIFtdIGltYWdlVG9vbEJhckl0ZW1zID0gaW1hZ2VUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gdGV4dFRvb2xCYXJJdGVtcyA9IHRleHRUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gaW1hZ2VUZXh0VG9vbEJhckl0ZW1zID0gaW1hZ2VUZXh0VG9vbEJhci5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2ltYWdlVG9vbEJhckl0ZW1zLmxlbmd0aCArIHRleHRUb29sQmFySXRlbXMubGVuZ3RoICsgaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCAwLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRleHRUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGgsIHRleHRUb29sQmFySXRlbXMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShpbWFnZVRleHRUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGggKyB0ZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCwgaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sIFtdIHtpbWFnZVRvb2xCYXIsIHRleHRUb29sQmFyLCBpbWFnZVRleHRUb29sQmFyfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVG9vbEJhciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBUb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51ICAgIG1lbnUgPSBudWxsOwotCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsKCk7Ci0JCQkJbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewotCQkJCQlmaW5hbCBTdHJpbmcgdGV4dCA9IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wRG93bkRhdGFfIiArIGkpOwotCQkJCQlpZiAodGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQltZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJLyoKLQkJCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkJCSAqLwotCQkJCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIGEgZHJvcCBkb3duIHRvb2wKLQkJCSAqIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIG1haW4gYXJlYSBhbmQgaW4gdGhlIGRyb3AKLQkJCSAqIGRvd24gYXJyb3cuICBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwgdG8gZGV0ZXJtaW5lCi0JCQkgKiB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qCi0JCQkJICogVGhlIGRyb3AgZG93biBhcnJvdyB3YXMgc2VsZWN0ZWQuCi0JCQkJICovCi0JCQkJaWYgKHZpc2libGUpIHsKLQkJCQkJLy8gSGlkZSB0aGUgbWVudSB0byBnaXZlIHRoZSBBcnJvdyB0aGUgYXBwZWFyYW5jZSBvZiBiZWluZyBhIHRvZ2dsZSBidXR0b24uCi0JCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJLy8gUG9zaXRpb24gdGhlIG1lbnUgYmVsb3cgYW5kIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSB0aGUgZHJvcCBkb3duIHRvb2wgYnV0dG9uLgotCQkJCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQotCQkJCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJCQlzZXRNZW51VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogTWFpbiBhcmVhIG9mIGRyb3AgZG93biB0b29sIGl0ZW0gc2VsZWN0ZWQuCi0JCQkJICogQW4gYXBwbGljYXRpb24gd291bGQgaW52b2tlIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIHRvb2wgaXRlbS4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0TWVudVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQltZW51LnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTZlN2M4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RyZWVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRyZWVUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRyZWUgdHJlZTEsIHRyZWUyOwotCVRyZWVJdGVtIHRleHROb2RlMSwgaW1hZ2VOb2RlMTsKLQlHcm91cCB0cmVlR3JvdXAsIGltYWdlVHJlZUdyb3VwLCBpdGVtR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBjaGVja0J1dHRvbiwgZnVsbFNlbGVjdGlvbkJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbXVsdGlwbGVDb2x1bW5zLCBtb3ZlYWJsZUNvbHVtbnMsIGhlYWRlclZpc2libGVCdXR0b24sIGxpbmVzVmlzaWJsZUJ1dHRvbjsKLQkKLQkvKiBDb250cm9scyBhbmQgcmVzb3VyY2VzIGFkZGVkIHRvIHRoZSAiQ29sb3JzIiBncm91cCAqLwotCUJ1dHRvbiBpdGVtRm9yZWdyb3VuZEJ1dHRvbiwgaXRlbUJhY2tncm91bmRCdXR0b24sIGl0ZW1Gb250QnV0dG9uOwotCUNvbG9yIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IsIGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JSW1hZ2UgaXRlbUZvcmVncm91bmRJbWFnZSwgaXRlbUJhY2tncm91bmRJbWFnZTsKLQlGb250IGl0ZW1Gb250OwotCQotCXN0YXRpYyBTdHJpbmcgW10gY29sdW1uVGl0bGVzCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzAiKSwKLQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8yIiksCi0JCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzMiKX07Ci0JCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMCIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8xIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMyIpIH0sCi0JCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzAiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8yIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzMiKSB9LAotCQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzEiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMiIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRyZWVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ29sb3JHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbG9yR3JvdXAoKTsKLQkJCi0JCWl0ZW1Hcm91cCA9IG5ldyBHcm91cCAoY29sb3JHcm91cCwgU1dULk5PTkUpOwotCQlpdGVtR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUcmVlX0l0ZW1fQ29sb3JzIikpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhICgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJaXRlbUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJbmV3IExhYmVsIChpdGVtR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuUFVTSCk7Ci0JCW5ldyBMYWJlbCAoaXRlbUdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULlBVU0gpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250IikpOwotCQlpdGVtRm9udEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlTaGVsbCBzaGVsbCA9IGNvbG9yR3JvdXAuZ2V0U2hlbGwgKCk7Ci0JCWZpbmFsIENvbG9yRGlhbG9nIGZvcmVncm91bmREaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZmluYWwgQ29sb3JEaWFsb2cgYmFja2dyb3VuZERpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmaW5hbCBGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwpOwotCi0JCWludCBpbWFnZVNpemUgPSAxMjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJaXRlbUZvcmVncm91bmRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZVNpemUsIGltYWdlU2l6ZSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VTaXplLCBpbWFnZVNpemUpOwotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0IHRoZSBjb2xvcnMgYW5kIGZvbnQgKi8KLQkJaXRlbUZvcmVncm91bmRCdXR0b24uc2V0SW1hZ2UoaXRlbUZvcmVncm91bmRJbWFnZSk7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKCk7Ci0JCQkJZm9yZWdyb3VuZERpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBmb3JlZ3JvdW5kRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZXZlbnQuZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW1CYWNrZ3JvdW5kQnV0dG9uLnNldEltYWdlKGl0ZW1CYWNrZ3JvdW5kSW1hZ2UpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgpOwotCQkJCWJhY2tncm91bmREaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gYmFja2dyb3VuZERpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGV2ZW50LmRpc3BsYXksIHJnYik7Ci0JCQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtRm9udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCQlpZiAob2xkRm9udCA9PSBudWxsKSBvbGRGb250ID0gdGV4dE5vZGUxLmdldEZvbnQgKCk7Ci0JCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGV2ZW50LmRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRJdGVtRm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChpdGVtQmFja2dyb3VuZEltYWdlICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZEltYWdlICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9udCAhPSBudWxsKSBpdGVtRm9udC5kaXNwb3NlKCk7Ci0JCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQloZWFkZXJWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSGVhZGVyX1Zpc2libGUiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlwbGVfQ29sdW1ucyIpKTsKLQkJbW92ZWFibGVDb2x1bW5zID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbW92ZWFibGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNb3ZlYWJsZV9Db2x1bW5zIikpOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lc19WaXNpYmxlIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJbXVsdGlwbGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJbW92ZWFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zTW92ZWFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaW5lc1Zpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB0cmVlICovCi0JCXRyZWVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRyZWVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdHJlZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl0cmVlR3JvdXAuc2V0VGV4dCAoIlRyZWUiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSB0cmVlICovCi0JCWltYWdlVHJlZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWltYWdlVHJlZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlpbWFnZVRyZWVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHJlZV9XaXRoX0ltYWdlcyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlNJTkdMRTsKLQkJaWYgKG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkNIRUNLOwotCQlpZiAoZnVsbFNlbGVjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GVUxMX1NFTEVDVElPTjsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSB0ZXh0IHRyZWUgKi8KLQkJdHJlZTEgPSBuZXcgVHJlZSAodHJlZUdyb3VwLCBzdHlsZSk7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZTEsIFNXVC5OT05FKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRleHQoY29sdW1uVGl0bGVzW2ldKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJfQotCQkJdHJlZTEuc2V0U29ydENvbHVtbih0cmVlMS5nZXRDb2x1bW4oMCkpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlMSwgU1dULk5PTkUpOwotCQkJc2V0SXRlbVRleHQoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkpKTsKLQkJCWlmIChpIDwgMykgewotCQkJCVRyZWVJdGVtIHN1Yml0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzZXRJdGVtVGV4dChzdWJpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8iICsgKGkgKyAxKSArICJfMSIpKTsKLQkJCX0KLQkJfQotCQlUcmVlSXRlbSB0cmVlUm9vdHNbXSA9IHRyZWUxLmdldEl0ZW1zICgpOwotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlUm9vdHNbMV0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yIikpOwotCQlpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMl8xIikpOwkJCQkJCi0JCXRleHROb2RlMSA9IHRyZWVSb290c1swXTsKLQkJcGFja0NvbHVtbnModHJlZTEpOwotCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgdHJlZSAqLwkKLQkJdHJlZTIgPSBuZXcgVHJlZSAoaW1hZ2VUcmVlR3JvdXAsIHN0eWxlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdOwotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVDb2x1bW4gdHJlZUNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUb29sVGlwVGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVG9vbHRpcCIpICsgY29sdW1uVGl0bGVzW2ldKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZTIsIFNXVC5OT05FKTsKLQkJCXNldEl0ZW1UZXh0KGl0ZW0sIGksIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXyIgKyAoaSArIDEpKSk7Ci0JCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCWlmIChpIDwgMykgewotCQkJCVRyZWVJdGVtIHN1Yml0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzZXRJdGVtVGV4dChzdWJpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8iICsgKGkgKyAxKSArICJfMSIpKTsKLQkJCQlzdWJpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCX0KLQkJfQotCQl0cmVlUm9vdHMgPSB0cmVlMi5nZXRJdGVtcyAoKTsKLQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZVJvb3RzWzFdLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMiIpKTsKLQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCWl0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yXzEiKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQlpbWFnZU5vZGUxID0gdHJlZVJvb3RzWzBdOwotCQlwYWNrQ29sdW1ucyh0cmVlMik7Ci0JCQotCQlzZXRDb2x1bW5zTW92ZWFibGUoKTsKLQl9Ci0JCi0Jdm9pZCBzZXRJdGVtVGV4dChUcmVlSXRlbSBpdGVtLCBpbnQgaSwgU3RyaW5nIG5vZGUpIHsKLQkJaW50IGluZGV4ID0gaSAlIDM7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRhYmxlRGF0YSBbaW5kZXhdWzBdID0gbm9kZTsKLQkJCWl0ZW0uc2V0VGV4dCAodGFibGVEYXRhIFtpbmRleF0pOwotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRUZXh0IChub2RlKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCS8qIE5vdGU6IFdlIGRvIG5vdCBib3RoZXIgY29sbGVjdGluZyB0aGUgdHJlZSBpdGVtcwotCQkgKiBiZWNhdXNlIHRyZWUgaXRlbXMgZG9uJ3QgaGF2ZSBhbnkgZXZlbnRzLiBJZiBldmVudHMKLQkJICogYXJlIGV2ZXIgYWRkZWQgdG8gVHJlZUl0ZW0sIHRoZW4gdGhpcyBuZWVkcyB0byBjaGFuZ2UuCi0JCSAqLwotCQlJdGVtIFtdIGNvbHVtbnMxID0gdHJlZTEuZ2V0Q29sdW1ucygpOwotCQlJdGVtIFtdIGNvbHVtbnMyID0gdHJlZTIuZ2V0Q29sdW1ucygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2NvbHVtbnMxLmxlbmd0aCArIGNvbHVtbnMyLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29sdW1uczEsIDAsIGFsbEl0ZW1zLCAwLCBjb2x1bW5zMS5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbHVtbnMyLCAwLCBhbGxJdGVtcywgY29sdW1uczEubGVuZ3RoLCBjb2x1bW5zMi5sZW5ndGgpOwotCQlyZXR1cm4gYWxsSXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbCBbXSB7dHJlZTEsIHRyZWUyfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb2x1bW5PcmRlciIsICJTZWxlY3Rpb24iLCAiU29ydERpcmVjdGlvbiIsICJUb29sVGlwVGV4dCIsICJUb3BJdGVtIn07Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtIikpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbSh2YWx1ZSwgKChUcmVlKSBjb250cm9sKS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07IikpIHsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHZhbHVlLnNwbGl0KCIsIik7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW3ZhbHVlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWVzW2ldLCAoKFRyZWUpIGNvbnRyb2wpLmdldEl0ZW1zKCkpOwotCQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwotCQkJCWl0ZW1zW2ldID0gaXRlbTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCBjb250cm9sKTsKLQl9Ci0KLQlUcmVlSXRlbSBmaW5kSXRlbShTdHJpbmcgdmFsdWUsIFRyZWVJdGVtW10gaXRlbXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQkJaXRlbSA9IGZpbmRJdGVtKHZhbHVlLCBpdGVtLmdldEl0ZW1zKCkpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgcmV0dXJuIGl0ZW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVHJlZSI7Ci0JfQotCi0Jdm9pZCBwYWNrQ29sdW1ucyAoVHJlZSB0cmVlKSB7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCVRyZWVDb2x1bW4gdHJlZUNvbHVtbiA9IHRyZWUuZ2V0Q29sdW1uKGkpOwotCQkJCXRyZWVDb2x1bW4ucGFjaygpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1vdmVhYmxlIGNvbHVtbnMgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0Q29sdW1uc01vdmVhYmxlICgpIHsKLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBtb3ZlYWJsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zMSA9IHRyZWUxLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zMS5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uczFbaV0uc2V0TW92ZWFibGUoc2VsZWN0aW9uKTsKLQkJfQotCQlUcmVlQ29sdW1uW10gY29sdW1uczIgPSB0cmVlMi5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczIubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnMyW2ldLnNldE1vdmVhYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgZm9udAotCSAqIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cyB0byB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqIEFsc28gc2V0cyBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBOb2RlIDEKLQkgKiBUcmVlSXRlbXMgdG8gZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQl2b2lkIHJlc2V0Q29sb3JzQW5kRm9udHMgKCkgewotCQlzdXBlci5yZXNldENvbG9yc0FuZEZvbnRzICgpOwotCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWl0ZW1Gb250ID0gbnVsbDsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKTsKLQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKCh0cmVlMS5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCWNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUyLmdldFN0eWxlICgpICYgU1dULkNIRUNLKSAhPSAwKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0cmVlMS5nZXRTdHlsZSAoKSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodHJlZTIuZ2V0U3R5bGUgKCkgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBOb2RlIDEgVHJlZUl0ZW1zLgotCSAqLwotCXZvaWQgc2V0SXRlbUJhY2tncm91bmQgKCkgewotCQl0ZXh0Tm9kZTEuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCWltYWdlTm9kZTEuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCS8qIFNldCB0aGUgYmFja2dyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgY29sb3IganVzdCBzZXQuICovCi0JCUNvbG9yIGNvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGV4dE5vZGUxLmdldEJhY2tncm91bmQgKCk7Ci0JCWRyYXdJbWFnZSAoaXRlbUJhY2tncm91bmRJbWFnZSwgY29sb3IpOwotCQlpdGVtQmFja2dyb3VuZEJ1dHRvbi5zZXRJbWFnZSAoaXRlbUJhY2tncm91bmRJbWFnZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9yZWdyb3VuZCAoKSB7Ci0JCXRleHROb2RlMS5zZXRGb3JlZ3JvdW5kIChpdGVtRm9yZWdyb3VuZENvbG9yKTsKLQkJaW1hZ2VOb2RlMS5zZXRGb3JlZ3JvdW5kIChpdGVtRm9yZWdyb3VuZENvbG9yKTsKLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGJ1dHRvbidzIGNvbG9yIHRvIG1hdGNoIHRoZSBjb2xvciBqdXN0IHNldC4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0ZXh0Tm9kZTEuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJZHJhd0ltYWdlIChpdGVtRm9yZWdyb3VuZEltYWdlLCBjb2xvcik7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQnV0dG9uLnNldEltYWdlIChpdGVtRm9yZWdyb3VuZEltYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcy4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb250ICgpIHsKLQkJaWYgKGluc3RhbmNlLnN0YXJ0dXApIHJldHVybjsKLQkJdGV4dE5vZGUxLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJaW1hZ2VOb2RlMS5zZXRGb250IChpdGVtRm9udCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKSB7Ci0JCXRyZWUxLnNldEhlYWRlclZpc2libGUgKGhlYWRlclZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJdHJlZTIuc2V0SGVhZGVyVmlzaWJsZSAoaGVhZGVyVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsaW5lcyB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldExpbmVzVmlzaWJsZSAoKSB7Ci0JCXRyZWUxLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXRyZWUyLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMzZjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODYzNDI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9jbG9zZWRGb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvY2xvc2VkRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MGQwYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9jbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpYy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDcxZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpY19tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpY19tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMjM1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWNfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9vcGVuRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL29wZW5Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk5NDNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL29wZW5Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTYzZmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1OWMwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyMWIzYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0X21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI0OGZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3RhcmdldC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS90YXJnZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA3YWU2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3RhcmdldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlMjhlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE1ZDhiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZV9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvdy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3cuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE5YzFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvdy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3dfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3dfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTljMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ROREV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9ETkRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMmY5YWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ROREV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQ7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIEROREV4YW1wbGUgewotCQotCXByaXZhdGUgaW50IGRyYWdPcGVyYXRpb24gPSAwOwotCXByaXZhdGUgVHJhbnNmZXJbXSBkcmFnVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JcHJpdmF0ZSBDb250cm9sIGRyYWdDb250cm9sOwotCXByaXZhdGUgaW50IGRyYWdDb250cm9sVHlwZSA9IDA7Ci0JcHJpdmF0ZSBEcmFnU291cmNlIGRyYWdTb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhZ0RhdGFUZXh0OwotCXByaXZhdGUgU3RyaW5nIGRyYWdEYXRhUlRGOwotCXByaXZhdGUgU3RyaW5nIGRyYWdEYXRhSFRNTDsKLQlwcml2YXRlIFN0cmluZ1tdIGRyYWdEYXRhRmlsZXM7Ci0JcHJpdmF0ZSBMaXN0IGZpbGVMaXN0OwotCXByaXZhdGUgYm9vbGVhbiBkcmFnRW5hYmxlZCA9IGZhbHNlOwotCQotCXByaXZhdGUgaW50IGRyb3BPcGVyYXRpb24gPSAwOwotCXByaXZhdGUgaW50IGRyb3BGZWVkYmFjayA9IDA7Ci0JcHJpdmF0ZSBpbnQgZHJvcERlZmF1bHRPcGVyYXRpb24gPSAwOwotCXByaXZhdGUgVHJhbnNmZXJbXSBkcm9wVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGRyb3BUYXJnZXQ7Ci0JcHJpdmF0ZSBDb250cm9sIGRyb3BDb250cm9sOwotCXByaXZhdGUgaW50IGRyb3BDb250cm9sVHlwZSA9IDA7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZGVmYXVsdFBhcmVudDsKLQlwcml2YXRlIGJvb2xlYW4gZHJvcEVuYWJsZWQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIFRleHQgZHJhZ0NvbnNvbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGRyYWdFdmVudERldGFpbCA9IGZhbHNlOwotCXByaXZhdGUgVGV4dCBkcm9wQ29uc29sZTsKLQlwcml2YXRlIGJvb2xlYW4gZHJvcEV2ZW50RGV0YWlsID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9UT0dHTEUgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fUkFESU8gPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fQ0hFQ0sgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5WQVMgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQUJFTCA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJU1QgPSA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRSA9IDY7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSRUUgPSA3OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUID0gODsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUROREV4YW1wbGUgZXhhbXBsZSA9IG5ldyBETkRFeGFtcGxlKCk7Ci0JZXhhbXBsZS5vcGVuKGRpc3BsYXkpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wcml2YXRlIHZvaWQgYWRkRHJhZ1RyYW5zZmVyKFRyYW5zZmVyIHRyYW5zZmVyKXsKLQlUcmFuc2ZlcltdIG5ld1R5cGVzID0gbmV3IFRyYW5zZmVyW2RyYWdUeXBlcy5sZW5ndGggKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KGRyYWdUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGRyYWdUeXBlcy5sZW5ndGgpOwotCW5ld1R5cGVzW2RyYWdUeXBlcy5sZW5ndGhdID0gdHJhbnNmZXI7Ci0JZHJhZ1R5cGVzID0gbmV3VHlwZXM7Ci0JaWYgKGRyYWdTb3VyY2UgIT0gbnVsbCkgewotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKGRyYWdUeXBlcyk7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgYWRkRHJvcFRyYW5zZmVyKFRyYW5zZmVyIHRyYW5zZmVyKXsKLQlUcmFuc2ZlcltdIG5ld1R5cGVzID0gbmV3IFRyYW5zZmVyW2Ryb3BUeXBlcy5sZW5ndGggKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KGRyb3BUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGRyb3BUeXBlcy5sZW5ndGgpOwotCW5ld1R5cGVzW2Ryb3BUeXBlcy5sZW5ndGhdID0gdHJhbnNmZXI7Ci0JZHJvcFR5cGVzID0gbmV3VHlwZXM7Ci0JaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgewotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKGRyb3BUeXBlcyk7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ09wZXJhdGlvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBCdXR0b24gbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCW1vdmVCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfTU9WRSIpOwotCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWRyYWdPcGVyYXRpb24gPSBETkQuRFJPUF9NT1ZFOwotCW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcmFnT3BlcmF0aW9uID0gZHJhZ09wZXJhdGlvbiAmfkRORC5EUk9QX01PVkU7Ci0JCQkJaWYgKGRyYWdPcGVyYXRpb24gPT0gMCkgewotCQkJCQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfQ09QWSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9DT1BZOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcmFnT3BlcmF0aW9uID0gZHJhZ09wZXJhdGlvbiAmfkRORC5EUk9QX0NPUFk7Ci0JCQkJaWYgKGRyYWdPcGVyYXRpb24gPT0gMCkgewotCQkJCQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9MSU5LIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcmFnT3BlcmF0aW9uIHw9IERORC5EUk9QX0xJTks7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyYWdPcGVyYXRpb24gPSBkcmFnT3BlcmF0aW9uICZ+RE5ELkRST1BfTElOSzsKLQkJCQlpZiAoZHJhZ09wZXJhdGlvbiA9PSAwKSB7Ci0JCQkJCWRyYWdPcGVyYXRpb24gPSBETkQuRFJPUF9NT1ZFOwotCQkJCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJhZ0VuYWJsZWQpIHsKLQkJCQljcmVhdGVEcmFnU291cmNlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdTb3VyY2UoKSB7Ci0JaWYgKGRyYWdTb3VyY2UgIT0gbnVsbCkgZHJhZ1NvdXJjZS5kaXNwb3NlKCk7Ci0JZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKGRyYWdDb250cm9sLCBkcmFnT3BlcmF0aW9uKTsKLQlkcmFnU291cmNlLnNldFRyYW5zZmVyKGRyYWdUeXBlcyk7Ci0JZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlkcmFnQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ0ZpbmlzaGVkXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJZHJhZ0RhdGFUZXh0ID0gZHJhZ0RhdGFSVEYgPSBkcmFnRGF0YUhUTUwgPSBudWxsOwotCQkJZHJhZ0RhdGFGaWxlcyA9IG51bGw7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQlzd2l0Y2goZHJhZ0NvbnRyb2xUeXBlKSB7Ci0JCQkJCWNhc2UgQlVUVE9OX0NIRUNLOgotCQkJCQljYXNlIEJVVFRPTl9UT0dHTEU6Ci0JCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZHJhZ0NvbnRyb2w7Ci0JCQkJCQliLnNldFRleHQoIiIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBUQUJMRTogewotCQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgVEVYVDogewotCQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZHJhZ0NvbnRyb2w7Ci0JCQkJCQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFRSRUU6IHsKLQkJCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyYWdDb250cm9sOwotCQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaXRlbXNbaV0uZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBDQU5WQVM6IHsKLQkJCQkJCWRyYWdDb250cm9sLnNldERhdGEoIlNUUklOR1MiLCBudWxsKTsKLQkJCQkJCWRyYWdDb250cm9sLnJlZHJhdygpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBMQUJFTDogewotCQkJCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTElTVDogewotCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlpbnRbXSBpbmRpY2VzID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCQkJCQlsaXN0LnJlbW92ZShpbmRpY2VzKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlkcmFnQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ1NldERhdGFcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSBkcmFnRGF0YVRleHQ7Ci0JCQl9Ci0JCQlpZiAoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhUlRGOwotCQkJfQotCQkJaWYgKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFIVE1MOwotCQkJfQotCQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFGaWxlczsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWRyYWdDb25zb2xlLmFwcGVuZCgiPj5kcmFnU3RhcnRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlkcmFnRGF0YUZpbGVzID0gZmlsZUxpc3QuZ2V0SXRlbXMoKTsKLQkJCXN3aXRjaChkcmFnQ29udHJvbFR5cGUpIHsKLQkJCQljYXNlIEJVVFRPTl9DSEVDSzoKLQkJCQljYXNlIEJVVFRPTl9UT0dHTEU6Ci0JCQkJY2FzZSBCVVRUT05fUkFESU86IHsKLQkJCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWRyYWdDb250cm9sOwotCQkJCQlkcmFnRGF0YVRleHQgPSBiLmdldFNlbGVjdGlvbigpID8gInRydWUiIDogImZhbHNlIjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEFCTEU6IHsKLQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpZHJhZ0NvbnRyb2w7Ci0JCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDEgJiYgaSA8IGl0ZW1zLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBURVhUOiB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmcgcyA9IHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRSRUU6IHsKLQkJCQkJVHJlZSB0cmVlID0gKFRyZWUpZHJhZ0NvbnRyb2w7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAxICYmIGkgPCBpdGVtcy5sZW5ndGggLSAxKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSAoU3RyaW5nW10pZHJhZ0NvbnRyb2wuZ2V0RGF0YSgiU1RSSU5HUyIpOwotCQkJCQlpZiAoc3RyaW5ncyA9PSBudWxsIHx8IHN0cmluZ3MubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHN0cmluZ3NbaV0pOwotCQkJCQkJCWlmIChzdHJpbmdzLmxlbmd0aCA+IDEgJiYgaSA8IHN0cmluZ3MubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIExBQkVMOiB7Ci0JCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmcgc3RyaW5nID0gbGFiZWwuZ2V0VGV4dCgpOwotCQkJCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRyYWdEYXRhVGV4dCA9IHN0cmluZzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMSVNUOiB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmdbXSBzZWxlY3Rpb24gPSBsaXN0LmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHNlbGVjdGlvbltpXSk7Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAxICYmIGkgPCBzZWxlY3Rpb24ubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgU1dURXJyb3IoU1dULkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQl9Ci0JCQlpZiAoZHJhZ0RhdGFUZXh0ICE9IG51bGwpIHsKLQkJCQlkcmFnRGF0YVJURiA9ICJ7XFxydGYxe1xcY29sb3J0Ymw7XFxyZWQyNTVcXGdyZWVuMFxcYmx1ZTA7fVxcY2YxXFxiICIrZHJhZ0RhdGFUZXh0KyJ9IjsKLQkJCQlkcmFnRGF0YUhUTUwgPSAiPGI+IitkcmFnRGF0YVRleHQrIjwvYj4iOwotCQkJfQotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRyYWdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBUZXh0VHJhbnNmZXIgJiYgZHJhZ0RhdGFUZXh0ID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgUlRGVHJhbnNmZXIgJiYgZHJhZ0RhdGFSVEYgPT0gbnVsbCkgewotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBIVE1MVHJhbnNmZXIgJiYgZHJhZ0RhdGFIVE1MID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgRmlsZVRyYW5zZmVyICYmIChkcmFnRGF0YUZpbGVzID09IG51bGwgfHwgZHJhZ0RhdGFGaWxlcy5sZW5ndGggPT0gMCkpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ1R5cGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJUZXh0IFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcmFnVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcmFnVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiUlRGIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcmFnVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkhUTUwgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGaWxlIFRyYW5zZmVyIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlNlbGVjdCBGaWxlKHMpIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGZpbGVMaXN0LmdldFNoZWxsKCksIFNXVC5PUEVOIHwgU1dULk1VTFRJKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCWZpbGVMaXN0LnJlbW92ZUFsbCgpOwotCQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJCVN0cmluZ1tdIG5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmlsZUxpc3QuYWRkKHBhdGgrc2VwYXJhdG9yK25hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlmaWxlTGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCWZpbGVMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcmFnV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JY29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiVG9nZ2xlIEJ1dHRvbiIsICJSYWRpbyBCdXR0b24iLCAiQ2hlY2tib3giLCAiQ2FudmFzIiwgIkxhYmVsIiwgIkxpc3QiLCAiVGFibGUiLCAiVHJlZSJ9KTsKLQljb21iby5zZWxlY3QoTEFCRUwpOwotCWRyYWdDb250cm9sVHlwZSA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JZHJhZ0NvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJhZ0NvbnRyb2xUeXBlLCBwYXJlbnQsICJEcmFnIFNvdXJjZSIpOwotCQotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3QgZGF0YSA9IGRyYWdDb250cm9sLmdldExheW91dERhdGEoKTsKLQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBkcmFnQ29udHJvbC5nZXRQYXJlbnQoKTsKLQkJCWRyYWdDb250cm9sLmRpc3Bvc2UoKTsKLQkJCUNvbWJvIGMgPSAoQ29tYm8pZS53aWRnZXQ7IAotCQkJZHJhZ0NvbnRyb2xUeXBlID0gYy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZHJhZ0NvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJhZ0NvbnRyb2xUeXBlLCBwYXJlbnQsICJEcmFnIFNvdXJjZSIpOwotCQkJZHJhZ0NvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWlmIChkcmFnRW5hYmxlZCkgY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJcGFyZW50LmxheW91dCgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRyYWdTb3VyY2UiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlkcmFnRW5hYmxlZCA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoZHJhZ0VuYWJsZWQpIHsKLQkJCQljcmVhdGVEcmFnU291cmNlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkcmFnU291cmNlICE9IG51bGwpewotCQkJCQlkcmFnU291cmNlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJZHJhZ1NvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZHJhZ0NvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgMTApOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BPcGVyYXRpb25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgQnV0dG9uIG1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQltb3ZlQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX01PVkUiKTsKLQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlkcm9wT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQltb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiA9IGRyb3BPcGVyYXRpb24gJiB+RE5ELkRST1BfTU9WRTsKLQkJCQlpZiAoZHJvcE9wZXJhdGlvbiA9PSAwIHx8IChkcm9wRGVmYXVsdE9wZXJhdGlvbiAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwotCQkJCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQotCWZpbmFsIEJ1dHRvbiBjb3B5QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JY29weUJ1dHRvbi5zZXRUZXh0KCJETkQuRFJPUF9DT1BZIik7Ci0JY29weUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0NPUFk7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX0NPUFk7Ci0JCQkJaWYgKGRyb3BPcGVyYXRpb24gPT0gMCB8fCAoZHJvcERlZmF1bHRPcGVyYXRpb24gJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWRyb3BPcGVyYXRpb24gPSBETkQuRFJPUF9DT1BZOwotCQkJCQljb3B5QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWZpbmFsIEJ1dHRvbiBsaW5rQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JbGlua0J1dHRvbi5zZXRUZXh0KCJETkQuRFJPUF9MSU5LIik7Ci0JbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0xJTks7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX0xJTks7Ci0JCQkJaWYgKGRyb3BPcGVyYXRpb24gPT0gMCB8fCAoZHJvcERlZmF1bHRPcGVyYXRpb24gJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWRyb3BPcGVyYXRpb24gPSBETkQuRFJPUF9MSU5LOwotCQkJCQlsaW5rQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfREVGQVVMVCIpOwotCWRlZmF1bHRQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9ERUZBVUxUOwotCQkJCWRlZmF1bHRQYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiA9IGRyb3BPcGVyYXRpb24gJiB+RE5ELkRST1BfREVGQVVMVDsKLQkJCQlkZWZhdWx0UGFyZW50LnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JZGVmYXVsdFBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gMjA7Ci0JZGVmYXVsdFBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZWZhdWx0UGFyZW50LCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiVmFsdWUgZm9yIGRlZmF1bHQgb3BlcmF0aW9uIGlzOiIpOwotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9NT1ZFIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwotCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oZGVmYXVsdFBhcmVudCwgU1dULlJBRElPKTsKLQliLnNldFRleHQoIkRORC5EUk9QX0NPUFkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BEZWZhdWx0T3BlcmF0aW9uID0gRE5ELkRST1BfQ09QWTsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0NPUFk7Ci0JCQkJY29weUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9MSU5LIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX0xJTks7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9MSU5LOwotCQkJCWxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oZGVmYXVsdFBhcmVudCwgU1dULlJBRElPKTsKLQliLnNldFRleHQoIkRORC5EUk9QX05PTkUiKTsKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BEZWZhdWx0T3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLQkJCQlkcm9wT3BlcmF0aW9uICY9IH5ETkQuRFJPUF9ERUZBVUxUOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wVGFyZ2V0KCkgewotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIGRyb3BUYXJnZXQuZGlzcG9zZSgpOwotCWRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldChkcm9wQ29udHJvbCwgZHJvcE9wZXJhdGlvbik7Ci0JZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnRW50ZXJcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBkcm9wRGVmYXVsdE9wZXJhdGlvbjsKLQkJCX0KLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJvcEZlZWRiYWNrOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnTGVhdmVcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ09wZXJhdGlvbkNoYW5nZWRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBkcm9wRGVmYXVsdE9wZXJhdGlvbjsKLQkJCX0KLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJvcEZlZWRiYWNrOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyYWdPdmVyXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJZXZlbnQuZmVlZGJhY2sgPSBkcm9wRmVlZGJhY2s7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcm9wXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJU3RyaW5nW10gc3RyaW5ncyA9IG51bGw7Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkgfHwKLQkJCSAgICBSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpIHx8Ci0JCQkgICAgSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCSAgICBzdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsoU3RyaW5nKWV2ZW50LmRhdGF9OwotCQkJfQotCQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJc3RyaW5ncyA9IChTdHJpbmdbXSlldmVudC5kYXRhOwotCQkJfQotCQkJaWYgKHN0cmluZ3MgPT0gbnVsbCB8fCBzdHJpbmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJZHJvcENvbnNvbGUuYXBwZW5kKCIhIUludmFsaWQgZGF0YSBkcm9wcGVkIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAoc3RyaW5ncy5sZW5ndGggPT0gMSAmJiAoZHJvcENvbnRyb2xUeXBlID09IFRBQkxFIHx8IAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BDb250cm9sVHlwZSA9PSBUUkVFIHx8IAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BDb250cm9sVHlwZSA9PSBMSVNUKSkgewotCQkJCS8vIGNvbnZlcnQgc3RyaW5nIHNlcGFyYXRlZCBieSAiXG4iIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyAKLQkJCQlTdHJpbmcgc3RyaW5nID0gc3RyaW5nc1swXTsKLQkJCQlpbnQgY291bnQgPSAwOwotCQkJCWludCBvZmZzZXQgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCAwKTsKLQkJCQl3aGlsZSAob2Zmc2V0ID4gMCkgewotCQkJCQljb3VudCsrOwotCQkJCQlvZmZzZXQgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCBvZmZzZXQgKyAxKTsKLQkJCQl9Ci0JCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCQlzdHJpbmdzID0gbmV3IFN0cmluZ1tjb3VudCArIDFdOwotCQkJCQlpbnQgc3RhcnQgPSAwOwotCQkJCQlpbnQgZW5kID0gc3RyaW5nLmluZGV4T2YoIlxuIik7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJCQkJc3RyaW5nc1tpbmRleCsrXSA9IHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJCQlzdGFydCA9IGVuZCArIDE7Ci0JCQkJCQllbmQgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCBzdGFydCk7Ci0JCQkJCQlpZiAoZW5kID09IC0xKSBlbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2goZHJvcENvbnRyb2xUeXBlKSB7Ci0JCQkJY2FzZSBCVVRUT05fQ0hFQ0s6Ci0JCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbilkcm9wQ29udHJvbDsKLQkJCQkJYi5zZXRUZXh0KHN0cmluZ3NbMF0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUQUJMRTogewotCQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSlkcm9wQ29udHJvbDsKLQkJCQkJUG9pbnQgcCA9IGV2ZW50LmRpc3BsYXkubWFwKG51bGwsIHRhYmxlLCBldmVudC54LCBldmVudC55KTsKLQkJCQkJVGFibGVJdGVtIGRyb3BJdGVtID0gdGFibGUuZ2V0SXRlbShwKTsKLQkJCQkJaW50IGluZGV4ID0gZHJvcEl0ZW0gPT0gbnVsbCA/IHRhYmxlLmdldEl0ZW1Db3VudCgpIDogdGFibGUuaW5kZXhPZihkcm9wSXRlbSk7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoMCwgc3RyaW5nc1tpXSk7Ci0JCQkJCQlpdGVtLnNldFRleHQoMSwgImRyb3BwZWQgaXRlbSIpOwotCQkJCQl9Ci0JCQkJCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQljb2x1bW5zW2ldLnBhY2soKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBURVhUOiB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyb3BDb250cm9sOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJdGV4dC5hcHBlbmQoc3RyaW5nc1tpXSsiXG4iKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyb3BDb250cm9sOwotCQkJCQlQb2ludCBwID0gZXZlbnQuZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSB0cmVlLmdldEl0ZW0ocCk7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUcmVlSXRlbSBpdGVtID0gcGFyZW50SXRlbSAhPSBudWxsID8gbmV3IFRyZWVJdGVtKHBhcmVudEl0ZW0sIFNXVC5OT05FKSA6IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJCQlpdGVtLnNldFRleHQoc3RyaW5nc1tpXSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCWRyb3BDb250cm9sLnNldERhdGEoIlNUUklOR1MiLCBzdHJpbmdzKTsKLQkJCQkJZHJvcENvbnRyb2wucmVkcmF3KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIExBQkVMOiB7Ci0JCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyb3BDb250cm9sOwotCQkJCQlsYWJlbC5zZXRUZXh0KHN0cmluZ3NbMF0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMSVNUOiB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyb3BDb250cm9sOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJbGlzdC5hZGQoc3RyaW5nc1tpXSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBTV1RFcnJvcihTV1QuRVJST1JfTk9UX0lNUExFTUVOVEVEKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyb3BBY2NlcHRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUZlZWRiYWNrVHlwZXMoR3JvdXAgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19TRUxFQ1QiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0VMRUNUOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19TQ1JPTEwiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0NST0xMOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19JTlNFUlRfQkVGT1JFIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BGZWVkYmFjayAmPSB+RE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19JTlNFUlRfQUZURVIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19FWFBBTkQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19FWFBBTkQ7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJUZXh0IFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiUlRGIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyb3BUcmFuc2ZlcihSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkhUTUwgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyb3BUcmFuc2ZlcihIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyb3BUcmFuc2ZlcihIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGaWxlIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JY29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiVG9nZ2xlIEJ1dHRvbiIsICJSYWRpbyBCdXR0b24iLCAiQ2hlY2tib3giLCAiQ2FudmFzIiwgIkxhYmVsIiwgIkxpc3QiLCAiVGFibGUiLCAiVHJlZSIsICJUZXh0In0pOwotCWNvbWJvLnNlbGVjdChMQUJFTCk7Ci0JZHJvcENvbnRyb2xUeXBlID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQlkcm9wQ29udHJvbCA9IGNyZWF0ZVdpZGdldChkcm9wQ29udHJvbFR5cGUsIHBhcmVudCwgIkRyb3AgVGFyZ2V0Iik7Ci0JY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBkYXRhID0gZHJvcENvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCQkJQ29tcG9zaXRlIHBhcmVudCA9IGRyb3BDb250cm9sLmdldFBhcmVudCgpOwotCQkJZHJvcENvbnRyb2wuZGlzcG9zZSgpOwotCQkJQ29tYm8gYyA9IChDb21ibyllLndpZGdldDsKLQkJCWRyb3BDb250cm9sVHlwZSA9IGMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsgCi0JCQlkcm9wQ29udHJvbCA9IGNyZWF0ZVdpZGdldChkcm9wQ29udHJvbFR5cGUsIHBhcmVudCwgIkRyb3AgVGFyZ2V0Iik7Ci0JCQlkcm9wQ29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJaWYgKGRyb3BFbmFibGVkKSBjcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQlwYXJlbnQubGF5b3V0KCk7Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRHJvcFRhcmdldCIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWRyb3BFbmFibGVkID0gYi5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCl7Ci0JCQkJCWRyb3BUYXJnZXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlkcm9wVGFyZ2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0pOwotCQotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkcm9wQ29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAxMCk7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotfQotCi1wcml2YXRlIENvbnRyb2wgY3JlYXRlV2lkZ2V0KGludCB0eXBlLCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgcHJlZml4KXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBCVVRUT05fQ0hFQ0s6IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCWJ1dHRvbi5zZXRUZXh0KHByZWZpeCsiIENoZWNrIGJveCIpOwotCQkJcmV0dXJuIGJ1dHRvbjsKLQkJfQotCQljYXNlIEJVVFRPTl9UT0dHTEU6IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlRPR0dMRSk7Ci0JCQlidXR0b24uc2V0VGV4dChwcmVmaXgrIiBUb2dnbGUgYnV0dG9uIik7Ci0JCQlyZXR1cm4gYnV0dG9uOwotCQl9Ci0JCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCQlidXR0b24uc2V0VGV4dChwcmVmaXgrIiBSYWRpbyBidXR0b24iKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQkJY2FzZSBUQUJMRTogewotCQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCgwLCBwcmVmaXgrIiBuYW1lICIgKyBpKTsKLQkJCQlpdGVtLnNldFRleHQoMSwgcHJlZml4KyIgdmFsdWUgIiArIGkpOwotCQkJfQotCQkJY29sdW1uMS5wYWNrKCk7Ci0JCQljb2x1bW4yLnBhY2soKTsKLQkJCXJldHVybiB0YWJsZTsKLQkJfQotCQljYXNlIFRFWFQ6IHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQl0ZXh0LnNldFRleHQocHJlZml4KyIgVGV4dCIpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJY2FzZSBUUkVFOiB7Ci0JCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQocHJlZml4KyIgaXRlbSAiICsgaSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCXN1Ykl0ZW0uc2V0VGV4dChwcmVmaXgrIiBpdGVtICIgKyBqKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKLQkJCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KHByZWZpeCsiIGl0ZW0gIiArIGspOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRyZWU7Ci0JCX0KLQkJY2FzZSBDQU5WQVM6IHsKLQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQljYW52YXMuc2V0RGF0YSgiU1RSSU5HUyIsIG5ldyBTdHJpbmdbXSB7cHJlZml4KyIgQ2FudmFzIHdpZGdldCJ9KTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJQ2FudmFzIGMgPSAoQ2FudmFzKWUud2lkZ2V0OwotCQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSljLmdldERhdGEoIklNQUdFIik7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgNSwgNSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdbXSBzdHJpbmdzID0gKFN0cmluZ1tdKWMuZ2V0RGF0YSgiU1RSSU5HUyIpOwotCQkJCQkJaWYgKHN0cmluZ3MgIT0gbnVsbCkgewotCQkJCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBlLmdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJCQkJaW50IGhlaWdodCA9IG1ldHJpY3MuZ2V0SGVpZ2h0KCk7Ci0JCQkJCQkJaW50IHkgPSA1OwotCQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWUuZ2MuZHJhd1N0cmluZyhzdHJpbmdzW2ldLCA1LCB5KTsKLQkJCQkJCQkJeSArPSBoZWlnaHQgKyA1OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIGNhbnZhczsKLQkJfQotCQljYXNlIExBQkVMOiB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJbGFiZWwuc2V0VGV4dChwcmVmaXgrIiBMYWJlbCIpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0JCWNhc2UgTElTVDogewotCQkJTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWxpc3Quc2V0SXRlbXMobmV3IFN0cmluZ1tdIHtwcmVmaXgrIiBJdGVtIGEiLCBwcmVmaXgrIiBJdGVtIGIiLCAgcHJlZml4KyIgSXRlbSBjIiwgIHByZWZpeCsiIEl0ZW0gZCJ9KTsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgU1dURXJyb3IoU1dULkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkRyYWcgYW5kIERyb3AgRXhhbXBsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCXNjLnNldENvbnRlbnQocGFyZW50KTsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQotCUxhYmVsIGRyYWdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQlkcmFnTGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2U6Iik7Ci0JCi0JR3JvdXAgZHJhZ1dpZGdldEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWRyYWdXaWRnZXRHcm91cC5zZXRUZXh0KCJXaWRnZXQiKTsKLQljcmVhdGVEcmFnV2lkZ2V0KGRyYWdXaWRnZXRHcm91cCk7Ci0JCi0JQ29tcG9zaXRlIGNMZWZ0ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljTGVmdC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQlHcm91cCBkcmFnT3BlcmF0aW9uc0dyb3VwID0gbmV3IEdyb3VwKGNMZWZ0LCBTV1QuTk9ORSk7Ci0JZHJhZ09wZXJhdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCWRyYWdPcGVyYXRpb25zR3JvdXAuc2V0VGV4dCgiQWxsb3dlZCBPcGVyYXRpb24ocyk6Iik7Ci0JY3JlYXRlRHJhZ09wZXJhdGlvbnMoZHJhZ09wZXJhdGlvbnNHcm91cCk7Ci0JCi0JR3JvdXAgZHJhZ1R5cGVzR3JvdXAgPSBuZXcgR3JvdXAoY0xlZnQsIFNXVC5OT05FKTsKLQlkcmFnVHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQlkcmFnVHlwZXNHcm91cC5zZXRUZXh0KCJUcmFuc2ZlciBUeXBlKHMpOiIpOwotCWNyZWF0ZURyYWdUeXBlcyhkcmFnVHlwZXNHcm91cCk7Ci0JCi0JZHJhZ0NvbnNvbGUgPSBuZXcgVGV4dChjTGVmdCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIgfFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JZHJhZ0NvbnNvbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiQ2xlYXIiKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlkcmFnQ29uc29sZS5zZXRUZXh0KCIiKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DSEVDSyk7Ci0JaXRlbS5zZXRUZXh0ICgiU2hvdyBFdmVudCBkZXRhaWwiKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKWUud2lkZ2V0OwotCQkJZHJhZ0V2ZW50RGV0YWlsID0gaXRlbS5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCX0pOwotCWRyYWdDb25zb2xlLnNldE1lbnUobWVudSk7Ci0JCi0JTGFiZWwgZHJvcExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCWRyb3BMYWJlbC5zZXRUZXh0KCJEcm9wIFRhcmdldDoiKTsKLQkKLQlHcm91cCBkcm9wV2lkZ2V0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JZHJvcFdpZGdldEdyb3VwLnNldFRleHQoIldpZGdldCIpOwotCWNyZWF0ZURyb3BXaWRnZXQoZHJvcFdpZGdldEdyb3VwKTsKLQkKLQlDb21wb3NpdGUgY1JpZ2h0ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljUmlnaHQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgZHJvcE9wZXJhdGlvbnNHcm91cCA9IG5ldyBHcm91cChjUmlnaHQsIFNXVC5OT05FKTsKLQlkcm9wT3BlcmF0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAyKSk7Ci0JZHJvcE9wZXJhdGlvbnNHcm91cC5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbihzKToiKTsKLQljcmVhdGVEcm9wT3BlcmF0aW9ucyhkcm9wT3BlcmF0aW9uc0dyb3VwKTsKLQkKLQlHcm91cCBkcm9wVHlwZXNHcm91cCA9IG5ldyBHcm91cChjUmlnaHQsIFNXVC5OT05FKTsKLQlkcm9wVHlwZXNHcm91cC5zZXRUZXh0KCJUcmFuc2ZlciBUeXBlKHMpOiIpOwotCWNyZWF0ZURyb3BUeXBlcyhkcm9wVHlwZXNHcm91cCk7Ci0JCi0JR3JvdXAgZmVlZGJhY2tUeXBlc0dyb3VwID0gbmV3IEdyb3VwKGNSaWdodCwgU1dULk5PTkUpOwotCWZlZWRiYWNrVHlwZXNHcm91cC5zZXRUZXh0KCJGZWVkYmFjayBUeXBlKHMpOiIpOwotCWNyZWF0ZUZlZWRiYWNrVHlwZXMoZmVlZGJhY2tUeXBlc0dyb3VwKTsKLQkKLQlkcm9wQ29uc29sZSA9IG5ldyBUZXh0KGNSaWdodCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIgfFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JZHJvcENvbnNvbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIkNsZWFyIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJZHJvcENvbnNvbGUuc2V0VGV4dCgiIik7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0hFQ0spOwotCWl0ZW0uc2V0VGV4dCAoIlNob3cgRXZlbnQgZGV0YWlsIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCWRyb3BFdmVudERldGFpbCA9IGl0ZW0uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQl9KTsKLQlkcm9wQ29uc29sZS5zZXRNZW51KG1lbnUpOwotCQotCWludCBoZWlnaHQgPSAyMDA7Ci0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRyYWdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcmFnTGFiZWwsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIC0xMCk7Ci0JZGF0YS5oZWlnaHQgPSBoZWlnaHQ7Ci0JZHJhZ1dpZGdldEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRyYWdXaWRnZXRHcm91cCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgLTEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JY0xlZnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMZWZ0LCAxMCk7Ci0JZHJvcExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRyb3BMYWJlbCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGVmdCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEuaGVpZ2h0ID0gaGVpZ2h0OwotCWRyb3BXaWRnZXRHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcm9wV2lkZ2V0R3JvdXAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xlZnQsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JY1JpZ2h0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCXNjLnNldE1pblNpemUocGFyZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCXNjLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCi0JUG9pbnQgc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUmVjdGFuZ2xlIG1vbml0b3JBcmVhID0gc2hlbGwuZ2V0TW9uaXRvcigpLmdldENsaWVudEFyZWEoKTsKLQlzaGVsbC5zZXRTaXplKE1hdGgubWluKHNpemUueCwgbW9uaXRvckFyZWEud2lkdGggLSAyMCksIE1hdGgubWluKHNpemUueSwgbW9uaXRvckFyZWEuaGVpZ2h0IC0gMjApKTsKLQlzaGVsbC5vcGVuKCk7Ci0JCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9CQotfQotCi1wcml2YXRlIHZvaWQgcHJpbnRFdmVudChEcmFnU291cmNlRXZlbnQgZSkgewotCWlmICghZHJhZ0V2ZW50RGV0YWlsKSByZXR1cm47Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXNiLmFwcGVuZCgid2lkZ2V0OiAiKTsgc2IuYXBwZW5kKGUud2lkZ2V0KTsKLQlzYi5hcHBlbmQoIiwgdGltZTogIik7IHNiLmFwcGVuZChlLnRpbWUpOwotCXNiLmFwcGVuZCgiLCBvcGVyYXRpb246ICIpOyBzYi5hcHBlbmQoZS5kZXRhaWwpOwotCXNiLmFwcGVuZCgiLCB0eXBlOiAiKTsgc2IuYXBwZW5kKGUuZGF0YVR5cGUgIT0gbnVsbCA/IGUuZGF0YVR5cGUudHlwZSA6IDApOwotCXNiLmFwcGVuZCgiLCBkb2l0OiAiKTsgc2IuYXBwZW5kKGUuZG9pdCk7Ci0Jc2IuYXBwZW5kKCIsIGRhdGE6ICIpOyBzYi5hcHBlbmQoZS5kYXRhKTsKLQlzYi5hcHBlbmQoIlxuIik7Ci0JZHJhZ0NvbnNvbGUuYXBwZW5kKHNiLnRvU3RyaW5nKCkpOwotfQotCi1wcml2YXRlIHZvaWQgcHJpbnRFdmVudChEcm9wVGFyZ2V0RXZlbnQgZSkgewotCWlmICghZHJvcEV2ZW50RGV0YWlsKSByZXR1cm47Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXNiLmFwcGVuZCgid2lkZ2V0OyAiKTsgc2IuYXBwZW5kKGUud2lkZ2V0KTsKLQlzYi5hcHBlbmQoIiwgdGltZTogIik7IHNiLmFwcGVuZChlLnRpbWUpOwotCXNiLmFwcGVuZCgiLCB4OiAiKTsgc2IuYXBwZW5kKGUueCk7Ci0Jc2IuYXBwZW5kKCIsIHk6ICIpOyBzYi5hcHBlbmQoZS55KTsKLQlzYi5hcHBlbmQoIiwgaXRlbTogIik7IHNiLmFwcGVuZChlLml0ZW0pOwotCXNiLmFwcGVuZCgiLCBvcGVyYXRpb25zOiAiKTsgc2IuYXBwZW5kKGUub3BlcmF0aW9ucyk7Ci0Jc2IuYXBwZW5kKCIsIG9wZXJhdGlvbjogIik7IHNiLmFwcGVuZChlLmRldGFpbCk7Ci0Jc2IuYXBwZW5kKCIsIGZlZWRiYWNrOiAiKTsgc2IuYXBwZW5kKGUuZmVlZGJhY2spOwotCWlmIChlLmRhdGFUeXBlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZS5kYXRhVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZCgiLCBkYXRhVHlwZSAiKTsgc2IuYXBwZW5kKGkpOyBzYi5hcHBlbmQoIjogIik7IHNiLmFwcGVuZChlLmRhdGFUeXBlc1tpXS50eXBlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXNiLmFwcGVuZCgiLCBkYXRhVHlwZXM6IG5vbmUiKTsKLQl9Ci0Jc2IuYXBwZW5kKCIsIGN1cnJlbnREYXRhVHlwZTogIik7IHNiLmFwcGVuZChlLmN1cnJlbnREYXRhVHlwZSk7Ci0Jc2IuYXBwZW5kKCIsIGRhdGE6ICIpOyBzYi5hcHBlbmQoZS5kYXRhKTsKLQlzYi5hcHBlbmQoIlxuIik7Ci0JZHJvcENvbnNvbGUuYXBwZW5kKHNiLnRvU3RyaW5nKCkpOwotfQotCi1wcml2YXRlIHZvaWQgcmVtb3ZlRHJhZ1RyYW5zZmVyKFRyYW5zZmVyIHRyYW5zZmVyKXsKLQlpZiAoZHJhZ1R5cGVzLmxlbmd0aCA9PSAxKSB7Ci0JCWRyYWdUeXBlcyA9IG5ldyBUcmFuc2ZlclswXTsKLQl9IGVsc2UgewotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGRyYWdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRyYWdUeXBlc1tpXSA9PSB0cmFuc2ZlcikgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQkJVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2ZlcltkcmFnVHlwZXMubGVuZ3RoIC0gMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZHJhZ1R5cGVzLCAwLCBuZXdUeXBlcywgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyYWdUeXBlcywgaW5kZXggKyAxLCBuZXdUeXBlcywgaW5kZXgsIGRyYWdUeXBlcy5sZW5ndGggLSBpbmRleCAtIDEpOwotCQlkcmFnVHlwZXMgPSBuZXdUeXBlczsKLQl9Ci0JaWYgKGRyYWdTb3VyY2UgIT0gbnVsbCkgewotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKGRyYWdUeXBlcyk7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgcmVtb3ZlRHJvcFRyYW5zZmVyKFRyYW5zZmVyIHRyYW5zZmVyKXsKLQlpZiAoZHJvcFR5cGVzLmxlbmd0aCA9PSAxKSB7Ci0JCWRyb3BUeXBlcyA9IG5ldyBUcmFuc2ZlclswXTsKLQl9IGVsc2UgewotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGRyb3BUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRyb3BUeXBlc1tpXSA9PSB0cmFuc2ZlcikgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQkJVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2Zlcltkcm9wVHlwZXMubGVuZ3RoIC0gMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZHJvcFR5cGVzLCAwLCBuZXdUeXBlcywgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyb3BUeXBlcywgaW5kZXggKyAxLCBuZXdUeXBlcywgaW5kZXgsIGRyb3BUeXBlcy5sZW5ndGggLSBpbmRleCAtIDEpOwotCQlkcm9wVHlwZXMgPSBuZXdUeXBlczsKLQl9Ci0JaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgewotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKGRyb3BUeXBlcyk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ltYWdlVHJhbnNmZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9JbWFnZVRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZjdlZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ltYWdlVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kOwotCi0gCi0vKioKLSAqIFRyYW5zZmVyIHR5cGUgdG8gdHJhbnNmZXIgU1dUIEltYWdlRGF0YSBvYmplY3RzLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRU5BTUUgPSAiaW1hZ2VkYXRhIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRUlEID0gcmVnaXN0ZXJUeXBlKFRZUEVOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBJbWFnZVRyYW5zZmVyKCk7Ci0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VUcmFuc2ZlciBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja0ltYWdlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQl9Ci0JSW1hZ2VEYXRhIGltZGF0YSA9IChJbWFnZURhdGEpb2JqZWN0OwotCXRyeSB7Ci0JCS8vIHdyaXRlIGRhdGEgdG8gYSBieXRlIGFycmF5IGFuZCB0aGVuIGFzayBzdXBlciB0byBjb252ZXJ0IHRvIHBNZWRpdW0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQlsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGEgW10ge2ltZGF0YX07Ci0JCWxvYWRlci5zYXZlKHdyaXRlT3V0LCBTV1QuSU1BR0VfQk1QKTsKLQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwotCQlvdXQuY2xvc2UoKTsKLQl9IAotCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfQotfQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSl7CQotCWlmICghaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHJldHVybiBudWxsOwotCQkKLQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSlzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCQotCUltYWdlRGF0YSBpbWRhdGE7Ci0JdHJ5IHsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKTsKLQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQlpbWRhdGEgPSBuZXcgSW1hZ2VEYXRhKHJlYWRJbik7Ci0JCXJlYWRJbi5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlyZXR1cm4gaW1kYXRhOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuZXcgU3RyaW5nW117VFlQRU5BTUV9OwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gbmV3IGludFtdIHtUWVBFSUR9OwotfQotYm9vbGVhbiBjaGVja0ltYWdlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gKG9iamVjdCAhPSBudWxsICAmJiBvYmplY3QgaW5zdGFuY2VvZiBJbWFnZURhdGEpOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCXJldHVybiBjaGVja0ltYWdlKG9iamVjdCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvRmlsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzExMGE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvRmlsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogRmlsZSBWaWV3ZXIgZXhhbXBsZQotICovCi1wdWJsaWMgY2xhc3MgRmlsZVZpZXdlciB7IAotIAlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfZmlsZXZpZXdlciIpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERSSVZFX0EgPSAiYToiICsgRmlsZS5zZXBhcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERSSVZFX0IgPSAiYjoiICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQkvKiBVSSBlbGVtZW50cyAqLyAJCi0JcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7IAotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBUb29sQmFyIHRvb2xCYXI7Ci0KLQlwcml2YXRlIExhYmVsIG51bU9iamVjdHNMYWJlbDsKLQlwcml2YXRlIExhYmVsIGRpc2tTcGFjZUxhYmVsOwotCQotCXByaXZhdGUgRmlsZSBjdXJyZW50RGlyZWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbCA9IHRydWU7Ci0JCi0JLyogRHJhZyBhbmQgZHJvcCBvcHRpbWl6YXRpb25zICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gaWYgdGhpcyBhcHAgaXMgZHJhZ2dpbmcKLQlwcml2YXRlIGJvb2xlYW4gaXNEcm9wcGluZyA9IGZhbHNlOyAvLyBpZiB0aGlzIGFwcCBpcyBkcm9wcGluZwotCi0JcHJpdmF0ZSBGaWxlW10gIHByb2Nlc3NlZERyb3BGaWxlcyA9IG51bGw7IC8vIHNvIERyYWcgb25seSBkZWxldGVzIHdoYXQgaXQgbmVlZHMgdG8KLQlwcml2YXRlIEZpbGVbXSAgZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBudWxsOyAgICAgIC8vIHRvIGRlZmVyIG5vdGlmeVJlZnJlc2hGaWxlcyB3aGlsZSB3ZSBkbyBETkQKLQlwcml2YXRlIGJvb2xlYW4gZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkID0gZmFsc2U7IC8vIHRvIGRlZmVyIG5vdGlmeVJlZnJlc2hGaWxlcyB3aGlsZSB3ZSBkbyBETkQKLQlwcml2YXRlIFByb2dyZXNzRGlhbG9nIHByb2dyZXNzRGlhbG9nID0gbnVsbDsgLy8gcHJvZ3Jlc3MgZGlhbG9nIGZvciBsb2NhbGx5LWluaXRpYXRlZCBvcGVyYXRpb25zCi0KLQkvKiBDb21ibyB2aWV3ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJPREFUQV9ST09UUyA9ICJDb21iby5yb290cyI7Ci0JCS8vIEZpbGVbXTogQXJyYXkgb2YgZmlsZXMgd2hvc2UgcGF0aHMgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJPREFUQV9MQVNUVEVYVCA9ICJDb21iby5sYXN0VGV4dCI7Ci0JCS8vIFN0cmluZzogUHJldmlvdXMgc2VsZWN0aW9uIHRleHQgc3RyaW5nCi0KLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCi0JLyogVHJlZSB2aWV3ICovCi0JcHJpdmF0ZSBJY29uQ2FjaGUgaWNvbkNhY2hlID0gbmV3IEljb25DYWNoZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfRklMRSA9ICJUcmVlSXRlbS5maWxlIjsKLQkJLy8gRmlsZTogRmlsZSBhc3NvY2lhdGVkIHdpdGggdHJlZSBpdGVtCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVEID0gIlRyZWVJdGVtLmltYWdlRXhwYW5kZWQiOwotCQkvLyBJbWFnZTogc2hvd24gd2hlbiBpdGVtIGlzIGV4cGFuZGVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9JTUFHRUNPTExBUFNFRCA9ICJUcmVlSXRlbS5pbWFnZUNvbGxhcHNlZCI7Ci0JCS8vIEltYWdlOiBzaG93biB3aGVuIGl0ZW0gaXMgY29sbGFwc2VkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9TVFVCID0gIlRyZWVJdGVtLnN0dWIiOwotCQkvLyBPYmplY3Q6IGlmIG5vdCBwcmVzZW50IG9yIG51bGwgdGhlbiB0aGUgaXRlbSBoYXMgbm90IGJlZW4gcG9wdWxhdGVkCi0KLQlwcml2YXRlIFRyZWUgdHJlZTsKLQlwcml2YXRlIExhYmVsIHRyZWVTY29wZUxhYmVsOwotCi0JLyogVGFibGUgdmlldyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgKLQkJRGF0ZUZvcm1hdC5NRURJVU0sIERhdGVGb3JtYXQuTUVESVVNKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVJVEVNREFUQV9GSUxFID0gIlRhYmxlSXRlbS5maWxlIjsKLQkJLy8gRmlsZTogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGFibGUgcm93Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFREFUQV9ESVIgPSAiVGFibGUuZGlyIjsKLQkJLy8gRmlsZTogQ3VycmVudGx5IHZpc2libGUgZGlyZWN0b3J5Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gdGFibGVXaWR0aHMgPSBuZXcgaW50W10gezE1MCwgNjAsIDc1LCAxNTB9OwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gdGFibGVUaXRsZXMgPSBuZXcgU3RyaW5nIFtdIHsKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuTmFtZS50aXRsZSIpLAotCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJ0YWJsZS5TaXplLnRpdGxlIiksCi0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLlR5cGUudGl0bGUiKSwKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuTW9kaWZpZWQudGl0bGUiKQotCX07Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIExhYmVsIHRhYmxlQ29udGVudHNPZkxhYmVsOwotCi0JLyogVGFibGUgdXBkYXRlIHdvcmtlciAqLwotCS8vIENvbnRyb2wgZGF0YQotCXByaXZhdGUgZmluYWwgT2JqZWN0IHdvcmtlckxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JCS8vIExvY2sgZm9yIGFsbCB3b3JrZXIgY29udHJvbCBkYXRhIGFuZCBzdGF0ZQotCXByaXZhdGUgdm9sYXRpbGUgVGhyZWFkICB3b3JrZXJUaHJlYWQgPSBudWxsOwotCQkvLyBUaGUgd29ya2VyJ3MgdGhyZWFkCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHdvcmtlclN0b3BwZWQgPSBmYWxzZTsKLQkJLy8gVHJ1ZSBpZiB0aGUgd29ya2VyIG11c3QgZXhpdCBvbiBjb21wbGV0aW9uIG9mIHRoZSBjdXJyZW50IGN5Y2xlCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHdvcmtlckNhbmNlbGxlZCA9IGZhbHNlOwotCQkvLyBUcnVlIGlmIHRoZSB3b3JrZXIgbXVzdCBjYW5jZWwgaXRzIG9wZXJhdGlvbnMgcHJlbWF0dXJlbHkgcGVyaGFwcyBkdWUgdG8gYSBzdGF0ZSB1cGRhdGUKLQotCS8vIFdvcmtlciBzdGF0ZSBpbmZvcm1hdGlvbiAtLSB0aGlzIGlzIHdoYXQgZ2V0cyBzeW5jaHJvbml6ZWQgYnkgYW4gdXBkYXRlCi0JcHJpdmF0ZSB2b2xhdGlsZSBGaWxlIHdvcmtlclN0YXRlRGlyID0gbnVsbDsKLQotCS8vIFN0YXRlIGluZm9ybWF0aW9uIHRvIHVzZSBmb3IgdGhlIG5leHQgY3ljbGUKLQlwcml2YXRlIHZvbGF0aWxlIEZpbGUgd29ya2VyTmV4dERpciA9IG51bGw7Ci0KLQkvKiBTaW11bGF0ZSBvbmx5IGZsYWcgKi8KLQkvLyB3aGVuIHRydWUsIGRpc2FibGVzIGFjdHVhbCBmaWxlc3lzdGVtIG1hbmlwdWxhdGlvbnMgYW5kIG91dHB1dHMgcmVzdWx0cyB0byBzdGFuZGFyZCBvdXQKLQlwcml2YXRlIGJvb2xlYW4gc2ltdWxhdGVPbmx5ID0gdHJ1ZTsKLQotCS8qKgotCSAqIFJ1bnMgbWFpbiBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJRmlsZVZpZXdlciBhcHBsaWNhdGlvbiA9IG5ldyBGaWxlVmlld2VyKCk7Ci0JCVNoZWxsIHNoZWxsID0gYXBwbGljYXRpb24ub3BlbihkaXNwbGF5KTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJYXBwbGljYXRpb24uY2xvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU2hlbGwgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsJCQotCQkvLyBDcmVhdGUgdGhlIHdpbmRvdwotCQl0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotCQlpY29uQ2FjaGUuaW5pdFJlc291cmNlcyhkaXNwbGF5KTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJY3JlYXRlU2hlbGxDb250ZW50cygpOwotCQlub3RpZnlSZWZyZXNoRmlsZXMobnVsbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbWFpbiBwcm9ncmFtLgotCSAqLwotCXZvaWQgY2xvc2UoKSB7Ci0JCXdvcmtlclN0b3AoKTsKLQkJaWNvbkNhY2hlLmZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgVUkKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBTaGVsbENvbnRhaW5lciBtYW5hZ2luZyB0aGUgU2hlbGwgd2UgYXJlIHJlbmRlcmluZyBpbnNpZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2hlbGxDb250ZW50cygpIHsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiLCBuZXcgT2JqZWN0W10geyAiIiB9KSk7CQotCQlzaGVsbC5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLnNoZWxsSWNvbl0pOwotCQlNZW51IGJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihiYXIpOwotCQljcmVhdGVGaWxlTWVudShiYXIpOwotCQljcmVhdGVIZWxwTWVudShiYXIpOwotCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxODU7Ci0JCWNyZWF0ZUNvbWJvVmlldyhzaGVsbCwgZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNyZWF0ZVRvb2xCYXIoc2hlbGwsIGdyaWREYXRhKTsKLQotCQlTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShzaGVsbCwgU1dULk5PTkUpOwotCQlzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVUcmVlVmlldyhzYXNoRm9ybSk7Ci0JCWNyZWF0ZVRhYmxlVmlldyhzYXNoRm9ybSk7Ci0JCXNhc2hGb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsgMiwgNSB9KTsKLQotCQludW1PYmplY3RzTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTg1OwotCQludW1PYmplY3RzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlkaXNrU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRpc2tTcGFjZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBGaWxlIE1lbnUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG1lbnUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZU1lbnUoTWVudSBwYXJlbnQpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJTWVudUl0ZW0gaGVhZGVyID0gbmV3IE1lbnVJdGVtKHBhcmVudCwgU1dULkNBU0NBREUpOwotCQloZWFkZXIuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5GaWxlLnRleHQiKSk7Ci0JCWhlYWRlci5zZXRNZW51KG1lbnUpOwotCi0JCWZpbmFsIE1lbnVJdGVtIHNpbXVsYXRlSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQlzaW11bGF0ZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5GaWxlLlNpbXVsYXRlT25seS50ZXh0IikpOwotCQlzaW11bGF0ZUl0ZW0uc2V0U2VsZWN0aW9uKHNpbXVsYXRlT25seSk7Ci0JCXNpbXVsYXRlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2ltdWxhdGVPbmx5ID0gc2ltdWxhdGVJdGVtLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkZpbGUuQ2xvc2UudGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEhlbHAgTWVudS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVIZWxwTWVudShNZW51IHBhcmVudCkgewotCQlNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotCQlNZW51SXRlbSBoZWFkZXIgPSBuZXcgTWVudUl0ZW0ocGFyZW50LCBTV1QuQ0FTQ0FERSk7Ci0JCWhlYWRlci5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkhlbHAudGV4dCIpKTsKLQkJaGVhZGVyLnNldE1lbnUobWVudSk7Ci0KLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5IZWxwLkFib3V0LnRleHQiKSk7CQkKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuT0spOwotCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuQWJvdXQudGl0bGUiKSk7Ci0JCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5BYm91dC5kZXNjcmlwdGlvbiIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpIH0pKTsKLQkJCQlib3gub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0b29sYmFyCi0JICogCi0JICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBvbiB3aGljaCB0byBhdHRhY2ggdGhlIHRvb2xiYXIKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YSB0aGUgbGF5b3V0IGRhdGEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihmaW5hbCBTaGVsbCBzaGVsbCwgT2JqZWN0IGxheW91dERhdGEpIHsKLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRQYXJlbnRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5QYXJlbnQudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9QYXJlbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUmVmcmVzaF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlJlZnJlc2gudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9SZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25BZGFwdGVyIHVuaW1wbGVtZW50ZWRMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LKTsKLQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLk5vdEltcGxlbWVudGVkLnRpdGxlIikpOwotCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuQWN0aW9uTm90SW1wbGVtZW50ZWQuZGVzY3JpcHRpb24iKSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCX0KLQkJfTsKLQotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZEN1dF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLkN1dC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kQ29weV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLkNvcHkudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFBhc3RlXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGFzdGUudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCi0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kRGVsZXRlXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuRGVsZXRlLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRSZW5hbWVdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZW5hbWUudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCi0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kU2VhcmNoXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuU2VhcmNoLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRQcmludF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlByaW50LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21ibyBib3ggdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb21ib1ZpZXcoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IGxheW91dERhdGEpIHsKLQkJY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbWJvLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIEZpbGVbXSByb290cyA9IChGaWxlW10pIGNvbWJvLmdldERhdGEoQ09NQk9EQVRBX1JPT1RTKTsKLQkJCQlpZiAocm9vdHMgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWludCBzZWxlY3Rpb24gPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChzZWxlY3Rpb24gPj0gMCAmJiBzZWxlY3Rpb24gPCByb290cy5sZW5ndGgpIHsKLQkJCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3Rvcnkocm9vdHNbc2VsZWN0aW9uXSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBTdHJpbmcgbGFzdFRleHQgPSAoU3RyaW5nKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9MQVNUVEVYVCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWlmIChsYXN0VGV4dCAhPSBudWxsICYmIGxhc3RUZXh0LmVxdWFscyh0ZXh0KSkgcmV0dXJuOwotCQkJCWNvbWJvLnNldERhdGEoQ09NQk9EQVRBX0xBU1RURVhULCB0ZXh0KTsKLQkJCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShuZXcgRmlsZSh0ZXh0KSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpbGUgdHJlZSB2aWV3LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJdHJlZVNjb3BlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdHJlZVNjb3BlTGFiZWwuc2V0VGV4dChGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkFsbEZvbGRlcnMudGV4dCIpKTsKLQkJdHJlZVNjb3BlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCXRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0KLQkJdHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCAhPSAwKSB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSBzZWxlY3Rpb25bMF07Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCQotCQkJCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggIT0gMCkgewotCQkJCQlUcmVlSXRlbSBpdGVtID0gc2VsZWN0aW9uWzBdOwotCQkJCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQkJCQl0cmVlRXhwYW5kSXRlbShpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0cmVlLmFkZFRyZWVMaXN0ZW5lcihuZXcgVHJlZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVEKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJdHJlZUV4cGFuZEl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCX0KLQkJfSk7Ci0JCWNyZWF0ZVRyZWVEcmFnU291cmNlKHRyZWUpOwotCQljcmVhdGVUcmVlRHJvcFRhcmdldCh0cmVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEcmFnICYgRHJvcCBEcmFnU291cmNlIGZvciBpdGVtcyBiZWluZyBkcmFnZ2VkIGZyb20gdGhlIHRyZWUuCi0JICogCi0JICogQHJldHVybiB0aGUgRHJhZ1NvdXJjZSBmb3IgdGhlIHRyZWUKLQkgKi8KLQlwcml2YXRlIERyYWdTb3VyY2UgY3JlYXRlVHJlZURyYWdTb3VyY2UoZmluYWwgVHJlZSB0cmVlKXsKLQkJRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodHJlZSwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkpOwotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQlUcmVlSXRlbVtdIGRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkbmRTZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlldmVudC5kb2l0ID0gZG5kU2VsZWN0aW9uLmxlbmd0aCA+IDA7Ci0JCQkJaXNEcmFnZ2luZyA9IHRydWU7Ci0JCQkJcHJvY2Vzc2VkRHJvcEZpbGVzID0gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWRyYWdTb3VyY2VIYW5kbGVEcmFnRmluaXNoZWQoZXZlbnQsIHNvdXJjZU5hbWVzKTsKLQkJCQlkbmRTZWxlY3Rpb24gPSBudWxsOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlpc0RyYWdnaW5nID0gZmFsc2U7Ci0JCQkJcHJvY2Vzc2VkRHJvcEZpbGVzID0gbnVsbDsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJaWYgKGRuZFNlbGVjdGlvbiA9PSBudWxsIHx8IGRuZFNlbGVjdGlvbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJCWlmICghIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHJldHVybjsKLQkJCQkKLQkJCQlzb3VyY2VOYW1lcyAgPSBuZXcgU3RyaW5nW2RuZFNlbGVjdGlvbi5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG5kU2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBkbmRTZWxlY3Rpb25baV0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQkJCXNvdXJjZU5hbWVzW2ldID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJZXZlbnQuZGF0YSA9IHNvdXJjZU5hbWVzOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRyYWdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJvcFRhcmdldCBmb3IgaXRlbXMgYmVpbmcgZHJvcHBlZCBvbnRvIHRoZSB0cmVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyb3BUYXJnZXQgZm9yIHRoZSB0cmVlCi0JICovCi0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGNyZWF0ZVRyZWVEcm9wVGFyZ2V0KGZpbmFsIFRyZWUgdHJlZSkgewotCQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0cmVlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSBmYWxzZTsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgZ2V0VGFyZ2V0RmlsZShldmVudCkpOwotCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBnZXRUYXJnZXRGaWxlKGV2ZW50KTsKLQkJCQlpZiAoZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCB0YXJnZXRGaWxlKSkKLQkJCQkJZHJvcFRhcmdldEhhbmRsZURyb3AoZXZlbnQsIHRhcmdldEZpbGUpOwotCQkJfQotCQkJcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgRmlsZSBmb3IgdGhlIGRyb3AgCi0JCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbSh0cmVlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpKTsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBudWxsOwotCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJLy8gV2UgYXJlIG92ZXIgYSBwYXJ0aWN1bGFyIGl0ZW0gaW4gdGhlIHRyZWUsIHVzZSB0aGUgaXRlbSdzIGZpbGUKLQkJCQkJdGFyZ2V0RmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCX0KLQkJCQlyZXR1cm4gdGFyZ2V0RmlsZTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcm9wVGFyZ2V0OwkKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGV4cGFuZCBldmVudHMgb24gYSB0cmVlIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW0gdGhlIFRyZWVJdGVtIHRvIGZpbGwgaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZUV4cGFuZEl0ZW0oVHJlZUl0ZW0gaXRlbSkgewotCQlzaGVsbC5zZXRDdXJzb3IoaWNvbkNhY2hlLnN0b2NrQ3Vyc29yc1tpY29uQ2FjaGUuY3Vyc29yV2FpdF0pOwotCQlmaW5hbCBPYmplY3Qgc3R1YiA9IGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfU1RVQik7Ci0JCWlmIChzdHViID09IG51bGwpIHRyZWVSZWZyZXNoSXRlbShpdGVtLCB0cnVlKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvckRlZmF1bHRdKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhdmVyc2UgdGhlIGVudGlyZSB0cmVlIGFuZCB1cGRhdGUgb25seSB3aGF0IGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSByb290cyB0aGUgcm9vdCBkaXJlY3RvcnkgbGlzdGluZwotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlUmVmcmVzaChGaWxlW10gbWFzdGVyRmlsZXMpIHsKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJaW50IG1hc3RlckluZGV4ID0gMDsKLQkJaW50IGl0ZW1JbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWZpbmFsIEZpbGUgaXRlbUZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCWlmICgoaXRlbUZpbGUgPT0gbnVsbCkgfHwgKG1hc3RlckluZGV4ID09IG1hc3RlckZpbGVzLmxlbmd0aCkpIHsKLQkJCQkvLyByZW1vdmUgYmFkIGl0ZW0gb3IgcGxhY2Vob2xkZXIKLQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZpbmFsIEZpbGUgbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4XTsKLQkJCWludCBjb21wYXJlID0gY29tcGFyZUZpbGVzKG1hc3RlckZpbGUsIGl0ZW1GaWxlKTsKLQkJCWlmIChjb21wYXJlID09IDApIHsKLQkJCQkvLyBzYW1lIGZpbGUsIHVwZGF0ZSBpdAotCQkJCXRyZWVSZWZyZXNoSXRlbShpdGVtLCBmYWxzZSk7Ci0JCQkJKytpdGVtSW5kZXg7Ci0JCQkJKyttYXN0ZXJJbmRleDsKLQkJCX0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGJlZm9yZSBmaWxlLCBpbnNlcnQgaXQKLQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpdGVtSW5kZXgpOwotCQkJCXRyZWVJbml0Vm9sdW1lKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gdG8gZ2V0ICJleHBhbmQiIGJ1dHRvbgotCQkJCSsraXRlbUluZGV4OwotCQkJCSsrbWFzdGVySW5kZXg7Ci0JCQkJLS1pOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyIGZpbGUsIGRlbGV0ZSBzdGFsZSBpdGVtCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZm9yICg7bWFzdGVySW5kZXggPCBtYXN0ZXJGaWxlcy5sZW5ndGg7ICsrbWFzdGVySW5kZXgpIHsKLQkJCWZpbmFsIEZpbGUgbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4XTsKLQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJdHJlZUluaXRWb2x1bWUobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQluZXcgVHJlZUl0ZW0obmV3SXRlbSwgU1dULk5PTkUpOyAvLyBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHRvIGdldCAiZXhwYW5kIiBidXR0b24KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFRyYXZlcnNlIGFuIGl0ZW0gaW4gdGhlIHRyZWUgYW5kIHVwZGF0ZSBvbmx5IHdoYXQgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGRpckl0ZW0gdGhlIHRyZWUgaXRlbSBvZiB0aGUgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGZvcmNlUG9wdWxhdGUgdHJ1ZSBpZmYgd2Ugc2hvdWxkIHBvcHVsYXRlIG5vbi1leHBhbmRlZCBpdGVtcyBhcyB3ZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVSZWZyZXNoSXRlbShUcmVlSXRlbSBkaXJJdGVtLCBib29sZWFuIGZvcmNlUG9wdWxhdGUpIHsKLQkJZmluYWwgRmlsZSBkaXIgPSAoRmlsZSkgZGlySXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCi0JCWlmICghIGZvcmNlUG9wdWxhdGUgJiYgISBkaXJJdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJCS8vIFJlZnJlc2ggbm9uLWV4cGFuZGVkIGl0ZW0KLQkJCWlmIChkaXJJdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX1NUVUIpICE9IG51bGwpIHsKLQkJCQl0cmVlSXRlbVJlbW92ZUFsbChkaXJJdGVtKTsKLQkJCQluZXcgVHJlZUl0ZW0oZGlySXRlbSwgU1dULk5PTkUpOyAvLyBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHRvIGdldCAiZXhwYW5kIiBidXR0b24KLQkJCQlkaXJJdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX1NUVUIsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFJlZnJlc2ggZXhwYW5kZWQgaXRlbQotCQlkaXJJdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX1NUVUIsIHRoaXMpOyAvLyBjbGVhciBzdHViIGZsYWcKLQotCQkvKiBHZXQgZGlyZWN0b3J5IGxpc3RpbmcgKi8KLQkJRmlsZVtdIHN1YkZpbGVzID0gKGRpciAhPSBudWxsKSA/IEZpbGVWaWV3ZXIuZ2V0RGlyZWN0b3J5TGlzdChkaXIpIDogbnVsbDsKLQkJaWYgKHN1YkZpbGVzID09IG51bGwgfHwgc3ViRmlsZXMubGVuZ3RoID09IDApIHsKLQkJCS8qIEVycm9yIG9yIG5vIGNvbnRlbnRzICovCi0JCQl0cmVlSXRlbVJlbW92ZUFsbChkaXJJdGVtKTsKLQkJCWRpckl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogUmVmcmVzaCBzdWItaXRlbXMgKi8KLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGRpckl0ZW0uZ2V0SXRlbXMoKTsKLQkJZmluYWwgRmlsZVtdIG1hc3RlckZpbGVzID0gc3ViRmlsZXM7Ci0JCWludCBtYXN0ZXJJbmRleCA9IDA7Ci0JCWludCBpdGVtSW5kZXggPSAwOwotCQlGaWxlIG1hc3RlckZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQl3aGlsZSAoKG1hc3RlckZpbGUgPT0gbnVsbCkgJiYgKG1hc3RlckluZGV4IDwgbWFzdGVyRmlsZXMubGVuZ3RoKSkgewotCQkJCW1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleCsrXTsKLQkJCQlpZiAoISBtYXN0ZXJGaWxlLmlzRGlyZWN0b3J5KCkpIG1hc3RlckZpbGUgPSBudWxsOwotCQkJfQotCi0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlmaW5hbCBGaWxlIGl0ZW1GaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQlpZiAoKGl0ZW1GaWxlID09IG51bGwpIHx8IChtYXN0ZXJGaWxlID09IG51bGwpKSB7Ci0JCQkJLy8gcmVtb3ZlIGJhZCBpdGVtIG9yIHBsYWNlaG9sZGVyCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpbnQgY29tcGFyZSA9IGNvbXBhcmVGaWxlcyhtYXN0ZXJGaWxlLCBpdGVtRmlsZSk7Ci0JCQlpZiAoY29tcGFyZSA9PSAwKSB7Ci0JCQkJLy8gc2FtZSBmaWxlLCB1cGRhdGUgaXQKLQkJCQl0cmVlUmVmcmVzaEl0ZW0oaXRlbSwgZmFsc2UpOwotCQkJCW1hc3RlckZpbGUgPSBudWxsOwotCQkJCSsraXRlbUluZGV4OwotCQkJfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgewotCQkJCS8vIHNob3VsZCBhcHBlYXIgYmVmb3JlIGZpbGUsIGluc2VydCBpdAotCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oZGlySXRlbSwgU1dULk5PTkUsIGl0ZW1JbmRleCk7Ci0JCQkJdHJlZUluaXRGb2xkZXIobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gYWRkIGEgcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSBzbyB3ZSBnZXQgdGhlICJleHBhbmQiIGJ1dHRvbgotCQkJCW1hc3RlckZpbGUgPSBudWxsOwotCQkJCSsraXRlbUluZGV4OwotCQkJCS0taTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBhZnRlciBmaWxlLCBkZWxldGUgc3RhbGUgaXRlbQotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXdoaWxlICgobWFzdGVyRmlsZSAhPSBudWxsKSB8fCAobWFzdGVySW5kZXggPCBtYXN0ZXJGaWxlcy5sZW5ndGgpKSB7Ci0JCQlpZiAobWFzdGVyRmlsZSAhPSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShkaXJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJdHJlZUluaXRGb2xkZXIobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gYWRkIGEgcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSBzbyB3ZSBnZXQgdGhlICJleHBhbmQiIGJ1dHRvbgotCQkJCWlmIChtYXN0ZXJJbmRleCA9PSBtYXN0ZXJGaWxlcy5sZW5ndGgpIGJyZWFrOwotCQkJfQotCQkJbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4KytdOwotCQkJaWYgKCEgbWFzdGVyRmlsZS5pc0RpcmVjdG9yeSgpKSBtYXN0ZXJGaWxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcmVpZ24gbWV0aG9kOiByZW1vdmVzIGFsbCBjaGlsZHJlbiBvZiBhIFRyZWVJdGVtLgotCSAqIEBwYXJhbSB0cmVlSXRlbSB0aGUgVHJlZUl0ZW0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRyZWVJdGVtUmVtb3ZlQWxsKFRyZWVJdGVtIHRyZWVJdGVtKSB7Ci0JCWZpbmFsIFRyZWVJdGVtW10gY2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQljaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIGZvbGRlciBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtIHRoZSBUcmVlSXRlbSB0byBpbml0aWFsaXplCi0JICogQHBhcmFtIGZvbGRlciB0aGUgRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUcmVlSXRlbQotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlSW5pdEZvbGRlcihUcmVlSXRlbSBpdGVtLCBGaWxlIGZvbGRlcikgewotCQlpdGVtLnNldFRleHQoZm9sZGVyLmdldE5hbWUoKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSwgZm9sZGVyKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25PcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZEZvbGRlcl0pOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgdm9sdW1lIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW0gdGhlIFRyZWVJdGVtIHRvIGluaXRpYWxpemUKLQkgKiBAcGFyYW0gdm9sdW1lIHRoZSBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRyZWVJdGVtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVJbml0Vm9sdW1lKFRyZWVJdGVtIGl0ZW0sIEZpbGUgdm9sdW1lKSB7Ci0JCWl0ZW0uc2V0VGV4dCh2b2x1bWUuZ2V0UGF0aCgpKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWREcml2ZV0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUsIHZvbHVtZSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCwgaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uT3BlbkRyaXZlXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZERyaXZlXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZmlsZSBkZXRhaWxzIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQl0YWJsZUNvbnRlbnRzT2ZMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0YWJsZUNvbnRlbnRzT2ZMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0KLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVUaXRsZXMubGVuZ3RoOyArK2kpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQodGFibGVUaXRsZXNbaV0pOwotCQkJY29sdW1uLnNldFdpZHRoKHRhYmxlV2lkdGhzW2ldKTsKLQkJfQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbm90aWZ5U2VsZWN0ZWRGaWxlcyhnZXRTZWxlY3RlZEZpbGVzKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZG9EZWZhdWx0RmlsZUFjdGlvbihnZXRTZWxlY3RlZEZpbGVzKCkpOwotCQkJfQotCQkJcHJpdmF0ZSBGaWxlW10gZ2V0U2VsZWN0ZWRGaWxlcygpIHsKLQkJCQlmaW5hbCBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCWZpbmFsIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW2l0ZW1zLmxlbmd0aF07Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJCQlmaWxlc1tpXSA9IChGaWxlKSBpdGVtc1tpXS5nZXREYXRhKFRBQkxFSVRFTURBVEFfRklMRSk7Ci0JCQkJfQotCQkJCXJldHVybiBmaWxlczsKLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlVGFibGVEcmFnU291cmNlKHRhYmxlKTsKLQkJY3JlYXRlVGFibGVEcm9wVGFyZ2V0KHRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEcmFnICYgRHJvcCBEcmFnU291cmNlIGZvciBpdGVtcyBiZWluZyBkcmFnZ2VkIGZyb20gdGhlIHRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyYWdTb3VyY2UgZm9yIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgRHJhZ1NvdXJjZSBjcmVhdGVUYWJsZURyYWdTb3VyY2UoZmluYWwgVGFibGUgdGFibGUpIHsKLQkJRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGFibGUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJVGFibGVJdGVtW10gZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWRuZFNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlldmVudC5kb2l0ID0gZG5kU2VsZWN0aW9uLmxlbmd0aCA+IDA7Ci0JCQkJaXNEcmFnZ2luZyA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkcmFnU291cmNlSGFuZGxlRHJhZ0ZpbmlzaGVkKGV2ZW50LCBzb3VyY2VOYW1lcyk7Ci0JCQkJZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwotCQkJCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlpZiAoZG5kU2VsZWN0aW9uID09IG51bGwgfHwgZG5kU2VsZWN0aW9uLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQkJaWYgKCEgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgcmV0dXJuOwotCQkJCQotCQkJCXNvdXJjZU5hbWVzICA9IG5ldyBTdHJpbmdbZG5kU2VsZWN0aW9uLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkbmRTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGRuZFNlbGVjdGlvbltpXS5nZXREYXRhKFRBQkxFSVRFTURBVEFfRklMRSk7Ci0JCQkJCXNvdXJjZU5hbWVzW2ldID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJZXZlbnQuZGF0YSA9IHNvdXJjZU5hbWVzOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRyYWdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJvcFRhcmdldCBmb3IgaXRlbXMgYmVpbmcgZHJvcHBlZCBvbnRvIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcm9wVGFyZ2V0IGZvciB0aGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIERyb3BUYXJnZXQgY3JlYXRlVGFibGVEcm9wVGFyZ2V0KGZpbmFsIFRhYmxlIHRhYmxlKXsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGFibGUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaXNEcm9wcGluZyA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaXNEcm9wcGluZyA9IGZhbHNlOwotCQkJCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCBnZXRUYXJnZXRGaWxlKGV2ZW50KSk7Ci0JCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9IGdldFRhcmdldEZpbGUoZXZlbnQpOwotCQkJCWlmIChkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIHRhcmdldEZpbGUpKQotCQkJCQlkcm9wVGFyZ2V0SGFuZGxlRHJvcChldmVudCwgdGFyZ2V0RmlsZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIEZpbGUgZ2V0VGFyZ2V0RmlsZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBEZXRlcm1pbmUgdGhlIHRhcmdldCBGaWxlIGZvciB0aGUgZHJvcCAKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0odGFibGUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSkpOwotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG51bGw7Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCQkvLyBXZSBhcmUgb3ZlciBhbiB1bm9jY3VwaWVkIGFyZWEgb2YgdGhlIHRhYmxlLgotCQkJCQkvLyBJZiBpdCBpcyBhIENPUFksIHdlIGNhbiB1c2UgdGhlIHRhYmxlJ3Mgcm9vdCBmaWxlLgotCQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQkJCXRhcmdldEZpbGUgPSAoRmlsZSkgdGFibGUuZ2V0RGF0YShUQUJMRURBVEFfRElSKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFdlIGFyZSBvdmVyIGEgcGFydGljdWxhciBpdGVtIGluIHRoZSB0YWJsZSwgdXNlIHRoZSBpdGVtJ3MgZmlsZQotCQkJCQl0YXJnZXRGaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUpOwotCQkJCX0KLQkJCQlyZXR1cm4gdGFyZ2V0RmlsZTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcm9wVGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIHRoYXQgYSBuZXcgY3VycmVudCBkaXJlY3RvcnkgaGFzIGJlZW4gc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdGhhdCB3YXMgc2VsZWN0ZWQsIG51bGwgaXMgaWdub3JlZAotCSAqLwotCXZvaWQgbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoRmlsZSBkaXIpIHsKLQkJaWYgKGRpciA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChjdXJyZW50RGlyZWN0b3J5ICE9IG51bGwgJiYgZGlyLmVxdWFscyhjdXJyZW50RGlyZWN0b3J5KSkgcmV0dXJuOwotCQljdXJyZW50RGlyZWN0b3J5ID0gZGlyOwotCQlub3RpZnlTZWxlY3RlZEZpbGVzKG51bGwpOwotCQkKLQkJLyogU2hlbGw6Ci0JCSAqIFNldHMgdGhlIHRpdGxlIHRvIGluZGljYXRlIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkKLQkJICovCi0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIiwgbmV3IE9iamVjdFtdIHsgY3VycmVudERpcmVjdG9yeS5nZXRQYXRoKCkgfSkpOwotCi0JCS8qIFRhYmxlIHZpZXc6Ci0JCSAqIERpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LgotCQkgKi8KLQkJd29ya2VyVXBkYXRlKGRpciwgZmFsc2UpOwotCi0JCS8qIENvbWJvIHZpZXc6Ci0JCSAqIFNldHMgdGhlIGNvbWJvIGJveCB0byBwb2ludCB0byB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LgotCQkgKi8KLQkJZmluYWwgRmlsZVtdIGNvbWJvUm9vdHMgPSAoRmlsZVtdKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9ST09UUyk7Ci0JCWludCBjb21ib0VudHJ5ID0gLTE7Ci0JCWlmIChjb21ib1Jvb3RzICE9IG51bGwpIHsJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21ib1Jvb3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKGRpci5lcXVhbHMoY29tYm9Sb290c1tpXSkpIHsKLQkJCQkJY29tYm9FbnRyeSA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY29tYm9FbnRyeSA9PSAtMSkgY29tYm8uc2V0VGV4dChkaXIuZ2V0UGF0aCgpKTsKLQkJZWxzZSBjb21iby5zZWxlY3QoY29tYm9FbnRyeSk7Ci0KLQkJLyogVHJlZSB2aWV3OgotCQkgKiBJZiBub3QgYWxyZWFkeSBleHBhbmRlZCwgcmVjdXJzaXZlbHkgZXhwYW5kcyB0aGUgcGFyZW50cyBvZiB0aGUgc3BlY2lmaWVkCi0JCSAqIGRpcmVjdG9yeSB1bnRpbCBpdCBpcyB2aXNpYmxlLgotCQkgKi8KLQkJVmVjdG9yIC8qIG9mIEZpbGUgKi8gcGF0aCA9IG5ldyBWZWN0b3IoKTsKLQkJLy8gQnVpbGQgYSBzdGFjayBvZiBwYXRocyBmcm9tIHRoZSByb290IG9mIHRoZSB0cmVlCi0JCXdoaWxlIChkaXIgIT0gbnVsbCkgewotCQkJcGF0aC5hZGQoZGlyKTsKLQkJCWRpciA9IGRpci5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJLy8gUmVjdXJzaXZlbHkgZXhwYW5kIHRoZSB0cmVlIHRvIGdldCB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQlUcmVlSXRlbSBsYXN0SXRlbSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSBwYXRoLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0JCQlmaW5hbCBGaWxlIHBhdGhFbGVtZW50ID0gKEZpbGUpIHBhdGguZWxlbWVudEF0KGkpOwotCi0JCQkvLyBTZWFyY2ggZm9yIGEgcGFydGljdWxhciBGaWxlIGluIHRoZSBhcnJheSBvZiB0cmVlIGl0ZW1zCi0JCQkvLyBObyBndWFyYW50ZWUgdGhhdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBpbiBhbnkgcmVjb2duaXphYmxlIGZhc2hpb24sIHNvIHdlJ2xsCi0JCQkvLyBqdXN0IHNlcXVlbnRpYWwgc2Nhbi4gIFRoZXJlIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gYSBmZXcgdGhvdXNhbmQgZW50cmllcy4KLQkJCVRyZWVJdGVtIGl0ZW0gPSBudWxsOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpdGVtcy5sZW5ndGg7ICsraykgewotCQkJCWl0ZW0gPSBpdGVtc1trXTsKLQkJCQlpZiAoaXRlbS5pc0Rpc3Bvc2VkKCkpIGNvbnRpbnVlOwotCQkJCWZpbmFsIEZpbGUgaXRlbUZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQlpZiAoaXRlbUZpbGUgIT0gbnVsbCAmJiBpdGVtRmlsZS5lcXVhbHMocGF0aEVsZW1lbnQpKSBicmVhazsKLQkJCX0KLQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwotCQkJbGFzdEl0ZW0gPSBpdGVtOwotCQkJaWYgKGkgIT0gMCAmJiAhaXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJdHJlZUV4cGFuZEl0ZW0oaXRlbSk7Ci0JCQkJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWl0ZW1zID0gaXRlbS5nZXRJdGVtcygpOwotCQl9Ci0JCXRyZWUuc2V0U2VsZWN0aW9uKChsYXN0SXRlbSAhPSBudWxsKSA/IG5ldyBUcmVlSXRlbVtdIHsgbGFzdEl0ZW0gfSA6IG5ldyBUcmVlSXRlbVswXSk7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIHRoYXQgZmlsZXMgaGF2ZSBiZWVuIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0aGF0IHdlcmUgc2VsZWN0ZWQsIG51bGwgb3IgZW1wdHkgYXJyYXkgaW5kaWNhdGVzIG5vIGFjdGl2ZSBzZWxlY3Rpb24KLQkgKi8KLQl2b2lkIG5vdGlmeVNlbGVjdGVkRmlsZXMoRmlsZVtdIGZpbGVzKSB7Ci0JCS8qIERldGFpbHM6Ci0JCSAqIFVwZGF0ZSB0aGUgZGV0YWlscyB0aGF0IGFyZSB2aXNpYmxlIG9uIHNjcmVlbi4KLQkJICovCi0JCWlmICgoZmlsZXMgIT0gbnVsbCkgJiYgKGZpbGVzLmxlbmd0aCAhPSAwKSkgewotCQkJbnVtT2JqZWN0c0xhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuTnVtYmVyT2ZTZWxlY3RlZEZpbGVzLnRleHQiLAotCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGZpbGVzLmxlbmd0aCkgfSkpOwotCQkJbG9uZyBmaWxlU2l6ZSA9IDBMOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbGVTaXplICs9IGZpbGVzW2ldLmxlbmd0aCgpOwotCQkJfQotCQkJZGlza1NwYWNlTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5GaWxlU2l6ZS50ZXh0IiwKLQkJCQluZXcgT2JqZWN0W10geyBuZXcgTG9uZyhmaWxlU2l6ZSkgfSkpOwotCQl9IGVsc2UgewotCQkJLy8gTm8gZmlsZXMgc2VsZWN0ZWQKLQkJCWRpc2tTcGFjZUxhYmVsLnNldFRleHQoIiIpOwotCQkJaWYgKGN1cnJlbnREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJCWludCBudW1PYmplY3RzID0gZ2V0RGlyZWN0b3J5TGlzdChjdXJyZW50RGlyZWN0b3J5KS5sZW5ndGg7Ci0JCQkJbnVtT2JqZWN0c0xhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuRGlyTnVtYmVyT2ZPYmplY3RzLnRleHQiLAotCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihudW1PYmplY3RzKSB9KSk7Ci0JCQl9IGVsc2UgewotCQkJCW51bU9iamVjdHNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIHRoYXQgZmlsZXMgbXVzdCBiZSByZWZyZXNoZWQKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMgdGhlIGZpbGVzIHRoYXQgbmVlZCByZWZyZXNoaW5nLCBlbXB0eSBhcnJheSBpcyBhIG5vLW9wLCBudWxsIHJlZnJlc2hlcyBhbGwKLQkgKi8KLQl2b2lkIG5vdGlmeVJlZnJlc2hGaWxlcyhGaWxlW10gZmlsZXMpIHsKLQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID09IDApIHJldHVybjsKLQotCQlpZiAoKGRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCkgJiYgKGRlZmVycmVkUmVmcmVzaEZpbGVzICE9IG51bGwpICYmIChmaWxlcyAhPSBudWxsKSkgewotCQkJLy8gbWVyZ2UgcmVxdWVzdHMKLQkJCUZpbGVbXSBuZXdSZXF1ZXN0ID0gbmV3IEZpbGVbZGVmZXJyZWRSZWZyZXNoRmlsZXMubGVuZ3RoICsgZmlsZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGVmZXJyZWRSZWZyZXNoRmlsZXMsIDAsIG5ld1JlcXVlc3QsIDAsIGRlZmVycmVkUmVmcmVzaEZpbGVzLmxlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVzLCAwLCBuZXdSZXF1ZXN0LCBkZWZlcnJlZFJlZnJlc2hGaWxlcy5sZW5ndGgsIGZpbGVzLmxlbmd0aCk7Ci0JCQlkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IG5ld1JlcXVlc3Q7Ci0JCX0gZWxzZSB7Ci0JCQlkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IGZpbGVzOwotCQkJZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkID0gdHJ1ZTsKLQkJfQotCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGRlZmVycmVkIFJlZnJlc2ggbm90aWZpY2F0aW9ucyAoZHVlIHRvIERyYWcgJiBEcm9wKQotCSAqLwotCXZvaWQgaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCkgewotCQlpZiAoaXNEcmFnZ2luZyB8fCBpc0Ryb3BwaW5nIHx8ICEgZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkKSByZXR1cm47Ci0JCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc0RpYWxvZy5jbG9zZSgpOwotCQkJcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOwotCQl9Ci0KLQkJZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkID0gZmFsc2U7Ci0JCUZpbGVbXSBmaWxlcyA9IGRlZmVycmVkUmVmcmVzaEZpbGVzOwotCQlkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IG51bGw7Ci0KLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvcldhaXRdKTsKLQotCQkvKiBUYWJsZSB2aWV3OgotCQkgKiBSZWZyZXNoZXMgaW5mb3JtYXRpb24gYWJvdXQgYW55IGZpbGVzIGluIHRoZSBsaXN0IGFuZCB0aGVpciBjaGlsZHJlbi4KLQkJICovCi0JCWJvb2xlYW4gcmVmcmVzaFRhYmxlID0gZmFsc2U7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJaWYgKGZpbGUuZXF1YWxzKGN1cnJlbnREaXJlY3RvcnkpKSB7Ci0JCQkJCXJlZnJlc2hUYWJsZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlGaWxlIHBhcmVudEZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpZiAoKHBhcmVudEZpbGUgIT0gbnVsbCkgJiYgKHBhcmVudEZpbGUuZXF1YWxzKGN1cnJlbnREaXJlY3RvcnkpKSkgewotCQkJCQlyZWZyZXNoVGFibGUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSByZWZyZXNoVGFibGUgPSB0cnVlOwotCQlpZiAocmVmcmVzaFRhYmxlKSB3b3JrZXJVcGRhdGUoY3VycmVudERpcmVjdG9yeSwgdHJ1ZSk7Ci0KLQkJLyogQ29tYm8gdmlldzoKLQkJICogUmVmcmVzaGVzIHRoZSBsaXN0IG9mIHJvb3RzCi0JCSAqLwotCQlmaW5hbCBGaWxlW10gcm9vdHMgPSBnZXRSb290cygpOwotCi0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlib29sZWFuIHJlZnJlc2hDb21ibyA9IGZhbHNlOwotCQkJZmluYWwgRmlsZVtdIGNvbWJvUm9vdHMgPSAoRmlsZVtdKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9ST09UUyk7Ci0JCQotCQkJaWYgKChjb21ib1Jvb3RzICE9IG51bGwpICYmIChjb21ib1Jvb3RzLmxlbmd0aCA9PSByb290cy5sZW5ndGgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAoISByb290c1tpXS5lcXVhbHMoY29tYm9Sb290c1tpXSkpIHsKLQkJCQkJCXJlZnJlc2hDb21ibyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSByZWZyZXNoQ29tYm8gPSB0cnVlOwotCi0JCQlpZiAocmVmcmVzaENvbWJvKSB7Ci0JCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJY29tYm8uc2V0RGF0YShDT01CT0RBVEFfUk9PVFMsIHJvb3RzKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWZpbmFsIEZpbGUgZmlsZSA9IHJvb3RzW2ldOwotCQkJCQljb21iby5hZGQoZmlsZS5nZXRQYXRoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qIFRyZWUgdmlldzoKLQkJICogUmVmcmVzaGVzIGluZm9ybWF0aW9uIGFib3V0IGFueSBmaWxlcyBpbiB0aGUgbGlzdCBhbmQgdGhlaXIgY2hpbGRyZW4uCi0JCSAqLwotCQl0cmVlUmVmcmVzaChyb290cyk7Ci0JCQotCQkvLyBSZW1pbmQgZXZlcnlvbmUgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlc3lzdGVtCi0JCWZpbmFsIEZpbGUgZGlyID0gY3VycmVudERpcmVjdG9yeTsKLQkJY3VycmVudERpcmVjdG9yeSA9IG51bGw7Ci0JCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KGRpcik7Ci0KLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvckRlZmF1bHRdKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gb24gYSBzZXQgb2YgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBhcnJheSBvZiBmaWxlcyB0byBwcm9jZXNzCi0JICovCi0Jdm9pZCBkb0RlZmF1bHRGaWxlQWN0aW9uKEZpbGVbXSBmaWxlcykgewotCQkvLyBvbmx5IHVzZXMgdGhlIDFzdCBmaWxlIChmb3Igbm93KQotCQlpZiAoZmlsZXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJZmluYWwgRmlsZSBmaWxlID0gZmlsZXNbMF07Ci0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJaWYgKCEgUHJvZ3JhbS5sYXVuY2goZmlsZU5hbWUpKSB7CQotCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULk9LKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuRmFpbGVkTGF1bmNoLm1lc3NhZ2UiLCBuZXcgT2JqZWN0W10geyBmaWxlTmFtZSB9KSk7Ci0JCQkJZGlhbG9nLnNldFRleHQoc2hlbGwuZ2V0VGV4dCAoKSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQotCSAqLwotCXZvaWQgZG9QYXJlbnQoKSB7Ci0JCWlmIChjdXJyZW50RGlyZWN0b3J5ID09IG51bGwpIHJldHVybjsKLQkJRmlsZSBwYXJlbnREaXJlY3RvcnkgPSBjdXJyZW50RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKTsKLQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkocGFyZW50RGlyZWN0b3J5KTsKLQl9Ci0JIAotCS8qKgotCSAqIFBlcmZvcm1zIGEgcmVmcmVzaAotCSAqLwotCXZvaWQgZG9SZWZyZXNoKCkgewotCQlub3RpZnlSZWZyZXNoRmlsZXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgZHJvcCB0YXJnZXQgYXMgYSBjYW5kaWRhdGUgZm9yIGEgZHJvcCBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogVXNlZCBpbiBkcmFnT3ZlcigpIGFuZCBkcm9wQWNjZXB0KCkuPGJyPgotCSAqIE5vdGUgZXZlbnQuZGV0YWlsIGlzIHNldCB0byBETkQuRFJPUF9OT05FIGJ5IHRoaXMgbWV0aG9kIGlmIHRoZSB0YXJnZXQgaXMgbm90IHZhbGlkLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIERyb3BUYXJnZXRFdmVudCB0byB2YWxpZGF0ZQotCSAqIEBwYXJhbSB0YXJnZXRGaWxlIHRoZSBGaWxlIHJlcHJlc2VudGluZyB0aGUgZHJvcCB0YXJnZXQgbG9jYXRpb24KLQkgKiAgICAgICAgdW5kZXIgaW5zcGVjdGlvbiwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRyb3BUYXJnZXRWYWxpZGF0ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIEZpbGUgdGFyZ2V0RmlsZSkgewotCQlpZiAodGFyZ2V0RmlsZSAhPSBudWxsICYmIHRhcmdldEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9DT1BZICYmIGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCX0KLQkJcmV0dXJuIGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9OT05FOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBkcm9wIG9uIGEgZHJvcFRhcmdldC4KLQkgKiA8cD4KLQkgKiBVc2VkIGluIGRyb3AoKS48YnI+Ci0JICogTm90ZSBldmVudC5kZXRhaWwgaXMgbW9kaWZpZWQgYnkgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIEBwYXJhbSBldmVudCB0aGUgRHJvcFRhcmdldEV2ZW50IHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlIGRyb3AoKSBtZXRob2QKLQkgKiBAcGFyYW0gdGFyZ2V0RmlsZSB0aGUgRmlsZSByZXByZXNlbnRpbmcgdGhlIGRyb3AgdGFyZ2V0IGxvY2F0aW9uCi0JICogICAgICAgIHVuZGVyIGluc3BlY3Rpb24sIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgdm9pZCBkcm9wVGFyZ2V0SGFuZGxlRHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIEZpbGUgdGFyZ2V0RmlsZSkgewotCQkvLyBHZXQgZHJvcHBlZCBkYXRhIChhbiBhcnJheSBvZiBmaWxlbmFtZXMpCi0JCWlmICghIGRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgdGFyZ2V0RmlsZSkpIHJldHVybjsKLQkJZmluYWwgU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIGV2ZW50LmRhdGE7Ci0JCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKSBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHJldHVybjsKLQotCQkvLyBPcGVuIHByb2dyZXNzIGRpYWxvZwotCQlwcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhzaGVsbCwKLQkJCShldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgPyBQcm9ncmVzc0RpYWxvZy5NT1ZFIDogUHJvZ3Jlc3NEaWFsb2cuQ09QWSk7Ci0JCXByb2dyZXNzRGlhbG9nLnNldFRvdGFsV29ya1VuaXRzKHNvdXJjZU5hbWVzLmxlbmd0aCk7Ci0JCXByb2dyZXNzRGlhbG9nLm9wZW4oKTsKLQotCQkvLyBDb3B5IGVhY2ggZmlsZQotCQlWZWN0b3IgLyogb2YgRmlsZSAqLyBwcm9jZXNzZWRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgc291cmNlTmFtZXMubGVuZ3RoKSAmJiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKTsgaSsrKXsKLQkJCWZpbmFsIEZpbGUgc291cmNlID0gbmV3IEZpbGUoc291cmNlTmFtZXNbaV0pOwotCQkJZmluYWwgRmlsZSBkZXN0ID0gbmV3IEZpbGUodGFyZ2V0RmlsZSwgc291cmNlLmdldE5hbWUoKSk7Ci0JCQlpZiAoc291cmNlLmVxdWFscyhkZXN0KSkgY29udGludWU7IC8vIGlnbm9yZSBpZiBpbiBzYW1lIGxvY2F0aW9uCi0KLQkJCXByb2dyZXNzRGlhbG9nLnNldERldGFpbEZpbGUoc291cmNlLCBQcm9ncmVzc0RpYWxvZy5DT1BZKTsKLQkJCXdoaWxlICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlpZiAoY29weUZpbGVTdHJ1Y3R1cmUoc291cmNlLCBkZXN0KSkgewotCQkJCQlwcm9jZXNzZWRGaWxlcy5hZGQoc291cmNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFICYmICghaXNEcmFnZ2luZykpIHsKLQkJCQkJCS8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBub3RpZnkgYW4gZXh0ZXJuYWwgZHJhZyBzb3VyY2UgdGhhdCBhIGRyb3AKLQkJCQkJCS8vIG9wZXJhdGlvbiB3YXMgb25seSBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGEKLQkJCQkJCS8vIHByb2JsZW0gZm9yIERST1BfTU9WRSBvcGVyYXRpb25zIHNpbmNlIHVubGVzcyB0aGUgc291cmNlIGdldHMKLQkJCQkJCS8vIERST1BfTk9ORSwgaXQgd2lsbCBkZWxldGUgdGhlIG9yaWdpbmFsIGRhdGEgaW5jbHVkaW5nIGJpdHMgdGhhdAotCQkJCQkJLy8gbWF5IG5vdCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgc3VjY2Vzc2Z1bGx5LgotCQkJCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IgfCBTV1QuUkVUUlkgfCBTV1QuQ0FOQ0VMKTsKLQkJCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS50aXRsZSIpKTsKLQkJCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS5kZXNjcmlwdGlvbiIsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgc291cmNlLCBkZXN0IH0pKTsKLQkJCQkJCWludCBidXR0b24gPSBib3gub3BlbigpOwotCQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuQ0FOQ0VMKSB7Ci0JCQkJCQkJaSA9IHNvdXJjZU5hbWVzLmxlbmd0aDsKLQkJCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gV2UgY2FuIHJlY292ZXIgZ3JhY2VmdWxseSBmcm9tIGVycm9ycyBpZiB0aGUgZHJhZyBzb3VyY2UgYmVsb25ncwotCQkJCQkJLy8gdG8gdGhpcyBhcHBsaWNhdGlvbiBzaW5jZSBpdCB3aWxsIGxvb2sgYXQgcHJvY2Vzc2VkRHJvcEZpbGVzLgotCQkJCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IgfCBTV1QuQUJPUlQgfCBTV1QuUkVUUlkgfCBTV1QuSUdOT1JFKTsKLQkJCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS50aXRsZSIpKTsKLQkJCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS5kZXNjcmlwdGlvbiIsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgc291cmNlLCBkZXN0IH0pKTsKLQkJCQkJCWludCBidXR0b24gPSBib3gub3BlbigpOwotCQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuQUJPUlQpIGkgPSBzb3VyY2VOYW1lcy5sZW5ndGg7Ci0JCQkJCQlpZiAoYnV0dG9uICE9IFNXVC5SRVRSWSkgYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRHJhZ2dpbmcpIHsKLQkJCS8vIFJlbWVtYmVyIGV4YWN0bHkgd2hpY2ggZmlsZXMgd2UgcHJvY2Vzc2VkCi0JCQlwcm9jZXNzZWREcm9wRmlsZXMgPSAoKEZpbGVbXSkgcHJvY2Vzc2VkRmlsZXMudG9BcnJheShuZXcgRmlsZVtwcm9jZXNzZWRGaWxlcy5zaXplKCldKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9ncmVzc0RpYWxvZy5jbG9zZSgpOwotCQkJcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOwotCQl9Ci0JCW5vdGlmeVJlZnJlc2hGaWxlcyhuZXcgRmlsZVtdIHsgdGFyZ2V0RmlsZSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBjb21wbGV0aW9uIG9mIGEgZHJhZyBvbiBhIGRyYWdTb3VyY2UuCi0JICogPHA+Ci0JICogVXNlZCBpbiBkcmFnRmluaXNoZWQoKS48YnI+Ci0JICogPC9wPgotCSAqIEBwYXJhbSBldmVudCB0aGUgRHJhZ1NvdXJjZUV2ZW50IHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlIGRyYWdGaW5pc2hlZCgpIG1ldGhvZAotCSAqIEBwYXJhbSBzb3VyY2VOYW1lcyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgd2VyZSBkcmFnZ2VkIChldmVudC5kYXRhIGlzIGludmFsaWQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyYWdTb3VyY2VIYW5kbGVEcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50LCBTdHJpbmdbXSBzb3VyY2VOYW1lcykgewotCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX01PVkUpIHJldHVybjsKLQotCQkvLyBHZXQgYXJyYXkgb2YgZmlsZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHRyYW5zZmVycmVkCi0JCWZpbmFsIEZpbGVbXSBzb3VyY2VGaWxlczsKLQkJaWYgKHByb2Nlc3NlZERyb3BGaWxlcyAhPSBudWxsKSB7Ci0JCQlzb3VyY2VGaWxlcyA9IHByb2Nlc3NlZERyb3BGaWxlczsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZUZpbGVzID0gbmV3IEZpbGVbc291cmNlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyArK2kpCi0JCQkJc291cmNlRmlsZXNbaV0gPSBuZXcgRmlsZShzb3VyY2VOYW1lc1tpXSk7Ci0JCX0JCi0JCWlmIChwcm9ncmVzc0RpYWxvZyA9PSBudWxsKQotCQkJcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coc2hlbGwsIFByb2dyZXNzRGlhbG9nLk1PVkUpOwotCQlwcm9ncmVzc0RpYWxvZy5zZXRUb3RhbFdvcmtVbml0cyhzb3VyY2VGaWxlcy5sZW5ndGgpOwotCQlwcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzcygwKTsKLQkJcHJvZ3Jlc3NEaWFsb2cub3BlbigpOwotCi0JCS8vIERlbGV0ZSBlYWNoIGZpbGUKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgc291cmNlRmlsZXMubGVuZ3RoKSAmJiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKTsgaSsrKXsKLQkJCWZpbmFsIEZpbGUgc291cmNlID0gc291cmNlRmlsZXNbaV07Ci0JCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKHNvdXJjZSwgUHJvZ3Jlc3NEaWFsb2cuREVMRVRFKTsKLQkJCXdoaWxlICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlpZiAoZGVsZXRlRmlsZVN0cnVjdHVyZShzb3VyY2UpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULkFCT1JUIHwgU1dULlJFVFJZIHwgU1dULklHTk9SRSk7Ci0JCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkRGVsZXRlLnRpdGxlIikpOwotCQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZERlbGV0ZS5kZXNjcmlwdGlvbiIsCi0JCQkJCQluZXcgT2JqZWN0W10geyBzb3VyY2UgfSkpOwotCQkJCQlpbnQgYnV0dG9uID0gYm94Lm9wZW4oKTsKLQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuQUJPUlQpIGkgPSBzb3VyY2VOYW1lcy5sZW5ndGg7Ci0JCQkJCWlmIChidXR0b24gPT0gU1dULlJFVFJZKSBicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm9ncmVzc0RpYWxvZy5hZGRQcm9ncmVzcygxKTsKLQkJfQotCQlub3RpZnlSZWZyZXNoRmlsZXMoc291cmNlRmlsZXMpOwotCQlwcm9ncmVzc0RpYWxvZy5jbG9zZSgpOwotCQlwcm9ncmVzc0RpYWxvZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBmaWxlc3lzdGVtIHJvb3QgZW50cmllcwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgRmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcm9vdCBkaXJlY3RvcmllcyBvbiB0aGUgcGxhdGZvcm0sCi0JICogICAgICAgICBtYXkgYmUgZW1wdHkgYnV0IG5vdCBudWxsCi0JICovCi0JRmlsZVtdIGdldFJvb3RzKCkgewotCQkvKgotCQkgKiBPbiBKREsgMS4yMiBvbmx5Li4uCi0JCSAqLwotCQkvLyByZXR1cm4gRmlsZS5saXN0Um9vdHMoKTsKLQotCQkvKgotCQkgKiBPbiBKREsgMS4xLjcgYW5kIGJleW9uZC4uLgotCQkgKiAtLSBQT1JUQUJJTElUWSBJU1NVRVMgSEVSRSAtLQotCQkgKi8KLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSAoIm9zLm5hbWUiKS5pbmRleE9mICgiV2luZG93cyIpICE9IC0xKSB7Ci0JCQlWZWN0b3IgLyogb2YgRmlsZSAqLyBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJbGlzdC5hZGQobmV3IEZpbGUoRFJJVkVfQSkpOwotCQkJbGlzdC5hZGQobmV3IEZpbGUoRFJJVkVfQikpOwotCQkJZm9yIChjaGFyIGkgPSAnYyc7IGkgPD0gJ3onOyArK2kpIHsKLQkJCQlGaWxlIGRyaXZlID0gbmV3IEZpbGUoaSArICI6IiArIEZpbGUuc2VwYXJhdG9yKTsKLQkJCQlpZiAoZHJpdmUuaXNEaXJlY3RvcnkoKSAmJiBkcml2ZS5leGlzdHMoKSkgewotCQkJCQlsaXN0LmFkZChkcml2ZSk7Ci0JCQkJCWlmIChpbml0aWFsICYmIGkgPT0gJ2MnKSB7Ci0JCQkJCQljdXJyZW50RGlyZWN0b3J5ID0gZHJpdmU7Ci0JCQkJCQlpbml0aWFsID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlGaWxlW10gcm9vdHMgPSAoRmlsZVtdKSBsaXN0LnRvQXJyYXkobmV3IEZpbGVbbGlzdC5zaXplKCldKTsKLQkJCXNvcnRGaWxlcyhyb290cyk7Ci0JCQlyZXR1cm4gcm9vdHM7Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShGaWxlLnNlcGFyYXRvcik7Ci0JCQlpZiAoaW5pdGlhbCkgewotCQkJCWN1cnJlbnREaXJlY3RvcnkgPSByb290OwotCQkJCWluaXRpYWwgPSBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsZVtdIHsgcm9vdCB9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGRpcmVjdG9yeSBsaXN0aW5nCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGRpcmVjdG9yeSB0byBiZSBsaXN0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIHRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zLCBtYXkgYmUgZW1wdHkgYnV0IG5vdCBudWxsCi0JICovCi0Jc3RhdGljIEZpbGVbXSBnZXREaXJlY3RvcnlMaXN0KEZpbGUgZmlsZSkgewotCQlGaWxlW10gbGlzdCA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBuZXcgRmlsZVswXTsKLQkJc29ydEZpbGVzKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIGEgZmlsZSBvciBlbnRpcmUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIG9sZCBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBuZXdGaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIHdpdGhvdXQgZXJyb3JzCi0JICovCi0JYm9vbGVhbiBjb3B5RmlsZVN0cnVjdHVyZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlpZiAob2xkRmlsZSA9PSBudWxsIHx8IG5ld0ZpbGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gZW5zdXJlIHRoYXQgbmV3RmlsZSBpcyBub3QgYSBjaGlsZCBvZiBvbGRGaWxlIG9yIGEgZHVwZQotCQlGaWxlIHNlYXJjaEZpbGUgPSBuZXdGaWxlOwotCQlkbyB7Ci0JCQlpZiAob2xkRmlsZS5lcXVhbHMoc2VhcmNoRmlsZSkpIHJldHVybiBmYWxzZTsKLQkJCXNlYXJjaEZpbGUgPSBzZWFyY2hGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJfSB3aGlsZSAoc2VhcmNoRmlsZSAhPSBudWxsKTsKLQkJCi0JCWlmIChvbGRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8qCi0JCQkgKiBDb3B5IGEgZGlyZWN0b3J5Ci0JCQkgKi8KLQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShvbGRGaWxlLCBQcm9ncmVzc0RpYWxvZy5DT1BZKTsKLQkJCX0KLQkJCWlmIChzaW11bGF0ZU9ubHkpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihnZXRSZXNvdXJjZVN0cmluZygic2ltdWxhdGUuRGlyZWN0b3JpZXNDcmVhdGVkLnRleHQiLAotCQkJCS8vCW5ldyBPYmplY3RbXSB7IG5ld0ZpbGUuZ2V0UGF0aCgpIH0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEgbmV3RmlsZS5ta2RpcnMoKSkgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJRmlsZVtdIHN1YkZpbGVzID0gb2xkRmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChzdWJGaWxlcyAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkV29ya1VuaXRzKHN1YkZpbGVzLmxlbmd0aCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBvbGRTdWJGaWxlID0gc3ViRmlsZXNbaV07Ci0JCQkJCUZpbGUgbmV3U3ViRmlsZSA9IG5ldyBGaWxlKG5ld0ZpbGUsIG9sZFN1YkZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKCEgY29weUZpbGVTdHJ1Y3R1cmUob2xkU3ViRmlsZSwgbmV3U3ViRmlsZSkpIHJldHVybiBmYWxzZTsKLQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBDb3B5IGEgZmlsZQotCQkJICovCi0JCQlpZiAoc2ltdWxhdGVPbmx5KSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoInNpbXVsYXRlLkNvcHlGcm9tVG8udGV4dCIsCi0JCQkJLy8JbmV3IE9iamVjdFtdIHsgb2xkRmlsZS5nZXRQYXRoKCksIG5ld0ZpbGUuZ2V0UGF0aCgpIH0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZVJlYWRlciBpbiA9IG51bGw7Ci0JCQkJRmlsZVdyaXRlciBvdXQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWluID0gbmV3IEZpbGVSZWFkZXIob2xkRmlsZSk7Ci0JCQkJCW91dCA9IG5ldyBGaWxlV3JpdGVyKG5ld0ZpbGUpOwotCQkJCi0JCQkJCWludCBjb3VudDsKLQkJCQkJd2hpbGUgKChjb3VudCA9IGluLnJlYWQoKSkgIT0gLTEpIG91dC53cml0ZShjb3VudCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoaW4gIT0gbnVsbCkgaW4uY2xvc2UoKTsKLQkJCQkJCWlmIChvdXQgIT0gbnVsbCkgb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgZmlsZSBvciBlbnRpcmUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIG9sZCBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyB3aXRob3V0IGVycm9ycwotCSAqLwotCWJvb2xlYW4gZGVsZXRlRmlsZVN0cnVjdHVyZShGaWxlIG9sZEZpbGUpIHsKLQkJaWYgKG9sZEZpbGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwkJCi0JCWlmIChvbGRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8qCi0JCQkgKiBEZWxldGUgYSBkaXJlY3RvcnkKLQkJCSAqLwotCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKG9sZEZpbGUsIFByb2dyZXNzRGlhbG9nLkRFTEVURSk7Ci0JCQl9Ci0JCQlGaWxlW10gc3ViRmlsZXMgPSBvbGRGaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKHN1YkZpbGVzICE9IG51bGwpIHsKLQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRXb3JrVW5pdHMoc3ViRmlsZXMubGVuZ3RoKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIG9sZFN1YkZpbGUgPSBzdWJGaWxlc1tpXTsKLQkJCQkJaWYgKCEgZGVsZXRlRmlsZVN0cnVjdHVyZShvbGRTdWJGaWxlKSkgcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzaW11bGF0ZU9ubHkpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGdldFJlc291cmNlU3RyaW5nKCJzaW11bGF0ZS5EZWxldGUudGV4dCIsCi0JCQkvLwluZXcgT2JqZWN0W10geyBvbGRGaWxlLmdldFBhdGgoKSwgb2xkRmlsZS5nZXRQYXRoKCkgfSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gb2xkRmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTb3J0cyBmaWxlcyBsZXhpY29ncmFwaGljYWxseSBieSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgYXJyYXkgb2YgRmlsZXMgdG8gYmUgc29ydGVkCi0JICovCi0Jc3RhdGljIHZvaWQgc29ydEZpbGVzKEZpbGVbXSBmaWxlcykgewotCQkvKiBWZXJ5IGxhenkgbWVyZ2Ugc29ydCBhbGdvcml0aG0gKi8KLQkJc29ydEJsb2NrKGZpbGVzLCAwLCBmaWxlcy5sZW5ndGggLSAxLCBuZXcgRmlsZVtmaWxlcy5sZW5ndGhdKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0QmxvY2soRmlsZVtdIGZpbGVzLCBpbnQgc3RhcnQsIGludCBlbmQsIEZpbGVbXSBtZXJnZVRlbXApIHsKLQkJZmluYWwgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTsKLQkJaWYgKGxlbmd0aCA8IDgpIHsKLQkJCWZvciAoaW50IGkgPSBlbmQ7IGkgPiBzdGFydDsgLS1pKSB7Ci0JCQkJZm9yIChpbnQgaiA9IGVuZDsgaiA+IHN0YXJ0OyAtLWopICB7Ci0JCQkJCWlmIChjb21wYXJlRmlsZXMoZmlsZXNbaiAtIDFdLCBmaWxlc1tqXSkgPiAwKSB7Ci0JCQkJCSAgICBmaW5hbCBGaWxlIHRlbXAgPSBmaWxlc1tqXTsgCi0JCQkJCSAgICBmaWxlc1tqXSA9IGZpbGVzW2otMV07IAotCQkJCQkgICAgZmlsZXNbai0xXSA9IHRlbXA7Ci0JCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwotCQlzb3J0QmxvY2soZmlsZXMsIHN0YXJ0LCBtaWQsIG1lcmdlVGVtcCk7Ci0JCXNvcnRCbG9jayhmaWxlcywgbWlkICsgMSwgZW5kLCBtZXJnZVRlbXApOwotCQlpbnQgeCA9IHN0YXJ0OwotCQlpbnQgeSA9IG1pZCArIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLQkJCWlmICgoeCA+IG1pZCkgfHwgKCh5IDw9IGVuZCkgJiYgY29tcGFyZUZpbGVzKGZpbGVzW3hdLCBmaWxlc1t5XSkgPiAwKSkgewotCQkJCW1lcmdlVGVtcFtpXSA9IGZpbGVzW3krK107Ci0JCQl9IGVsc2UgewotCQkJCW1lcmdlVGVtcFtpXSA9IGZpbGVzW3grK107Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZmlsZXNbaSArIHN0YXJ0XSA9IG1lcmdlVGVtcFtpXTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVGaWxlcyhGaWxlIGEsIEZpbGUgYikgewotLy8JCWJvb2xlYW4gYUlzRGlyID0gYS5pc0RpcmVjdG9yeSgpOwotLy8JCWJvb2xlYW4gYklzRGlyID0gYi5pc0RpcmVjdG9yeSgpOwotLy8JCWlmIChhSXNEaXIgJiYgISBiSXNEaXIpIHJldHVybiAtMTsKLS8vCQlpZiAoYklzRGlyICYmICEgYUlzRGlyKSByZXR1cm4gMTsKLQotCQkvLyBzb3J0IGNhc2Utc2Vuc2l0aXZlIGZpbGVzIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIKLQkJaW50IGNvbXBhcmUgPSBhLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKGIuZ2V0TmFtZSgpKTsKLQkJaWYgKGNvbXBhcmUgPT0gMCkgY29tcGFyZSA9IGEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhiLmdldE5hbWUoKSk7Ci0JCXJldHVybiBjb21wYXJlOwotCX0KLQkKLQkvKgotCSAqIFRoaXMgd29ya2VyIHVwZGF0ZXMgdGhlIHRhYmxlIHdpdGggZmlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgYmFja2dyb3VuZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbiBub3RlczoKLQkgKiA8dWw+Ci0JICogPGxpPiBJdCBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgaXQgY2FuIGJlIGludGVycnVwdGVkIGNsZWFubHkuCi0JICogPGxpPiBJdCB1c2VzIGFzeW5jRXhlYygpIGluIHNvbWUgcGxhY2VzIHRvIGVuc3VyZSB0aGF0IFNXVCBXaWRnZXRzIGFyZSBtYW5pcHVsYXRlZCBpbiB0aGUKLQkgKiAgICAgIHJpZ2h0IHRocmVhZC4gIEV4Y2x1c2l2ZSB1c2Ugb2Ygc3luY0V4ZWMoKSB3b3VsZCBiZSBpbmFwcHJvcHJpYXRlIGFzIGl0IHdvdWxkIHJlcXVpcmUgYSBwYWlyCi0JICogICAgICBvZiBjb250ZXh0IHN3aXRjaGVzIGJldHdlZW4gZWFjaCB0YWJsZSB1cGRhdGUgb3BlcmF0aW9uLgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCi0JLyoqCi0JICogU3RvcHMgdGhlIHdvcmtlciBhbmQgd2FpdHMgZm9yIGl0IHRvIHRlcm1pbmF0ZS4KLQkgKi8KLQl2b2lkIHdvcmtlclN0b3AoKSB7Ci0JCWlmICh3b3JrZXJUaHJlYWQgPT0gbnVsbCkgcmV0dXJuOwotCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJd29ya2VyQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCXdvcmtlclN0b3BwZWQgPSB0cnVlOwotCQkJd29ya2VyTG9jay5ub3RpZnlBbGwoKTsKLQkJfQotCQl3aGlsZSAod29ya2VyVGhyZWFkICE9IG51bGwpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSB3b3JrZXIgdGhhdCBpdCBzaG91bGQgdXBkYXRlIGl0c2VsZiB3aXRoIG5ldyBkYXRhLgotCSAqIENhbmNlbHMgYW55IHByZXZpb3VzIG9wZXJhdGlvbiBhbmQgYmVnaW5zIGEgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBuZXcgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSB0YWJsZSwgbnVsbCBpcyBpZ25vcmVkCi0JICogQHBhcmFtIGZvcmNlIGlmIHRydWUgY2F1c2VzIGEgcmVmcmVzaCBldmVuIGlmIHRoZSBkYXRhIGlzIHRoZSBzYW1lCi0JICovCi0Jdm9pZCB3b3JrZXJVcGRhdGUoRmlsZSBkaXIsIGJvb2xlYW4gZm9yY2UpIHsKLQkJaWYgKGRpciA9PSBudWxsKSByZXR1cm47Ci0JCWlmICgoIWZvcmNlKSAmJiAod29ya2VyTmV4dERpciAhPSBudWxsKSAmJiAod29ya2VyTmV4dERpci5lcXVhbHMoZGlyKSkpIHJldHVybjsKLQotCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJd29ya2VyTmV4dERpciA9IGRpcjsKLQkJCXdvcmtlclN0b3BwZWQgPSBmYWxzZTsKLQkJCXdvcmtlckNhbmNlbGxlZCA9IHRydWU7Ci0JCQl3b3JrZXJMb2NrLm5vdGlmeUFsbCgpOwotCQl9Ci0JCWlmICh3b3JrZXJUaHJlYWQgPT0gbnVsbCkgewotCQkJd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZCh3b3JrZXJSdW5uYWJsZSk7Ci0JCQl3b3JrZXJUaHJlYWQuc3RhcnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hbmFnZXMgdGhlIHdvcmtlcidzIHRocmVhZAotCSAqLwotCXByaXZhdGUgZmluYWwgUnVubmFibGUgd29ya2VyUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICghIHdvcmtlclN0b3BwZWQpIHsKLQkJCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJCQl3b3JrZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJCQkJd29ya2VyU3RhdGVEaXIgPSB3b3JrZXJOZXh0RGlyOwotCQkJCX0KLQkJCQl3b3JrZXJFeGVjdXRlKCk7Ci0JCQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICgoIXdvcmtlckNhbmNlbGxlZCkgJiYgKHdvcmtlclN0YXRlRGlyID09IHdvcmtlck5leHREaXIpKSB3b3JrZXJMb2NrLndhaXQoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJd29ya2VyVGhyZWFkID0gbnVsbDsKLQkJCS8vIHdha2UgdXAgVUkgdGhyZWFkIGluIGNhc2UgaXQgaXMgaW4gYSBtb2RhbCBsb29wIGF3YWl0aW5nIHRocmVhZCB0ZXJtaW5hdGlvbgotCQkJLy8gKHNlZSB3b3JrZXJTdG9wKCkpCi0JCQlkaXNwbGF5Lndha2UoKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdGFibGUncyBjb250ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCB3b3JrZXJFeGVjdXRlKCkgewotCQlGaWxlW10gZGlyTGlzdDsKLQkJLy8gQ2xlYXIgZXhpc3RpbmcgaW5mb3JtYXRpb24KLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdGFibGVDb250ZW50c09mTGFiZWwuc2V0VGV4dChGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkNvbnRlbnRzT2YudGV4dCIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IHdvcmtlclN0YXRlRGlyLmdldFBhdGgoKSB9KSk7Ci0JCQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJdGFibGUuc2V0RGF0YShUQUJMRURBVEFfRElSLCB3b3JrZXJTdGF0ZURpcik7Ci0JCQl9Ci0JCX0pOwotCQlkaXJMaXN0ID0gZ2V0RGlyZWN0b3J5TGlzdCh3b3JrZXJTdGF0ZURpcik7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgKCEgd29ya2VyQ2FuY2VsbGVkKSAmJiAoaSA8IGRpckxpc3QubGVuZ3RoKTsgaSsrKSB7Ci0JCQl3b3JrZXJBZGRGaWxlRGV0YWlscyhkaXJMaXN0W2ldKTsKLQkJfQotCi0JfQotCQkKLQkvKioKLQkgKiBBZGRzIGEgZmlsZSdzIGRldGFpbCBpbmZvcm1hdGlvbiB0byB0aGUgZGlyZWN0b3J5IGxpc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgd29ya2VyQWRkRmlsZURldGFpbHMoZmluYWwgRmlsZSBmaWxlKSB7Ci0JCWZpbmFsIFN0cmluZyBuYW1lU3RyaW5nID0gZmlsZS5nZXROYW1lKCk7Ci0JCWZpbmFsIFN0cmluZyBkYXRlU3RyaW5nID0gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUoZmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotCQlmaW5hbCBTdHJpbmcgc2l6ZVN0cmluZzsKLQkJZmluYWwgU3RyaW5nIHR5cGVTdHJpbmc7Ci0JCWZpbmFsIEltYWdlIGljb25JbWFnZTsKLQkJCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXR5cGVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXR5cGUuRm9sZGVyIik7Ci0JCQlzaXplU3RyaW5nID0gIiI7Ci0JCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWRGb2xkZXJdOwotCQl9IGVsc2UgewotCQkJc2l6ZVN0cmluZyA9IGdldFJlc291cmNlU3RyaW5nKCJmaWxlc2l6ZS5LQiIsCi0JCQkJbmV3IE9iamVjdFtdIHsgbmV3IExvbmcoKGZpbGUubGVuZ3RoKCkgKyA1MTIpIC8gMTAyNCkgfSk7Ci0JCQkKLQkJCWludCBkb3QgPSBuYW1lU3RyaW5nLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoZG90ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG5hbWVTdHJpbmcuc3Vic3RyaW5nKGRvdCk7Ci0JCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb24pOwotCQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQkJdHlwZVN0cmluZyA9IHByb2dyYW0uZ2V0TmFtZSgpOwotCQkJCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuZ2V0SWNvbkZyb21Qcm9ncmFtKHByb2dyYW0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXR5cGVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXR5cGUuVW5rbm93biIsIG5ldyBPYmplY3RbXSB7IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpIH0pOwotCQkJCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25GaWxlXTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXR5cGVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXR5cGUuTm9uZSIpOwotCQkJCWljb25JbWFnZSA9IGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkZpbGVdOwotCQkJfQotCQl9Ci0JCWZpbmFsIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW10geyBuYW1lU3RyaW5nLCBzaXplU3RyaW5nLCB0eXBlU3RyaW5nLCBkYXRlU3RyaW5nIH07Ci0KLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCS8vIGd1YXJkIGFnYWluc3QgdGhlIHNoZWxsIGJlaW5nIGNsb3NlZCBiZWZvcmUgdGhpcyBydW5zCi0JCQkJaWYgKHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCQl0YWJsZUl0ZW0uc2V0VGV4dChzdHJpbmdzKTsKLQkJCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoaWNvbkltYWdlKTsKLQkJCQl0YWJsZUl0ZW0uc2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUsIGZpbGUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbWFuYWdlIGEgcHJvZ3Jlc3MgZGlhbG9nIGZvciBmaWxlIG9wZXJhdGlvbnMuCi0JICovCi0JY2xhc3MgUHJvZ3Jlc3NEaWFsb2cgewotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT1BZID0gMDsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVMRVRFID0gMTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTU9WRSA9IDI7Ci0KLQkJU2hlbGwgc2hlbGw7Ci0JCUxhYmVsIG1lc3NhZ2VMYWJlbCwgZGV0YWlsTGFiZWw7Ci0JCVByb2dyZXNzQmFyIHByb2dyZXNzQmFyOwotCQlCdXR0b24gY2FuY2VsQnV0dG9uOwotCQlib29sZWFuIGlzQ2FuY2VsbGVkID0gZmFsc2U7Ci0KLQkJZmluYWwgU3RyaW5nIG9wZXJhdGlvbktleU5hbWVbXSA9IHsKLQkJCSJDb3B5IiwKLQkJCSJEZWxldGUiLAotCQkJIk1vdmUiCi0JCX07Ci0JCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgcHJvZ3Jlc3MgZGlhbG9nIGJ1dCBkb2VzIG5vdCBvcGVuIGl0IGltbWVkaWF0ZWx5LgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IFNoZWxsCi0JCSAqIEBwYXJhbSBzdHlsZSBvbmUgb2YgQ09QWSwgTU9WRQotCQkgKi8KLQkJcHVibGljIFByb2dyZXNzRGlhbG9nKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVElUTEUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCXNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLiIgKyBvcGVyYXRpb25LZXlOYW1lW3N0eWxlXSArICIudGl0bGUiKSk7Ci0JCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkJCWlzQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLiIgKyBvcGVyYXRpb25LZXlOYW1lW3N0eWxlXSArICIuZGVzY3JpcHRpb24iKSk7Ci0JCQkKLQkJCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5XUkFQKTsKLQkJCXByb2dyZXNzQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCXByb2dyZXNzQmFyLnNldE1pbmltdW0oMCk7Ci0JCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKDApOwotCQkJCi0JCQlkZXRhaWxMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkhPUklaT05UQUwpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWRldGFpbExhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCi0JCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQljYW5jZWxCdXR0b24uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygicHJvZ3Jlc3NEaWFsb2cuY2FuY2VsQnV0dG9uLnRleHQiKSk7Ci0JCQljYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpc0NhbmNlbGxlZCA9IHRydWU7Ci0JCQkJCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkvKioKLQkJICogU2V0cyB0aGUgZGV0YWlsIHRleHQgdG8gc2hvdyB0aGUgZmlsZW5hbWUgYWxvbmcgd2l0aCBhIHN0cmluZwotCQkgKiByZXByZXNlbnRpbmcgdGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgb24gdGhhdCBmaWxlLgotCQkgKiAKLQkJICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gYmUgZGV0YWlsZWQKLQkJICogQHBhcmFtIG9wZXJhdGlvbiBvbmUgb2YgQ09QWSwgREVMRVRFCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREZXRhaWxGaWxlKEZpbGUgZmlsZSwgaW50IG9wZXJhdGlvbikgewotCQkJZGV0YWlsTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygicHJvZ3Jlc3NEaWFsb2cuIiArIG9wZXJhdGlvbktleU5hbWVbb3BlcmF0aW9uXSArICIub3BlcmF0aW9uIiwKLQkJCQluZXcgT2JqZWN0W10geyBmaWxlIH0pKTsKLQkJfQotCQkvKioKLQkJICogUmV0dXJucyB0cnVlIGlmIHRoZSBDYW5jZWwgYnV0dG9uIHdhcyBiZWVuIGNsaWNrZWQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIENhbmNlbCBidXR0b24gd2FzIGNsaWNrZWQuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLQkJCXJldHVybiBpc0NhbmNlbGxlZDsKLQkJfQotCQkvKioKLQkJICogU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgdG8gYmUgcGVyZm9ybWVkLgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmsgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRUb3RhbFdvcmtVbml0cyhpbnQgd29yaykgewotCQkJcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bSh3b3JrKTsKLQkJfQotCQkvKioKLQkJICogQWRkcyB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgdG8gYmUgcGVyZm9ybWVkLgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmsgdGhlIG51bWJlciBvZiB3b3JrIHVuaXRzIHRvIGFkZAotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkV29ya1VuaXRzKGludCB3b3JrKSB7Ci0JCQlzZXRUb3RhbFdvcmtVbml0cyhwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCkgKyB3b3JrKTsKLQkJfQotCQkvKioKLQkJICogU2V0cyB0aGUgcHJvZ3Jlc3Mgb2YgY29tcGxldGlvbiBvZiB0aGUgdG90YWwgd29yayB1bml0cy4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBjb21wbGV0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzKGludCB3b3JrKSB7Ci0JCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24od29yayk7Ci0JCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30gLy8gZW5hYmxlIGV2ZW50IHByb2Nlc3NpbmcKLQkJfQotCQkvKioKLQkJICogQWRkcyB0byB0aGUgcHJvZ3Jlc3Mgb2YgY29tcGxldGlvbiBvZiB0aGUgdG90YWwgd29yayB1bml0cy4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSBudW1iZXIgb2Ygd29yayB1bml0cyBjb21wbGV0ZWQgdG8gYWRkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRQcm9ncmVzcyhpbnQgd29yaykgewotCQkJc2V0UHJvZ3Jlc3MocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgKyB3b3JrKTsKLQkJfQotCQkvKioKLQkJICogT3BlbnMgdGhlIGRpYWxvZy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCQlzaGVsbC5wYWNrKCk7Ci0JCQlmaW5hbCBTaGVsbCBwYXJlbnRTaGVsbCA9IChTaGVsbCkgc2hlbGwuZ2V0UGFyZW50KCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHBhcmVudFNoZWxsLmdldEJvdW5kcygpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHNoZWxsLmdldEJvdW5kcygpOwotCQkJYm91bmRzLnggPSByZWN0LnggKyAocmVjdC53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCQkJYm91bmRzLnkgPSByZWN0LnkgKyAocmVjdC5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSAvIDI7Ci0JCQlzaGVsbC5zZXRCb3VuZHMoYm91bmRzKTsKLQkJCXNoZWxsLm9wZW4oKTsKLQkJfQotCQkvKioKLQkJICogQ2xvc2VzIHRoZSBkaWFsb2cgYW5kIGRpc3Bvc2VzIGl0cyByZXNvdXJjZXMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlzaGVsbCA9IG51bGw7Ci0JCQltZXNzYWdlTGFiZWwgPSBudWxsOwotCQkJZGV0YWlsTGFiZWwgPSBudWxsOwotCQkJcHJvZ3Jlc3NCYXIgPSBudWxsOwotCQkJY2FuY2VsQnV0dG9uID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvSWNvbkNhY2hlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ljb25DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2U3YjExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvSWNvbkNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIE1hbmFnZXMgaWNvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGFzIHdlIGNvdWxkIGVhc2lseSBlbmQgdXAgY3JlYXRpbmcgdGhvdXNhbmRzIG9mIGljb25zCi0gKiBiZWFyaW5nIHRoZSBzYW1lIGltYWdlLgotICovCi1jbGFzcyBJY29uQ2FjaGUgewotCS8vIFN0b2NrIGltYWdlcwotCXB1YmxpYyBmaW5hbCBpbnQKLQkJc2hlbGxJY29uID0gMCwKLQkJaWNvbkNsb3NlZERyaXZlID0gMSwKLQkJaWNvbkNsb3NlZEZvbGRlciA9IDIsCi0JCWljb25GaWxlID0gMywKLQkJaWNvbk9wZW5Ecml2ZSA9IDQsCi0JCWljb25PcGVuRm9sZGVyID0gNSwKLQkJY21kQ29weSA9IDYsCi0JCWNtZEN1dCA9IDcsCi0JCWNtZERlbGV0ZSA9IDgsCi0JCWNtZFBhcmVudCA9IDksCi0JCWNtZFBhc3RlID0gMTAsCi0JCWNtZFByaW50ID0gMTEsCi0JCWNtZFJlZnJlc2ggPSAxMiwKLQkJY21kUmVuYW1lID0gMTMsCi0JCWNtZFNlYXJjaCA9IDE0OwotCXB1YmxpYyBmaW5hbCBTdHJpbmdbXSBzdG9ja0ltYWdlTG9jYXRpb25zID0gewotCQkiZ2VuZXJpY19leGFtcGxlLmdpZiIsCi0JCSJpY29uX0Nsb3NlZERyaXZlLmdpZiIsCi0JCSJpY29uX0Nsb3NlZEZvbGRlci5naWYiLAotCQkiaWNvbl9GaWxlLmdpZiIsCi0JCSJpY29uX09wZW5Ecml2ZS5naWYiLAotCQkiaWNvbl9PcGVuRm9sZGVyLmdpZiIsCi0JCSJjbWRfQ29weS5naWYiLAotCQkiY21kX0N1dC5naWYiLAotCQkiY21kX0RlbGV0ZS5naWYiLAotCQkiY21kX1BhcmVudC5naWYiLAotCQkiY21kX1Bhc3RlLmdpZiIsCi0JCSJjbWRfUHJpbnQuZ2lmIiwKLQkJImNtZF9SZWZyZXNoLmdpZiIsCi0JCSJjbWRfUmVuYW1lLmdpZiIsCi0JCSJjbWRfU2VhcmNoLmdpZiIKLQl9OwotCXB1YmxpYyBJbWFnZSBzdG9ja0ltYWdlc1tdOwotCQotCS8vIFN0b2NrIGN1cnNvcnMKLQlwdWJsaWMgZmluYWwgaW50Ci0JCWN1cnNvckRlZmF1bHQgPSAwLAotCQljdXJzb3JXYWl0ID0gMTsKLQlwdWJsaWMgQ3Vyc29yIHN0b2NrQ3Vyc29yc1tdOwotCS8vIENhY2hlZCBpY29ucwotCXByaXZhdGUgSGFzaHRhYmxlIGljb25DYWNoZTsgLyogbWFwIFByb2dyYW0gdG8gSW1hZ2UgKi8KLQkKLQlwdWJsaWMgSWNvbkNhY2hlKCkgewotCX0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UmVzb3VyY2VzKERpc3BsYXkgZGlzcGxheSkgewotCQlpZiAoc3RvY2tJbWFnZXMgPT0gbnVsbCkgewotCQkJc3RvY2tJbWFnZXMgPSBuZXcgSW1hZ2Vbc3RvY2tJbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9ja0ltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBjcmVhdGVTdG9ja0ltYWdlKGRpc3BsYXksIHN0b2NrSW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLQkJCQkJCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpKTsKLQkJCQl9Ci0JCQkJc3RvY2tJbWFnZXNbaV0gPSBpbWFnZTsKLQkJCX0KLQkJfQkKLQkJaWYgKHN0b2NrQ3Vyc29ycyA9PSBudWxsKSB7Ci0JCQlzdG9ja0N1cnNvcnMgPSBuZXcgQ3Vyc29yW10gewotCQkJCW51bGwsCi0JCQkJbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpCi0JCQl9OwotCQl9Ci0JCWljb25DYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChzdG9ja0ltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0b2NrSW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBzdG9ja0ltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJc3RvY2tJbWFnZXMgPSBudWxsOwotCQl9Ci0JCWlmIChpY29uQ2FjaGUgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBpdCA9IGljb25DYWNoZS5lbGVtZW50cygpOyBpdC5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0Lm5leHRFbGVtZW50KCk7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWlmIChzdG9ja0N1cnNvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9ja0N1cnNvcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBDdXJzb3IgY3Vyc29yID0gc3RvY2tDdXJzb3JzW2ldOwotCQkJCWlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN0b2NrQ3Vyc29ycyA9IG51bGw7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIHN0b2NrIGltYWdlCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbgotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlU3RvY2tJbWFnZShEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBwYXRoKSB7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IEljb25DYWNoZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChwYXRoKTsKLQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEgKHN0cmVhbSk7Ci0JCUltYWdlRGF0YSBtYXNrID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2sgKCk7Ci0JCUltYWdlIHJlc3VsdCA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VEYXRhLCBtYXNrKTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSAoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogR2V0cyBhbiBpbWFnZSBmb3IgYSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2dyYW0KLQkgKgotCSAqIEBwYXJhbSBwcm9ncmFtIHRoZSBQcm9ncmFtCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb25Gcm9tUHJvZ3JhbShQcm9ncmFtIHByb2dyYW0pIHsKLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGljb25DYWNoZS5nZXQocHJvZ3JhbSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gcHJvZ3JhbS5nZXRJbWFnZURhdGEoKTsKLQkJCWlmIChpbWFnZURhdGEgIT0gbnVsbCkgewotCQkJCWltYWdlID0gbmV3IEltYWdlKG51bGwsIGltYWdlRGF0YSwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKSk7Ci0JCQkJaWNvbkNhY2hlLnB1dChwcm9ncmFtLCBpbWFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlID0gc3RvY2tJbWFnZXNbaWNvbkZpbGVdOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9Db3B5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0NvcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Mjc0YjA3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ3V0LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0N1dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOTQ4YjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0RlbGV0ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9EZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjY0NzY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXJlbnQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFyZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIyNzhlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXJlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFzdGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWUwYWIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1ByaW50LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRmYThjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZWZyZXNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDYzYzIzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVuYW1lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlbmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1YjEzMjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVuYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1NlYXJjaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9TZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGMzZWJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1NlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2dlbmVyaWNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2dlbmVyaWNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5ZmI2YjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9nZW5lcmljX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZERyaXZlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWREcml2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTUzMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZERyaXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWRGb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZEZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYjZlZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZEZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fRmlsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiODZkMDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Ecml2ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkRyaXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyYjYzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkRyaXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTljNzc3MzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWR2YW5jZWRHcmFwaGljcy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWR2YW5jZWRHcmFwaGljcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZiN2U2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FkdmFuY2VkR3JhcGhpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi0vKiAKLSAqIERyYXdpbmcgd2l0aCB0cmFuc2Zvcm1hdGlvbnMsIHBhdGhzIGFuZCBhbHBoYSBibGVuZGluZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIEFkdmFuY2VkR3JhcGhpY3MgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfZ3JhcGhpY3MiKTsKLQkKLQlzdGF0aWMgSW1hZ2UgbG9hZEltYWdlIChEaXNwbGF5IGRpc3BsYXksIENsYXNzIGNsYXp6LCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0gKHN0cmluZyk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBzdHJlYW0pOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlICgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuKGZpbmFsIERpc3BsYXkgZGlzcGxheSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJBZHZhbmNlZEdyYXBoaWNzIikpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCXBhdGguZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0JCQlkaWFsb2cuc2V0VGV4dChSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJXYXJuaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2cuc2V0TWVzc2FnZShSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJMaWJOb3RGb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUZvbnREYXRhIGZkID0gc2hlbGwuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCWZpbmFsIEZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgOTYsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JCWZpbmFsIEltYWdlIGltYWdlID0gbG9hZEltYWdlKGRpc3BsYXksIEFkdmFuY2VkR3JhcGhpY3MuY2xhc3MsICJpcm1hb3MuanBnIik7Ci0JCWZpbmFsIFJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwkJCQkKLQkJCQlUcmFuc2Zvcm0gdHIgPSBuZXcgVHJhbnNmb3JtKGRpc3BsYXkpOwotCQkJCXRyLnRyYW5zbGF0ZShyZWN0LndpZHRoIC8gNCwgcmVjdC5oZWlnaHQgLyAyKTsKLQkJCQl0ci5yb3RhdGUoLTMwKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQkJfQotCQkJCWdjLnNldEFscGhhKDEwMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXRyLmRpc3Bvc2UoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpKTsKLQkJc2hlbGwub3BlbigpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsJCi0JCXJldHVybiBzaGVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBBZHZhbmNlZEdyYXBoaWNzKCkub3BlbihkaXNwbGF5KTsKLQkJd2hpbGUgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CbGFja0hvbGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JsYWNrSG9sZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjFlYWFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JsYWNrSG9sZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBjbGFzcyBCbGFja0hvbGVUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JCi0JaW50IHNpemUgPSAxOwotCQotcHVibGljIEJsYWNrSG9sZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmxhY2tIb2xlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIGJvb2xlYW4gaXNBbmltYXRlZCgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoc2l6ZSA+IHdpZHRoICogMyAvIDIpIHNpemUgPSAwOwotCWVsc2Ugc2l6ZSArPSAxMDsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQlnYy5maWxsT3ZhbCgod2lkdGggLSBzaXplKSAvIDIsIChoZWlnaHQgLSBzaXplKSAvIDIsIHNpemUsIHNpemUpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0V4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkMWRiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0V4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBHcmFwaGljc0V4YW1wbGUgewotCQotCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JR3JhcGhpY3NUYWJbXSB0YWJzOwotCUdyYXBoaWNzVGFiIHRhYjsKLQlPYmplY3RbXSB0YWJCYWNrZ3JvdW5kOwotCQotCWJvb2xlYW4gYW5pbWF0ZTsKLQkKLQlMaXN0ZW5lciByZWRyYXdMaXN0ZW5lcjsKLQkKLQlUb29sQmFyIHRvb2xCYXI7Ci0JVHJlZSB0YWJMaXN0OwotCUNhbnZhcyBjYW52YXM7Ci0JQ29tcG9zaXRlIGNvbnRyb2xQYW5lbCwgdGFiUGFuZWw7Ci0JVG9vbEl0ZW0gcGxheUl0ZW0sIHBhdXNlSXRlbSwgYmFja0l0ZW0sIGRiSXRlbTsKLQlTcGlubmVyIHRpbWVyU3Bpbm5lcjsKLQkKLQlNZW51IGJhY2tNZW51OwotCU1lbnVJdGVtIGN1c3RvbU1JOwotCUltYWdlIGN1c3RvbUltYWdlOwotCUNvbG9yIGN1c3RvbUNvbG9yOwotCQotCVZlY3RvciBpbWFnZXM7Ci0JCi0Jc3RhdGljIGJvb2xlYW4gYWR2YW5jZUdyYXBoaWNzLCBhZHZhbmNlR3JhcGhpY3NJbml0OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgVElNRVIgPSAzMDsKLQlzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19ncmFwaGljcyIpOyAvLyROT04tTkxTLTEkCi0KLXB1YmxpYyBHcmFwaGljc0V4YW1wbGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCXRoaXMucGFyZW50ID0gcGFyZW50OwotCXJlZHJhd0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlyZWRyYXcoKTsKLQkJfQotCX07Ci0JR3JpZERhdGEgZGF0YTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQl0YWJzID0gY3JlYXRlVGFicygpOwkKLQlpbWFnZXMgPSBuZXcgVmVjdG9yKCk7CQotCWNyZWF0ZVRvb2xCYXIocGFyZW50KTsKLQljcmVhdGVUYWJMaXN0KHBhcmVudCk7Ci0JZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2gocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCWNyZWF0ZVRhYlBhbmVsKHBhcmVudCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsJCi0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOwotCWRhdGEud2lkdGhIaW50ID0gdGFiTGlzdC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnggKyA1MDsKLQl0YWJMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOwotCXNhc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JdGFiUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpIHsKLQkJCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKXRhYkxpc3QuZ2V0TGF5b3V0RGF0YSgpOwkJCQkKLQkJCQlkYXRhLndpZHRoSGludCA9IGV2ZW50LnggLSB0YWJMaXN0LmNvbXB1dGVUcmltKDAsIDAsIDAsIDApLndpZHRoOwotCQkJCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCQkJYW5pbWF0ZSA9IHBhdXNlSXRlbS5nZXRFbmFibGVkKCk7Ci0JCQl9IGVsc2UgewotCQkJCWFuaW1hdGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0pOwkKLQlzZXRUYWIodGFiKTsKLQlzdGFydEFuaW1hdGlvblRpbWVyKCk7Ci19Ci0KLWJvb2xlYW4gY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkgewotCWlmIChhZHZhbmNlR3JhcGhpY3NJbml0KSByZXR1cm4gYWR2YW5jZUdyYXBoaWNzOwotCWFkdmFuY2VHcmFwaGljc0luaXQgPSB0cnVlOwotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCXRyeSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlTaGVsbCBzaGVsbCA9IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSwgbmV3U2hlbGwgPSBudWxsOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgc2hlbGwgPSBuZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0JCWRpYWxvZy5zZXRUZXh0KFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIldhcm5pbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldE1lc3NhZ2UoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiTGliTm90Rm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKG5ld1NoZWxsICE9IG51bGwpIG5ld1NoZWxsLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gYWR2YW5jZUdyYXBoaWNzID0gdHJ1ZTsKLX0KLQotdm9pZCBjcmVhdGVDYW52YXMoQ29tcG9zaXRlIHBhcmVudCkgewotCWNhbnZhcyA9IG5ldyBDYW52YXMocGFyZW50LCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JY2FudmFzLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJR0MgZ2M7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCQlJbWFnZSBidWZmZXIgPSBudWxsOwotCQkJaWYgKGRiSXRlbS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWJ1ZmZlciA9IG5ldyBJbWFnZShjYW52YXMuZ2V0RGlzcGxheSgpLCByZWN0KTsKLQkJCQlnYyA9IG5ldyBHQyhidWZmZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlnYyA9IGV2ZW50LmdjOwotCQkJfQotCQkJcGFpbnRCYWNrZ3JvdW5kKGdjLCByZWN0KTsKLQkJCUdyYXBoaWNzVGFiIHRhYiA9IGdldFRhYigpOwotCQkJaWYgKHRhYiAhPSBudWxsKSB0YWIucGFpbnQoZ2MsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCWlmIChnYyAhPSBldmVudC5nYykgZ2MuZGlzcG9zZSgpOwotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJZXZlbnQuZ2MuZHJhd0ltYWdlKGJ1ZmZlciwgMCwgMCk7Ci0JCQkJYnVmZmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0pOwotfQotCi12b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JR3JvdXAgZ3JvdXA7Ci0JY29udHJvbFBhbmVsID0gZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQljb250cm9sUGFuZWwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci19Ci0KLXZvaWQgY3JlYXRlVGFiUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCXRhYlBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBkYXRhOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCXRhYlBhbmVsLnNldExheW91dChsYXlvdXQpOwotCWNyZWF0ZUNhbnZhcyh0YWJQYW5lbCk7Ci0JY3JlYXRlQ29udHJvbFBhbmVsKHRhYlBhbmVsKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JY2FudmFzLnNldExheW91dERhdGEoZGF0YSk7CQotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQljb250cm9sUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLQotdm9pZCBjcmVhdGVUb29sQmFyKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKLQlMaXN0ZW5lciB0b29sQmFyTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5TZWxlY3Rpb246IHsKLQkJCQkJaWYgKGV2ZW50LndpZGdldCA9PSBwbGF5SXRlbSkgewotCQkJCQkJYW5pbWF0ZSA9IHRydWU7Ci0JCQkJCQlwbGF5SXRlbS5zZXRFbmFibGVkKCFhbmltYXRlKTsKLQkJCQkJCXBhdXNlSXRlbS5zZXRFbmFibGVkKGFuaW1hdGUpOwotCQkJCQl9IGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBwYXVzZUl0ZW0pIHsKLQkJCQkJCWFuaW1hdGUgPSBmYWxzZTsKLQkJCQkJCXBsYXlJdGVtLnNldEVuYWJsZWQoIWFuaW1hdGUpOwotCQkJCQkJcGF1c2VJdGVtLnNldEVuYWJsZWQoYW5pbWF0ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGJhY2tJdGVtKSB7Ci0JCQkJCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwkJCQotCQkJCQkJUmVjdGFuZ2xlIHRvb2xJdGVtQm91bmRzID0gdG9vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sSXRlbUJvdW5kcy54LCB0b29sSXRlbUJvdW5kcy55KSk7Ci0JCQkJCQliYWNrTWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgdG9vbEl0ZW1Cb3VuZHMuaGVpZ2h0KTsKLQkJCQkJCWJhY2tNZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXBsYXlJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQlwbGF5SXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJQbGF5IikpOyAvLyROT04tTkxTLTEkCi0JcGxheUl0ZW0uc2V0SW1hZ2UobG9hZEltYWdlKGRpc3BsYXksICJwbGF5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCXBsYXlJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRvb2xCYXJMaXN0ZW5lcik7Ci0JCi0JcGF1c2VJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQlwYXVzZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiUGF1c2UiKSk7IC8vJE5PTi1OTFMtMSQKLQlwYXVzZUl0ZW0uc2V0SW1hZ2UobG9hZEltYWdlKGRpc3BsYXksICJwYXVzZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQlwYXVzZUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdG9vbEJhckxpc3RlbmVyKTsKLQkKLQliYWNrSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JYmFja0l0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCWJhY2tJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRvb2xCYXJMaXN0ZW5lcik7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW117Ci0JCWdldFJlc291cmNlU3RyaW5nKCJXaGl0ZSIpLCAvLyROT04tTkxTLTEkCi0JCWdldFJlc291cmNlU3RyaW5nKCJCbGFjayIpLCAvLyROT04tTkxTLTEkCi0JCWdldFJlc291cmNlU3RyaW5nKCJSZWQiKSwgLy8kTk9OLU5MUy0xJAotCQlnZXRSZXNvdXJjZVN0cmluZygiR3JlZW4iKSwgLy8kTk9OLU5MUy0xJAotCQlnZXRSZXNvdXJjZVN0cmluZygiQmx1ZSIpLCAvLyROT04tTkxTLTEkCi0JCWdldFJlc291cmNlU3RyaW5nKCJDdXN0b21Db2xvciIpLCAvLyROT04tTkxTLTEkCi0JfTsKLQlDb2xvcltdIGNvbG9ycyA9IG5ldyBDb2xvcltdewotCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSksCQotCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyksCQotCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpLAkKLQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pLAkKLQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSksCi0JCW51bGwsCi0JfTsJCi0JYmFja01lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSlldmVudC53aWRnZXQ7Ci0JCQlpZiAoY3VzdG9tTUkgPT0gaXRlbSkgewotCQkJCUNvbG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0JCQkJUkdCIHJnYiA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJaWYgKGN1c3RvbUNvbG9yICE9IG51bGwpIGN1c3RvbUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQljdXN0b21Db2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJCWlmIChjdXN0b21JbWFnZSAhPSBudWxsKSBjdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJY3VzdG9tSW1hZ2UgPSBjcmVhdGVJbWFnZShkaXNwbGF5LCBjdXN0b21Db2xvcik7Ci0JCQkJaXRlbS5zZXREYXRhKG5ldyBPYmplY3RbXXtjdXN0b21Db2xvciwgY3VzdG9tSW1hZ2V9KTsKLQkJCQlpdGVtLnNldEltYWdlKGN1c3RvbUltYWdlKTsKLQkJCX0KLQkJCXRhYkJhY2tncm91bmQgPSAoT2JqZWN0W10paXRlbS5nZXREYXRhKCk7Ci0JCQliYWNrSXRlbS5zZXRJbWFnZSgoSW1hZ2UpdGFiQmFja2dyb3VuZFsxXSk7Ci0JCQljYW52YXMucmVkcmF3KCk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShiYWNrTWVudSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmFtZXNbaV0pOwotCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoY29sb3JzW2ldICE9IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoZGlzcGxheSwgY29sb3JzW2ldKTsKLQkJCWltYWdlcy5hZGRFbGVtZW50KGltYWdlKTsKLQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl9IGVsc2UgewotCQkJLy8gY3VzdG9tIG1lbnUgaXRlbQotCQkJY3VzdG9tTUkgPSBpdGVtOwotCQl9Ci0JCWl0ZW0uc2V0RGF0YShuZXcgT2JqZWN0W117Y29sb3JzW2ldLCBpbWFnZX0pOwotCQlpZiAodGFiQmFja2dyb3VuZCA9PSBudWxsKSB7Ci0JCQl0YWJCYWNrZ3JvdW5kID0gKE9iamVjdFtdKWl0ZW0uZ2V0RGF0YSgpOwotCQkJYmFja0l0ZW0uc2V0SW1hZ2UoKEltYWdlKXRhYkJhY2tncm91bmRbMV0pOwotCQl9Ci0JfQotCQotCWRiSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCWRiSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJEb3VibGVCdWZmZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQlkYkl0ZW0uc2V0SW1hZ2UobG9hZEltYWdlKGRpc3BsYXksICJkYi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCVRvb2xJdGVtIHNlcGFyYXRvciA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUodG9vbEJhciwgU1dULk5PTkUpOwotCUdyaWREYXRhIGRhdGE7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDM7Ci0JY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQl0aW1lclNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQl0aW1lclNwaW5uZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQW5pbWF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JdGltZXJTcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JdGltZXJTcGlubmVyLnNldFNlbGVjdGlvbihUSU1FUik7Ci0JdGltZXJTcGlubmVyLnNldFNlbGVjdGlvbihUSU1FUik7Ci0Jc2VwYXJhdG9yLnNldENvbnRyb2woY29tcCk7Ci0Jc2VwYXJhdG9yLnNldFdpZHRoKGNvbXAuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54KTsKLX0KLQotSW1hZ2UgY3JlYXRlSW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBDb2xvciBjb2xvcikgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLQlpZiAoY29sb3IuZXF1YWxzKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSkpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCX0KLQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoIC0gMSwgcmVjdC5oZWlnaHQgLSAxKTsKLQlnYy5kaXNwb3NlKCk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi12b2lkIGNyZWF0ZVRhYkxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCXRhYkxpc3QgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCUdyYXBoaWNzVGFiIHRhYiA9IHRhYnNbaV07Ci0JCXNldC5hZGQodGFiLmdldENhdGVnb3J5KCkpOwotCX0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odGFiTGlzdCwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JfQotCVRyZWVJdGVtW10gaXRlbXMgPSB0YWJMaXN0LmdldEl0ZW1zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgewotCQkJR3JhcGhpY3NUYWIgdGFiID0gdGFic1tqXTsKLQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHModGFiLmdldENhdGVnb3J5KCkpKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCWl0ZW0xLnNldFRleHQodGFiLmdldFRleHQoKSk7Ci0JCQkJaXRlbTEuc2V0RGF0YSh0YWIpOwotCQkJfQotCQl9Ci0JfQotCXRhYkxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCXNldFRhYigoR3JhcGhpY3NUYWIpaXRlbS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLUdyYXBoaWNzVGFiW10gY3JlYXRlVGFicygpIHsKLQlyZXR1cm4gbmV3IEdyYXBoaWNzVGFiW10gewotCQluZXcgTGluZVRhYih0aGlzKSwKLQkJbmV3IFN0YXJQb2x5VGFiKHRoaXMpLAotCQl0YWIgPSBuZXcgSW50cm9UYWIodGhpcyksCi0JCW5ldyBCbGFja0hvbGVUYWIodGhpcyksCi0JfTsKLX0KLQotLyoqCi0gKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmICh0YWJzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmFwaGljc1RhYiB0YWIgPSB0YWJzW2ldOwotCQkJdGFiLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQl0YWJzID0gbnVsbDsKLQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCSgoSW1hZ2UpaW1hZ2VzLmVsZW1lbnRBdChpKSkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCWltYWdlcyA9IG51bGw7Ci0JaWYgKGN1c3RvbUNvbG9yICE9IG51bGwpIGN1c3RvbUNvbG9yLmRpc3Bvc2UoKTsKLQljdXN0b21Db2xvciA9IG51bGw7Ci0JaWYgKGN1c3RvbUltYWdlICE9IG51bGwpIGN1c3RvbUltYWdlLmRpc3Bvc2UoKTsKLQljdXN0b21JbWFnZSA9IG51bGw7Ci19Ci0KLVRyZWVJdGVtIGZpbmRJdGVtQnlEYXRhKFRyZWVJdGVtW10gaXRlbXMsIE9iamVjdCBkYXRhKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWlmIChpdGVtLmdldERhdGEoKSA9PSBkYXRhKSByZXR1cm4gaXRlbTsKLQkJaXRlbSA9IGZpbmRJdGVtQnlEYXRhKGl0ZW0uZ2V0SXRlbXMoKSwgZGF0YSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBpdGVtOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IHRhYi4KLSAqLwotcHVibGljIEdyYXBoaWNzVGFiIGdldFRhYigpIHsKLQlyZXR1cm4gdGFiOwotfQotCi1MaXN0ZW5lciBnZXRSZWRyYXdMaXN0ZW5lcigpIHsKLQlyZXR1cm4gcmVkcmF3TGlzdGVuZXI7Ci19Ci0KLS8qKgotICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCXRyeSB7Ci0JCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGtleTsKLQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCQkKLX0KLQotc3RhdGljIEltYWdlIGxvYWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5LCBDbGFzcyBjbGF6eiwgU3RyaW5nIHN0cmluZykgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0gKHN0cmluZyk7Ci0JaWYgKHN0cmVhbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHN0cmVhbSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSAoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JfQotCXJldHVybiBpbWFnZTsKLX0KLQotSW1hZ2UgbG9hZEltYWdlKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIG5hbWUpIHsKLQlJbWFnZSBpbWFnZSA9IGxvYWRJbWFnZShkaXNwbGF5LCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsIG5hbWUpOwotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZXMuYWRkRWxlbWVudChpbWFnZSk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi12b2lkIHBhaW50QmFja2dyb3VuZChHQyBnYywgUmVjdGFuZ2xlIHJlY3QpIHsKLQlnYy5zZXRCYWNrZ3JvdW5kKChDb2xvcil0YWJCYWNrZ3JvdW5kWzBdKTsKLQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotfQotCi0vKioKLSAqIFJlZHJhd3MgdGhlIGN1cnJlbnQgdGFiLgotICovCi1wdWJsaWMgdm9pZCByZWRyYXcoKSB7Ci0JY2FudmFzLnJlZHJhdygpOwotfQotCi0vKioKLSAqIEdyYWJzIGlucHV0IGZvY3VzLgotICovCi1wdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl0YWJMaXN0LnNldEZvY3VzKCk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgY3VycmVudCB0YWIuCi0gKi8KLXB1YmxpYyB2b2lkIHNldFRhYihHcmFwaGljc1RhYiB0YWIpIHsKLQl0aGlzLnRhYiA9IHRhYjsKLQlDb250cm9sW10gY2hpbGRyZW4gPSBjb250cm9sUGFuZWwuZ2V0Q2hpbGRyZW4oKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotCQljb250cm9sLmRpc3Bvc2UoKTsKLQl9Ci0JaWYgKHRhYiAhPSBudWxsKSB7Ci0JCXRhYi5jcmVhdGVDb250cm9sUGFuZWwoY29udHJvbFBhbmVsKTsKLQkJYW5pbWF0ZSA9IHRhYi5pc0FuaW1hdGVkKCk7Ci0JfQotCXBsYXlJdGVtLnNldEVuYWJsZWQoIWFuaW1hdGUpOwotCXBhdXNlSXRlbS5zZXRFbmFibGVkKGFuaW1hdGUpOwotCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpY29udHJvbFBhbmVsLmdldExheW91dERhdGEoKTsKLQljaGlsZHJlbiA9IGNvbnRyb2xQYW5lbC5nZXRDaGlsZHJlbigpOwotCWRhdGEuZXhjbHVkZSA9IGNoaWxkcmVuLmxlbmd0aCA9PSAwOwotCWNvbnRyb2xQYW5lbC5zZXRWaXNpYmxlKCFkYXRhLmV4Y2x1ZGUpOwotCWlmIChkYXRhLmV4Y2x1ZGUpIHsKLQkJdGFiUGFuZWwubGF5b3V0KCk7Ci0JfSBlbHNlIHsKLQkJdGFiUGFuZWwubGF5b3V0KGNoaWxkcmVuKTsKLQl9Ci0JaWYgKHRhYiAhPSBudWxsKSB7Ci0JCVRyZWVJdGVtW10gc2VsZWN0aW9uID0gdGFiTGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCB8fCBzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpICE9IHRhYikgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtQnlEYXRhKHRhYkxpc3QuZ2V0SXRlbXMoKSwgdGFiKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHRhYkxpc3Quc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW19KTsKLQkJfQotCX0KLQljYW52YXMucmVkcmF3KCk7Ci19Ci0KLXZvaWQgc3RhcnRBbmltYXRpb25UaW1lcigpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlkaXNwbGF5LnRpbWVyRXhlYyh0aW1lclNwaW5uZXIuZ2V0U2VsZWN0aW9uKCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCWlmIChhbmltYXRlKSB7Ci0JCQkJR3JhcGhpY3NUYWIgdGFiID0gZ2V0VGFiKCk7Ci0JCQkJaWYgKHRhYiAhPSBudWxsICYmIHRhYi5pc0FuaW1hdGVkKCkpIHsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQl0YWIubmV4dChyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJY2FudmFzLnVwZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWRpc3BsYXkudGltZXJFeGVjKHRpbWVyU3Bpbm5lci5nZXRTZWxlY3Rpb24oKSwgdGhpcyk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU1dUR3JhcGhpY3MiKSk7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSA9IG5ldyBHcmFwaGljc0V4YW1wbGUoc2hlbGwpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsJCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWUzMjZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNzVGFiIHsKLQkKLUdyYXBoaWNzRXhhbXBsZSBleGFtcGxlOwotCi1wdWJsaWMgR3JhcGhpY3NUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQl0aGlzLmV4YW1wbGUgPSBleGFtcGxlOwotfQotCi0vKiogCi0gKiBDcmVhdGVzIHRoZSB3aWRnZXRzIHVzZWQgdG8gY29udHJvbCB0aGUgZHJhd2luZy4KLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLX0KLQotLyoqIAotICogRGlzcG9zZXMgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotfQotCi0vKiogCi0gKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgbmFtZS4KLSAqLwotcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0KCk7Ci0KLS8qKiAKLSAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBjYXRlZ29yeS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotLyoqIAotICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIGFuaW1hdGVkIG9yIG5vdC4gCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQW5pbWF0ZWQoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiogCi0gKiBBZHZhbmNlIHRoZSBhbmltYXRpb24uIAotICovCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewkKLX0KLQotLyoqIAotICogUGFpbnQgdGhlIHJlY2VpdmVyIGludG8gdGhlIHNwZWNpZmllZCBHQy4gCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW50cm9UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludHJvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTlhYjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW50cm9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIEludHJvVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCUZvbnQgZm9udDsKLQlJbWFnZSBpbWFnZTsKLQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCWZsb2F0IHgsIHk7Ci0gICAgZmxvYXQgaW5jWCA9IDEwLjBmOwotCWZsb2F0IGluY1kgPSA1LjBmOwotCWludCB0ZXh0V2lkdGgsIHRleHRIZWlnaHQ7Ci0JU3RyaW5nIHRleHQgPSAiU1dUIjsKLQkKLXB1YmxpYyBJbnRyb1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2UgPSBudWxsOwotCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBudWxsOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkludHJvZHVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0FuaW1hdGVkKCkgewotCXJldHVybiB0cnVlOwotfQotCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIHggKz0gaW5jWDsKLSAgICB5ICs9IGluY1k7Ci0JZmxvYXQgcmFuZG9tID0gKGZsb2F0KU1hdGgucmFuZG9tKCk7IAotICAgIGlmICh4ICsgdGV4dFdpZHRoID4gd2lkdGgpIHsKLSAgICAgICAgeCA9IHdpZHRoIC0gdGV4dFdpZHRoOwotICAgICAgICBpbmNYID0gcmFuZG9tICogLXdpZHRoIC8gMTYgLSAxOwotICAgIH0KLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgeCA9IDA7Ci0gICAgICAgIGluY1ggPSByYW5kb20gKiB3aWR0aCAvIDE2ICsgMTsKLSAgICB9Ci0gICAgaWYgKHkgKyB0ZXh0SGVpZ2h0ID4gaGVpZ2h0KSB7Ci0gICAgICAgIHkgPSAoaGVpZ2h0IC0gdGV4dEhlaWdodCktIDI7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiAtaGVpZ2h0IC8gMTYgLSAxOwotICAgIH0KLSAgICBpZiAoeSA8IDApIHsKLSAgICAgICAgeSA9IDA7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiBoZWlnaHQgLyAxNiArIDE7Ci0gICAgfQotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JaWYgKGltYWdlID09IG51bGwpIHsKLQkJaW1hZ2UgPSBleGFtcGxlLmxvYWRJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgImlybWFvcy5qcGciKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJRm9udERhdGEgZmQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCByZWN0LmhlaWdodCAvIDQsIFNXVC5CT0xEKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJdGV4dFdpZHRoID0gc2l6ZS54OwotCQl0ZXh0SGVpZ2h0ID0gc2l6ZS55OwotCX0KLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQlwYXRoLmFkZFN0cmluZyh0ZXh0LCB4LCB5LCBmb250KTsKLQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCWdjLnNldENsaXBwaW5nKChSZWN0YW5nbGUpbnVsbCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7fQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTkxNzllLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotcHVibGljIExpbmVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmUiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JZ2MuZHJhd0xpbmUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JZ2MuZHJhd0xpbmUod2lkdGgsIDAsIDAsIGhlaWdodCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TdGFyUG9seVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1MDgxYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TdGFyUG9seVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTdGFyUG9seVRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQlpbnRbXSByYWRpYWw7Ci0Jc3RhdGljIGZpbmFsIGludCBQT0lOVFMgID0gMTE7Ci0JCi0JQ29tYm8gZmlsbFJ1bGVDYjsKLQotcHVibGljIFN0YXJQb2x5VGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JcmFkaWFsID0gbmV3IGludFtQT0lOVFMgKiAyXTsKLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxSdWxlIikpOyAvLyROT04tTkxTLTEkCi0JZmlsbFJ1bGVDYiA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04pOwotCWZpbGxSdWxlQ2IuYWRkKCJGSUxMX0VWRU5fT0REIik7Ci0JZmlsbFJ1bGVDYi5hZGQoIkZJTExfV0lORElORyIpOwotCWZpbGxSdWxlQ2Iuc2VsZWN0KDApOwotCWZpbGxSdWxlQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhhbXBsZS5nZXRSZWRyYXdMaXN0ZW5lcigpKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQb2x5Z29ucyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTdGFyUG9seWdvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICBpbnQgY2VudGVyWCA9IHdpZHRoIC8gMjsKLSAgICBpbnQgY2VudGVyWSA9IGhlaWdodCAvIDI7Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT0lOVFM7ICsraSkgewotICAgICAgICBkb3VibGUgciA9IE1hdGguUEkqMiAqIHBvcy9QT0lOVFM7Ci0gICAgICAgIHJhZGlhbFtpKjJdID0gKGludCkoKDErTWF0aC5jb3MocikpKmNlbnRlclgpOwotICAgICAgICByYWRpYWxbaSoyKzFdID0gKGludCkoKDErTWF0aC5zaW4ocikpKmNlbnRlclkpOwotICAgICAgICBwb3MgPSAocG9zICsgUE9JTlRTLzIpICUgUE9JTlRTOwotICAgIH0KLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlnYy5zZXRGaWxsUnVsZShmaWxsUnVsZUNiLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gMCA/IFNXVC5GSUxMX1dJTkRJTkcgOiBTV1QuRklMTF9FVkVOX09ERCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgIGdjLmZpbGxQb2x5Z29uKHJhZGlhbCk7Ci0gICAgZ2MuZHJhd1BvbHlnb24ocmFkaWFsKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2RiLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2RiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGExM2Q4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9pcm1hb3MuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaXJtYW9zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1MmNkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9pcm1hb3MuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF1c2UuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF1c2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFlM2Y1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BsYXkuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjRlMjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjOThkYzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29kZSByZXF1aXJlZAotICogdG8gb3BlbiBhbiBTV1QgU2hlbGwgYW5kIHByb2Nlc3MgdGhlIGV2ZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgSGVsbG9Xb3JsZDEgKCkub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQkKLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyMGM4YzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyB0aGUgbWluaW11bSBhbW91bnQgCi0gKiBvZiBjb2RlIHJlcXVpcmVkIHRvIG9wZW4gYW4gU1dUIFNoZWxsIHdpdGggYSBMYWJlbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDIgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMiAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlsYWJlbC5zZXRCb3VuZHMgKHNoZWxsLmdldENsaWVudEFyZWEgKCkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjYxYWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKgotICogVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byByZXNpemUgdGhlIAotICogTGFiZWwgd2hlbiB0aGUgU2hlbGwgcmVzaXplcyB1c2luZyBhIExpc3RlbmVyIG1lY2hhbmlzbS4KLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGQzIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNIZWxsbyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaGVsbG93b3JsZCIpOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgSGVsbG9Xb3JsZDMgKCkub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldFRleHQgKHJlc0hlbGxvLmdldFN0cmluZygiSGVsbG9fd29ybGQiKSk7Ci0JbGFiZWwucGFjaygpOwotCXNoZWxsLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlsYWJlbC5zZXRCb3VuZHMgKHNoZWxsLmdldENsaWVudEFyZWEgKCkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDRmNDU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgCi0gKiBMYWJlbCB3aGVuIHRoZSBTaGVsbCByZXNpemVzIHVzaW5nIGEgTGF5b3V0LgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDQgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkNCAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldFRleHQgKHJlc0hlbGxvLmdldFN0cmluZygiSGVsbG9fd29ybGQiKSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM2MTE1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKgotICogVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byBkcmF3IGRpcmVjdGx5Ci0gKiBvbiBhbiBTV1QgQ29udHJvbC4KLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGQ1IHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNIZWxsbyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaGVsbG93b3JsZCIpOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkNSAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JZmluYWwgQ29sb3IgcmVkID0gbmV3IENvbG9yKGRpc3BsYXksIDB4RkYsIDAsIDApOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpewotCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCWdjLnNldEZvcmVncm91bmQocmVkKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpOwotCQkJZ2MuZHJhd1JlY3RhbmdsZShyZWN0LnggKyAxMCwgcmVjdC55ICsgMTAsIHJlY3Qud2lkdGggLSAyMCwgcmVjdC5oZWlnaHQgLSAyMCk7Ci0JCQlnYy5kcmF3U3RyaW5nKHJlc0hlbGxvLmdldFN0cmluZygiSGVsbG9fd29ybGQiKSwgcmVjdC54ICsgMjAsIHJlY3QueSArIDIwKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lciAobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkIChEaXNwb3NlRXZlbnQgZSkgewotCQkJcmVkLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2Y3YjNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9Ib3ZlckhlbHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhvdmVyaGVscDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotLyoqCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbXBsZW1lbnQgaG92ZXIgaGVscCBmZWVkYmFjawotICogdXNpbmcgdGhlIE1vdXNlVHJhY2tMaXN0ZW5lci4KLSAqLwotcHVibGljIGNsYXNzIEhvdmVySGVscCB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hvdmVyaGVscCIpOwotCQotCXN0YXRpYyBmaW5hbCBpbnQKLQkJaGhpSW5mb3JtYXRpb24gPSAwLAotCQloaGlXYXJuaW5nID0gMTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpbmZvcm1hdGlvbi5naWYiLAotCQkid2FybmluZy5naWYiCi0JfTsKLQlJbWFnZSBpbWFnZXNbXTsKLQotCS8qKgotCSAqIFJ1bnMgbWFpbiBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBIb3ZlckhlbHAoKS5vcGVuKGRpc3BsYXkpOwotCQkvLyBFdmVudCBsb29wCi0JCXdoaWxlIChzaGVsbCAhPSBudWxsICYmICEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJLy8gQ2xlYW51cAotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQotCX0KLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgbWFpbiBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewkJCi0JCS8vIExvYWQgdGhlIGltYWdlcwotCQlDbGFzcyBjbGF6eiA9IEhvdmVySGVscC5jbGFzczsKLQkJdHJ5IHsKLQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJaW1hZ2VzW2ldID0gbmV3IEltYWdlKGRpc3BsYXksIHNvdXJjZSwgbWFzayk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiLAotCQkJCW5ldyBPYmplY3RbXSB7IGV4LmdldE1lc3NhZ2UoKSB9KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgd2luZG93Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCWNyZWF0ZVBhcnRDb250cm9sKHNoZWxsKTsKLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCS8qIEZyZWUgcmVzb3VyY2VzICovCi0JCQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJaW1hZ2VzID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWZpbmFsIFRvb2xUaXBIYW5kbGVyIHRvb2x0aXAgPSBuZXcgVG9vbFRpcEhhbmRsZXIoZnJhbWUuZ2V0U2hlbGwoKSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZnJhbWUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKGZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaT0wOyBpPDU7IGkrKykgewotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJUb29sSXRlbS50ZXh0IiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX1RFWFQiLCBnZXRSZXNvdXJjZVN0cmluZygiVG9vbEl0ZW0udG9vbHRpcCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0hFTFBURVhUSEFORExFUiIsIG5ldyBUb29sVGlwSGVscFRleHRIYW5kbGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2xJdGVtLmhlbHAiLCBuZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdG9vbHRpcC5hY3RpdmF0ZUhvdmVySGVscChiYXIpOwotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChmcmFtZSwgU1dULkJPUkRFUik7Ci0JCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIkl0ZW0iLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSU1BR0UiLCBpbWFnZXNbaGhpSW5mb3JtYXRpb25dKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlSXRlbS50ZXh0IiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX1RFWFQiLCBnZXRSZXNvdXJjZVN0cmluZygiVGFibGVJdGVtLnRvb2x0aXAiLAotCQkJCW5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9IRUxQVEVYVEhBTkRMRVIiLCBuZXcgVG9vbFRpcEhlbHBUZXh0SGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEhlbHBUZXh0KFdpZGdldCB3aWRnZXQpIHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKCJUYWJsZUl0ZW0uaGVscCIsIG5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdG9vbHRpcC5hY3RpdmF0ZUhvdmVySGVscCh0YWJsZSk7Ci0JCi0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlIChmcmFtZSwgU1dULkJPUkRFUik7Ci0JCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIkl0ZW0iLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSU1BR0UiLCBpbWFnZXNbaGhpV2FybmluZ10pOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiVHJlZUl0ZW0udGV4dCIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9URVhUIiwgZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVJdGVtLnRvb2x0aXAiLAotCQkJCW5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9IRUxQVEVYVEhBTkRMRVIiLCBuZXcgVG9vbFRpcEhlbHBUZXh0SGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEhlbHBUZXh0KFdpZGdldCB3aWRnZXQpIHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKCJUcmVlSXRlbS5oZWxwIiwgbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAodHJlZSk7Ci0JCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChmcmFtZSwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIkhlbGxvLnRleHQiKSk7Ci0JCWJ1dHRvbi5zZXREYXRhICgiVElQX1RFWFQiLCBnZXRSZXNvdXJjZVN0cmluZygiSGVsbG8udG9vbHRpcCIpKTsKLQkJdG9vbHRpcC5hY3RpdmF0ZUhvdmVySGVscChidXR0b24pOwotCX0KLQotCS8qKgotCSAqIEVtdWxhdGVkIHRvb2x0aXAgaGFuZGxlcgotCSAqIE5vdGljZSB0aGF0IHdlIGNvdWxkIGRpc3BsYXkgYW55dGhpbmcgaW4gYSB0b29sdGlwIGJlc2lkZXMgdGV4dCBhbmQgaW1hZ2VzLgotCSAqIEZvciBpbnN0YW5jZSwgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBlbWJlZCBsYXJnZSB0YWJsZXMgb2YgZGF0YSBvciBidXR0b25zIGxpbmtpbmcKLQkgKiBkYXRhIHVuZGVyIGluc3BlY3Rpb24gdG8gbWF0ZXJpYWwgZWxzZXdoZXJlLCBvciBwZXJmb3JtIGR5bmFtaWMgbG9va3VwIGZvciBjcmVhdGluZwotCSAqIHRvb2x0aXAgdGV4dCBvbiB0aGUgZmx5LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVG9vbFRpcEhhbmRsZXIgewotCQlwcml2YXRlIFNoZWxsICBwYXJlbnRTaGVsbDsKLQkJcHJpdmF0ZSBTaGVsbCAgdGlwU2hlbGw7Ci0JCXByaXZhdGUgTGFiZWwgIHRpcExhYmVsSW1hZ2UsIHRpcExhYmVsVGV4dDsKLQkJcHJpdmF0ZSBXaWRnZXQgdGlwV2lkZ2V0OyAvLyB3aWRnZXQgdGhpcyB0b29sdGlwIGlzIGhvdmVyaW5nIG92ZXIKLQkJcHJpdmF0ZSBQb2ludCAgdGlwUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBiZWluZyBob3ZlcmVkIG92ZXIKLQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgdG9vbHRpcCBoYW5kbGVyCi0JCSAqCi0JCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBTaGVsbAotCQkgKi8JCi0JCXB1YmxpYyBUb29sVGlwSGFuZGxlcihTaGVsbCBwYXJlbnQpIHsKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCQl0aGlzLnBhcmVudFNoZWxsID0gcGFyZW50OwotCQotCQkJdGlwU2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuT05fVE9QIHwgU1dULlRPT0wpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKLQkJCXRpcFNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQkKLQkJCXRpcFNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkKLQkJCXRpcExhYmVsSW1hZ2UgPSBuZXcgTGFiZWwodGlwU2hlbGwsIFNXVC5OT05FKTsKLQkJCXRpcExhYmVsSW1hZ2Uuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCXRpcExhYmVsSW1hZ2Uuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCXRpcExhYmVsSW1hZ2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQkKLQkJCXRpcExhYmVsVGV4dCA9IG5ldyBMYWJlbCh0aXBTaGVsbCwgU1dULk5PTkUpOwotCQkJdGlwTGFiZWxUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCQl0aXBMYWJlbFRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCXRpcExhYmVsVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBFbmFibGVzIGN1c3RvbWl6ZWQgaG92ZXIgaGVscCBmb3IgYSBzcGVjaWZpZWQgY29udHJvbAotCQkgKiAKLQkJICogQGNvbnRyb2wgdGhlIGNvbnRyb2wgb24gd2hpY2ggdG8gZW5hYmxlIGhvdmVyaGVscAotCQkgKi8KLQkJcHVibGljIHZvaWQgYWN0aXZhdGVIb3ZlckhlbHAoZmluYWwgQ29udHJvbCBjb250cm9sKSB7Ci0JCQkvKgotCQkJICogR2V0IG91dCBvZiB0aGUgd2F5IGlmIHdlIGF0dGVtcHQgdG8gYWN0aXZhdGUgdGhlIGNvbnRyb2wgdW5kZXJuZWF0aCB0aGUgdG9vbHRpcAotCQkJICovCi0JCQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKHRpcFNoZWxsLmlzVmlzaWJsZSgpKSB0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9CQotCQkJfSk7Ci0JCi0JCQkvKgotCQkJICogVHJhcCBob3ZlciBldmVudHMgdG8gcG9wLXVwIHRvb2x0aXAKLQkJCSAqLwotCQkJY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tBZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JCQkJCWlmICh0aXBTaGVsbC5pc1Zpc2libGUoKSkgdGlwU2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCXRpcFdpZGdldCA9IG51bGw7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIgKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlXaWRnZXQgd2lkZ2V0ID0gZXZlbnQud2lkZ2V0OwotCQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVG9vbEJhcikgewotCQkJCQkJVG9vbEJhciB3ID0gKFRvb2xCYXIpIHdpZGdldDsKLQkJCQkJCXdpZGdldCA9IHcuZ2V0SXRlbSAocHQpOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZSkgewotCQkJCQkJVGFibGUgdyA9IChUYWJsZSkgd2lkZ2V0OwotCQkJCQkJd2lkZ2V0ID0gdy5nZXRJdGVtIChwdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWUpIHsKLQkJCQkJCVRyZWUgdyA9IChUcmVlKSB3aWRnZXQ7Ci0JCQkJCQl3aWRnZXQgPSB3LmdldEl0ZW0gKHB0KTsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0ID09IG51bGwpIHsKLQkJCQkJCXRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJdGlwV2lkZ2V0ID0gbnVsbDsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0ID09IHRpcFdpZGdldCkgcmV0dXJuOwotCQkJCQl0aXBXaWRnZXQgPSB3aWRnZXQ7Ci0JCQkJCXRpcFBvc2l0aW9uID0gY29udHJvbC50b0Rpc3BsYXkocHQpOwotCQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIHdpZGdldC5nZXREYXRhKCJUSVBfVEVYVCIpOwotCQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgd2lkZ2V0LmdldERhdGEoIlRJUF9JTUFHRSIpOwotCQkJCQl0aXBMYWJlbFRleHQuc2V0VGV4dCh0ZXh0ICE9IG51bGwgPyB0ZXh0IDogIiIpOwotCQkJCQl0aXBMYWJlbEltYWdlLnNldEltYWdlKGltYWdlKTsgLy8gYWNjZXB0cyBudWxsCi0JCQkJCXRpcFNoZWxsLnBhY2soKTsKLQkJCQkJc2V0SG92ZXJMb2NhdGlvbih0aXBTaGVsbCwgdGlwUG9zaXRpb24pOwotCQkJCQl0aXBTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCQotCQkJLyoKLQkJCSAqIFRyYXAgRjEgSGVscCB0byBwb3AgdXAgYSBjdXN0b20gaGVscCBib3gKLQkJCSAqLwotCQkJY29udHJvbC5hZGRIZWxwTGlzdGVuZXIobmV3IEhlbHBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKHRpcFdpZGdldCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCVRvb2xUaXBIZWxwVGV4dEhhbmRsZXIgaGFuZGxlciA9IChUb29sVGlwSGVscFRleHRIYW5kbGVyKQotCQkJCQkJdGlwV2lkZ2V0LmdldERhdGEoIlRJUF9IRUxQVEVYVEhBTkRMRVIiKTsKLQkJCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlTdHJpbmcgdGV4dCA9IGhhbmRsZXIuZ2V0SGVscFRleHQodGlwV2lkZ2V0KTsKLQkJCQkJaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQkKLQkJCQkJaWYgKHRpcFNoZWxsLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQl0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCVNoZWxsIGhlbHBTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnRTaGVsbCwgU1dULlNIRUxMX1RSSU0pOwotCQkJCQkJaGVscFNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGhlbHBTaGVsbCwgU1dULk5PTkUpOwotCQkJCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCWhlbHBTaGVsbC5wYWNrKCk7Ci0JCQkJCQlzZXRIb3ZlckxvY2F0aW9uKGhlbHBTaGVsbCwgdGlwUG9zaXRpb24pOwotCQkJCQkJaGVscFNoZWxsLm9wZW4oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2V0cyB0aGUgbG9jYXRpb24gZm9yIGEgaG92ZXJpbmcgc2hlbGwKLQkJICogQHBhcmFtIHNoZWxsIHRoZSBvYmplY3QgdGhhdCBpcyB0byBob3ZlcgotCQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIGEgd2lkZ2V0IHRvIGhvdmVyIG92ZXIKLQkJICogQHJldHVybiB0aGUgdG9wLWxlZnQgbG9jYXRpb24gZm9yIGEgaG92ZXJpbmcgYm94Ci0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0SG92ZXJMb2NhdGlvbihTaGVsbCBzaGVsbCwgUG9pbnQgcG9zaXRpb24pIHsKLQkJCVJlY3RhbmdsZSBkaXNwbGF5Qm91bmRzID0gc2hlbGwuZ2V0RGlzcGxheSgpLmdldEJvdW5kcygpOwotCQkJUmVjdGFuZ2xlIHNoZWxsQm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQlzaGVsbEJvdW5kcy54ID0gTWF0aC5tYXgoTWF0aC5taW4ocG9zaXRpb24ueCwgZGlzcGxheUJvdW5kcy53aWR0aCAtIHNoZWxsQm91bmRzLndpZHRoKSwgMCk7Ci0JCQlzaGVsbEJvdW5kcy55ID0gTWF0aC5tYXgoTWF0aC5taW4ocG9zaXRpb24ueSArIDE2LCBkaXNwbGF5Qm91bmRzLmhlaWdodCAtIHNoZWxsQm91bmRzLmhlaWdodCksIDApOwotCQkJc2hlbGwuc2V0Qm91bmRzKHNoZWxsQm91bmRzKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUb29sVGlwIGhlbHAgaGFuZGxlcgotCSAqLwotCXByb3RlY3RlZCBpbnRlcmZhY2UgVG9vbFRpcEhlbHBUZXh0SGFuZGxlciB7Ci0JCS8qKgotCQkgKiBHZXQgaGVscCB0ZXh0Ci0JCSAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldCB0aGF0IGlzIHVuZGVyIGhlbHAKLQkJICogQHJldHVybiBhIGhlbHAgdGV4dCBzdHJpbmcKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9pbmZvcm1hdGlvbi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvaW5mb3JtYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmM3NDc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9pbmZvcm1hdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvd2FybmluZy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNGZkZjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaW1hZ2VhbmFseXplci9JbWFnZUFuYWx5emVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDUxYjA4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VBbmFseXplciB7Ci0Jc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaW1hZ2VzIik7Ci0JRGlzcGxheSBkaXNwbGF5OwotCVNoZWxsIHNoZWxsOwotCUNhbnZhcyBpbWFnZUNhbnZhcywgcGFsZXR0ZUNhbnZhczsKLQlMYWJlbCB0eXBlTGFiZWwsIHNpemVMYWJlbCwgZGVwdGhMYWJlbCwgdHJhbnNwYXJlbnRQaXhlbExhYmVsLAotCQl0aW1lVG9Mb2FkTGFiZWwsIHNjcmVlblNpemVMYWJlbCwgYmFja2dyb3VuZFBpeGVsTGFiZWwsCi0JCWxvY2F0aW9uTGFiZWwsIGRpc3Bvc2FsTWV0aG9kTGFiZWwsIGRlbGF5VGltZUxhYmVsLAotCQlyZXBlYXRDb3VudExhYmVsLCBwYWxldHRlTGFiZWwsIGRhdGFMYWJlbCwgc3RhdHVzTGFiZWw7Ci0JQ29tYm8gYmFja2dyb3VuZENvbWJvLCBzY2FsZVhDb21ibywgc2NhbGVZQ29tYm8sIGFscGhhQ29tYm87Ci0JQnV0dG9uIGluY3JlbWVudGFsQ2hlY2ssIHRyYW5zcGFyZW50Q2hlY2ssIG1hc2tDaGVjaywgYmFja2dyb3VuZENoZWNrOwotCUJ1dHRvbiBwcmV2aW91c0J1dHRvbiwgbmV4dEJ1dHRvbiwgYW5pbWF0ZUJ1dHRvbjsKLQlTdHlsZWRUZXh0IGRhdGFUZXh0OwotCVNhc2ggc2FzaDsKLQlDb2xvciB3aGl0ZUNvbG9yLCBibGFja0NvbG9yLCByZWRDb2xvciwgZ3JlZW5Db2xvciwgYmx1ZUNvbG9yLCBjYW52YXNCYWNrZ3JvdW5kOwotCUZvbnQgZml4ZWRXaWR0aEZvbnQ7Ci0JQ3Vyc29yIGNyb3NzQ3Vyc29yOwotCUdDIGltYWdlQ2FudmFzR0M7Ci0JCi0JaW50IHBhbGV0dGVXaWR0aCA9IDE0MDsgLy8gcmVjYWxjdWxhdGVkIGFuZCB1c2VkIGFzIGEgd2lkdGggaGludAotCWludCBpeCA9IDAsIGl5ID0gMCwgcHkgPSAwOyAvLyB1c2VkIHRvIHNjcm9sbCB0aGUgaW1hZ2UgYW5kIHBhbGV0dGUKLQlmbG9hdCB4c2NhbGUgPSAxLCB5c2NhbGUgPSAxOyAvLyB1c2VkIHRvIHNjYWxlIHRoZSBpbWFnZQotCWludCBhbHBoYSA9IDI1NTsgLy8gdXNlZCB0byBtb2RpZnkgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBpbWFnZQotCWJvb2xlYW4gaW5jcmVtZW50YWwgPSBmYWxzZTsgLy8gdXNlZCB0byBpbmNyZW1lbnRhbGx5IGRpc3BsYXkgYW4gaW1hZ2UKLQlib29sZWFuIHRyYW5zcGFyZW50ID0gdHJ1ZTsgLy8gdXNlZCB0byBkaXNwbGF5IGFuIGltYWdlIHdpdGggdHJhbnNwYXJlbmN5Ci0JYm9vbGVhbiBzaG93TWFzayA9IGZhbHNlOyAvLyB1c2VkIHRvIGRpc3BsYXkgYW4gaWNvbiBtYXNrIG9yIHRyYW5zcGFyZW50IGltYWdlIG1hc2sKLQlib29sZWFuIHNob3dCYWNrZ3JvdW5kID0gZmFsc2U7IC8vIHVzZWQgdG8gZGlzcGxheSB0aGUgYmFja2dyb3VuZCBvZiBhbiBhbmltYXRlZCBpbWFnZQotCWJvb2xlYW4gYW5pbWF0ZSA9IGZhbHNlOyAvLyB1c2VkIHRvIGFuaW1hdGUgYSBtdWx0aS1pbWFnZSBmaWxlCi0JVGhyZWFkIGFuaW1hdGVUaHJlYWQ7IC8vIGRyYXdzIGFuaW1hdGVkIGltYWdlcwotCVRocmVhZCBpbmNyZW1lbnRhbFRocmVhZDsgLy8gZHJhd3MgaW5jcmVtZW50YWwgaW1hZ2VzCi0JU3RyaW5nIGxhc3RQYXRoOyAvLyB1c2VkIHRvIHNlZWQgdGhlIGZpbGUgZGlhbG9nCi0JU3RyaW5nIGN1cnJlbnROYW1lOyAvLyB0aGUgY3VycmVudCBpbWFnZSBmaWxlIG9yIFVSTCBuYW1lCi0JU3RyaW5nIGZpbGVOYW1lOyAvLyB0aGUgY3VycmVudCBpbWFnZSBmaWxlCi0JSW1hZ2VMb2FkZXIgbG9hZGVyOyAvLyB0aGUgbG9hZGVyIGZvciB0aGUgY3VycmVudCBpbWFnZSBmaWxlCi0JSW1hZ2VEYXRhW10gaW1hZ2VEYXRhQXJyYXk7IC8vIGFsbCBpbWFnZSBkYXRhIHJlYWQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0JaW50IGltYWdlRGF0YUluZGV4OyAvLyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YQotCUltYWdlRGF0YSBpbWFnZURhdGE7IC8vIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlIGRhdGEKLQlJbWFnZSBpbWFnZTsgLy8gdGhlIGN1cnJlbnRseS1kaXNwbGF5ZWQgaW1hZ2UKLQlWZWN0b3IgaW5jcmVtZW50YWxFdmVudHM7IC8vIGluY3JlbWVudGFsIGltYWdlIGV2ZW50cwotCWxvbmcgbG9hZFRpbWUgPSAwOyAvLyB0aGUgdGltZSBpdCB0b29rIHRvIGxvYWQgdGhlIGN1cnJlbnQgaW1hZ2UKLQkKLQlzdGF0aWMgZmluYWwgaW50IElOREVYX0RJR0lUUyA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9DSEFSUyA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9DT05TVEFOVCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9YID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX1kgPSAyOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUEVOX0ZJTFRFUl9FWFRFTlNJT05TID0gbmV3IFN0cmluZ1tdIHsKLQkJCSIqLmJtcDsgKi5naWY7ICouaWNvOyAqLmpmaWY7ICouanBlZzsgKi5qcGc7ICoucG5nOyAqLnRpZjsgKi50aWZmIiwKLQkJCSIqLmJtcCIsICIqLmdpZiIsICIqLmljbyIsICIqLmpwZzsgKi5qcGVnOyAqLmpmaWYiLCAiKi5wbmciLCAiKi50aWY7ICoudGlmZiIgfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFTl9GSUxURVJfTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJYnVuZGxlLmdldFN0cmluZygiQWxsX2ltYWdlcyIpICsgIiAoYm1wLCBnaWYsIGljbywgamZpZiwganBlZywganBnLCBwbmcsIHRpZiwgdGlmZikiLAotCQkJIkJNUCAoKi5ibXApIiwgIkdJRiAoKi5naWYpIiwgIklDTyAoKi5pY28pIiwgIkpQRUcgKCouanBnLCAqLmpwZWcsICouamZpZikiLAotCQkJIlBORyAoKi5wbmcpIiwgIlRJRkYgKCoudGlmLCAqLnRpZmYpIiB9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTQVZFX0ZJTFRFUl9FWFRFTlNJT05TID0gbmV3IFN0cmluZ1tdIHsKLQkJCSIqLmJtcCIsICIqLmdpZiIsICIqLmljbyIsICIqLmpwZyIsICIqLnBuZyIsICIqLnRpZiIgfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gU0FWRV9GSUxURVJfTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJIkJNUCAoKi5ibXApIiwgIkdJRiAoKi5naWYpIiwgIklDTyAoKi5pY28pIiwgIkpQRUcgKCouanBnKSIsCi0JCQkiUE5HICgqLnBuZykiLCAiVElGRiAoKi50aWYpIiB9OwotCi0JY2xhc3MgVGV4dFByb21wdGVyIGV4dGVuZHMgRGlhbG9nIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVNoZWxsIGRpYWxvZzsKLQkJVGV4dCB0ZXh0OwotCQlwdWJsaWMgVGV4dFByb21wdGVyIChTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCQl9Ci0JCXB1YmxpYyBUZXh0UHJvbXB0ZXIgKFNoZWxsIHBhcmVudCkgewotCQkJdGhpcyAocGFyZW50LCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlIChTdHJpbmcgc3RyaW5nKSB7Ci0JCQltZXNzYWdlID0gc3RyaW5nOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgb3BlbiAoKSB7Ci0JCQlkaWFsb2cgPSBuZXcgU2hlbGwoZ2V0UGFyZW50KCksIGdldFN0eWxlKCkpOwotCQkJZGlhbG9nLnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXRleHQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZywgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBncmlkID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWQubnVtQ29sdW1ucyA9IDI7Ci0JCQlidXR0b25zLnNldExheW91dChncmlkKTsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPSyIpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCQlvay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlyZXN1bHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCWNhbmNlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkNhbmNlbCIpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCQljYW5jZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCQlkaWFsb2cucGFjaygpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCUltYWdlQW5hbHl6ZXIgaW1hZ2VBbmFseXplciA9IG5ldyBJbWFnZUFuYWx5emVyKCk7Ci0JCVNoZWxsIHNoZWxsID0gaW1hZ2VBbmFseXplci5vcGVuKGRpc3BsYXkpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkcHkpIHsKLQkJLy8gQ3JlYXRlIGEgd2luZG93IGFuZCBzZXQgaXRzIHRpdGxlLgotCQl0aGlzLmRpc3BsYXkgPSBkcHk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkltYWdlX2FuYWx5emVyIikpOwotCQkKLQkJLy8gSG9vayByZXNpemUgYW5kIGRpc3Bvc2UgbGlzdGVuZXJzLgotCQlzaGVsbC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzaXplU2hlbGwoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJCQlpZiAoYW5pbWF0ZVRocmVhZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGJlZm9yZSBkaXNwb3NpbmcgdGhlIHNoZWxsLgotCQkJCQl3aGlsZSAoYW5pbWF0ZVRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJLy8gQ2xlYW4gdXAuCi0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl3aGl0ZUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlibGFja0NvbG9yLmRpc3Bvc2UoKTsKLQkJCQlyZWRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJZ3JlZW5Db2xvci5kaXNwb3NlKCk7Ci0JCQkJYmx1ZUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlmaXhlZFdpZHRoRm9udC5kaXNwb3NlKCk7Ci0JCQkJY3Jvc3NDdXJzb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBDcmVhdGUgY29sb3JzIGFuZCBmb250cy4KLQkJd2hpdGVDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQkJYmxhY2tDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQkJcmVkQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJZ3JlZW5Db2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAyNTUsIDApOwotCQlibHVlQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMjU1KTsKLQkJZml4ZWRXaWR0aEZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiY291cmllciIsIDEwLCAwKTsKLQkJY3Jvc3NDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCQkKLQkJLy8gQWRkIGEgbWVudSBiYXIgYW5kIHdpZGdldHMuCi0JCWNyZWF0ZU1lbnVCYXIoKTsKLQkJY3JlYXRlV2lkZ2V0cygpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCQotCQkvLyBDcmVhdGUgYSBHQyBmb3IgZHJhd2luZywgYW5kIGhvb2sgdGhlIGxpc3RlbmVyIHRvIGRpc3Bvc2UgaXQuCi0JCWltYWdlQ2FudmFzR0MgPSBuZXcgR0MoaW1hZ2VDYW52YXMpOwotCQlpbWFnZUNhbnZhcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaW1hZ2VDYW52YXNHQy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gT3BlbiB0aGUgd2luZG93Ci0JCXNoZWxsLm9wZW4oKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXZvaWQgY3JlYXRlV2lkZ2V0cygpIHsKLQkJLy8gQWRkIHRoZSB3aWRnZXRzIHRvIHRoZSBzaGVsbCBpbiBhIGdyaWQgbGF5b3V0LgotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIFNlcGFyYXRlIHRoZSBtZW51IGJhciBmcm9tIHRoZSByZXN0IG9mIHRoZSB3aWRnZXRzLgotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIEFkZCBhIGNvbXBvc2l0ZSB0byBjb250YWluIHNvbWUgY29udHJvbCB3aWRnZXRzIGFjcm9zcyB0aGUgdG9wLgotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCXJvd0xheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJcm93TGF5b3V0LnNwYWNpbmcgPSA4OwotCQljb250cm9scy5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb250cm9scy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgYmFja2dyb3VuZC4KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZCIpKTsKLQkJYmFja2dyb3VuZENvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWJhY2tncm91bmRDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10gewotCQkJYnVuZGxlLmdldFN0cmluZygiTm9uZSIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiV2hpdGUiKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIkJsYWNrIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJSZWQiKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIkdyZWVuIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJCbHVlIil9KTsKLQkJYmFja2dyb3VuZENvbWJvLnNlbGVjdChiYWNrZ3JvdW5kQ29tYm8uaW5kZXhPZihidW5kbGUuZ2V0U3RyaW5nKCJXaGl0ZSIpKSk7Ci0JCWJhY2tncm91bmRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY2hhbmdlQmFja2dyb3VuZCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgeCBzY2FsZS4KLQkJU3RyaW5nW10gdmFsdWVzID0gewotCQkJIjAuMSIsICIwLjIiLCAiMC4zIiwgIjAuNCIsICIwLjUiLCAiMC42IiwgIjAuNyIsICIwLjgiLCAiMC45IiwgIjEiLAotCQkJIjEuMSIsICIxLjIiLCAiMS4zIiwgIjEuNCIsICIxLjUiLCAiMS42IiwgIjEuNyIsICIxLjgiLCAiMS45IiwgIjIiLAotCQkJIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLH07Ci0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlhfc2NhbGUiKSk7Ci0JCXNjYWxlWENvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNjYWxlWENvbWJvLmFkZCh2YWx1ZXNbaV0pOwotCQl9Ci0JCXNjYWxlWENvbWJvLnNlbGVjdChzY2FsZVhDb21iby5pbmRleE9mKCIxIikpOwotCQlzY2FsZVhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2NhbGVYKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQ29tYm8gdG8gY2hhbmdlIHRoZSB5IHNjYWxlLgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJZX3NjYWxlIikpOwotCQlzY2FsZVlDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzY2FsZVlDb21iby5hZGQodmFsdWVzW2ldKTsKLQkJfQotCQlzY2FsZVlDb21iby5zZWxlY3Qoc2NhbGVZQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJc2NhbGVZQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjYWxlWSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgYWxwaGEgdmFsdWUuCi0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFscGhhX0siKSk7Ci0JCWFscGhhQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gMjU1OyBpICs9IDUpIHsKLQkJCWFscGhhQ29tYm8uYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJfQotCQlhbHBoYUNvbWJvLnNlbGVjdChhbHBoYUNvbWJvLmluZGV4T2YoIjI1NSIpKTsKLQkJYWxwaGFDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYWxwaGEoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCBpbmNyZW1lbnRhbCBkaXNwbGF5LgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEaXNwbGF5IikpOwotCQlpbmNyZW1lbnRhbENoZWNrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJaW5jcmVtZW50YWxDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkluY3JlbWVudGFsIikpOwotCQlpbmNyZW1lbnRhbENoZWNrLnNldFNlbGVjdGlvbihpbmNyZW1lbnRhbCk7Ci0JCWluY3JlbWVudGFsQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWluY3JlbWVudGFsID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgdHJhbnNwYXJlbnQgZGlzcGxheS4KLQkJdHJhbnNwYXJlbnRDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXRyYW5zcGFyZW50Q2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJUcmFuc3BhcmVudCIpKTsKLQkJdHJhbnNwYXJlbnRDaGVjay5zZXRTZWxlY3Rpb24odHJhbnNwYXJlbnQpOwotCQl0cmFuc3BhcmVudENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmFuc3BhcmVudCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCBtYXNrIGRpc3BsYXkuCi0JCW1hc2tDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1hc2tDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk1hc2siKSk7Ci0JCW1hc2tDaGVjay5zZXRTZWxlY3Rpb24oc2hvd01hc2spOwotCQltYXNrQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNob3dNYXNrID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENoZWNrIGJveCB0byByZXF1ZXN0IGJhY2tncm91bmQgZGlzcGxheS4KLQkJYmFja2dyb3VuZENoZWNrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZENoZWNrLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZCIpKTsKLQkJYmFja2dyb3VuZENoZWNrLnNldFNlbGVjdGlvbihzaG93QmFja2dyb3VuZCk7Ci0JCWJhY2tncm91bmRDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2hvd0JhY2tncm91bmQgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQkvLyBHcm91cCB0aGUgYW5pbWF0aW9uIGJ1dHRvbnMuCi0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbiIpKTsKLQotCQkvLyBQdXNoIGJ1dHRvbiB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JCXByZXZpb3VzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlwcmV2aW91c0J1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlByZXZpb3VzIikpOwotCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcHJldmlvdXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXByZXZpb3VzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFB1c2ggYnV0dG9uIHRvIGRpc3BsYXkgdGhlIG5leHQgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCQluZXh0QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQluZXh0QnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiTmV4dCIpKTsKLQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJbmV4dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV4dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBQdXNoIGJ1dHRvbiB0byB0b2dnbGUgYW5pbWF0aW9uIG9mIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkJYW5pbWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJYW5pbWF0ZUJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGUiKSk7Ci0JCWFuaW1hdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFuaW1hdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFuaW1hdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZmlsZSB0eXBlLgotCQl0eXBlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJdHlwZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVHlwZV9pbml0aWFsIikpOwotCQl0eXBlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gQ2FudmFzIHRvIHNob3cgdGhlIGltYWdlLgotCQlpbWFnZUNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKHdoaXRlQ29sb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxNTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJaW1hZ2VDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWltYWdlQ2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQkJZXZlbnQuZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhaW50SW1hZ2UoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWltYWdlQ2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJc2hvd0NvbG9yQXQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBTZXQgdXAgdGhlIGltYWdlIGNhbnZhcyBzY3JvbGwgYmFycy4KLQkJU2Nyb2xsQmFyIGhvcml6b250YWwgPSBpbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWhvcml6b250YWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJaG9yaXpvbnRhbC5zZXRNaW5pbXVtKDApOwotCQlob3Jpem9udGFsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxIb3Jpem9udGFsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gaW1hZ2VDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJdmVydGljYWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmVydGljYWwuc2V0TWluaW11bSgwKTsKLQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXZlcnRpY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxWZXJ0aWNhbGx5KChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2Ugc2l6ZS4KLQkJc2l6ZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXNpemVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNpemVfaW5pdGlhbCIpKTsKLQkJc2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGRlcHRoLgotCQlkZXB0aExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRlcHRoTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEZXB0aF9pbml0aWFsIikpOwotCQlkZXB0aExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIHRyYW5zcGFyZW50IHBpeGVsLgotCQl0cmFuc3BhcmVudFBpeGVsTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVHJhbnNwYXJlbnRfcGl4ZWxfaW5pdGlhbCIpKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIHRpbWUgdG8gbG9hZC4KLQkJdGltZVRvTG9hZExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRpbWVUb0xvYWRMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlRpbWVfdG9fbG9hZF9pbml0aWFsIikpOwotCQl0aW1lVG9Mb2FkTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gU2VwYXJhdGUgdGhlIGFuaW1hdGlvbiBmaWVsZHMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgZmllbGRzLgotCQlzZXBhcmF0b3IgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBsb2dpY2FsIHNjcmVlbiBzaXplIGZvciBhbmltYXRpb24uCi0JCXNjcmVlblNpemVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzY3JlZW5TaXplTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb25fc2l6ZV9pbml0aWFsIikpOwotCQlzY3JlZW5TaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgYmFja2dyb3VuZCBwaXhlbC4KLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJCYWNrZ3JvdW5kX3BpeGVsX2luaXRpYWwiKSk7Ci0JCWJhY2tncm91bmRQaXhlbExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGxvY2F0aW9uICh4LCB5KS4KLQkJbG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiSW1hZ2VfbG9jYXRpb25faW5pdGlhbCIpKTsKLQkJbG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBkaXNwb3NhbCBtZXRob2QuCi0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGlzcG9zYWxNZXRob2RMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkRpc3Bvc2FsX2luaXRpYWwiKSk7Ci0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZGVsYXkgdGltZS4KLQkJZGVsYXlUaW1lTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGVsYXlUaW1lTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV9pbml0aWFsIikpOwotCQlkZWxheVRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBiYWNrZ3JvdW5kIHBpeGVsLgotCQlyZXBlYXRDb3VudExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXJlcGVhdENvdW50TGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX2luaXRpYWwiKSk7Ci0JCXJlcGVhdENvdW50TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gU2VwYXJhdGUgdGhlIGFuaW1hdGlvbiBmaWVsZHMgZnJvbSB0aGUgcGFsZXR0ZS4KLQkJc2VwYXJhdG9yID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyBpZiB0aGUgaW1hZ2UgaGFzIGEgZGlyZWN0IG9yIGluZGV4ZWQgcGFsZXR0ZS4KLQkJcGFsZXR0ZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhbGV0dGVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlBhbGV0dGVfaW5pdGlhbCIpKTsKLQkJcGFsZXR0ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIENhbnZhcyB0byBzaG93IHRoZSBpbWFnZSdzIHBhbGV0dGUuCi0JCXBhbGV0dGVDYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULk5PX1JFRFJBV19SRVNJWkUpOwotCQlwYWxldHRlQ2FudmFzLnNldEZvbnQoZml4ZWRXaWR0aEZvbnQpOwotCQlwYWxldHRlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJR0MgZ2MgPSBuZXcgR0MocGFsZXR0ZUxhYmVsKTsKLQkJcGFsZXR0ZVdpZHRoID0gZ2Muc3RyaW5nRXh0ZW50KGJ1bmRsZS5nZXRTdHJpbmcoIk1heF9sZW5ndGhfc3RyaW5nIikpLng7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gcGFsZXR0ZVdpZHRoOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTYgKiAxMTsgLy8gc2hvdyBhdCBsZWFzdCAxNiBjb2xvcnMKLQkJcGFsZXR0ZUNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcGFpbnRQYWxldHRlKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gU2V0IHVwIHRoZSBwYWxldHRlIGNhbnZhcyBzY3JvbGwgYmFyLgotCQl2ZXJ0aWNhbCA9IHBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJdmVydGljYWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmVydGljYWwuc2V0TWluaW11bSgwKTsKLQkJdmVydGljYWwuc2V0SW5jcmVtZW50KDEwKTsKLQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXZlcnRpY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxQYWxldHRlKChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gU2FzaCB0byBzZWUgbW9yZSBvZiBpbWFnZSBvciBpbWFnZSBkYXRhLgotCQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJc2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQkoKEdyaWREYXRhKXBhbGV0dGVDYW52YXMuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCQkJCVJlY3RhbmdsZSBwYWxldHRlQ2FudmFzQm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQkJaW50IG1pblkgPSBwYWxldHRlQ2FudmFzQm91bmRzLnkgKyAyMDsKLQkJCQkJUmVjdGFuZ2xlIGRhdGFMYWJlbEJvdW5kcyA9IGRhdGFMYWJlbC5nZXRCb3VuZHMoKTsKLQkJCQkJaW50IG1heFkgPSBzdGF0dXNMYWJlbC5nZXRCb3VuZHMoKS55IC0gZGF0YUxhYmVsQm91bmRzLmhlaWdodCAtIDIwOwotCQkJCQlpZiAoZXZlbnQueSA+IG1pblkgJiYgZXZlbnQueSA8IG1heFkpIHsKLQkJCQkJCVJlY3RhbmdsZSBvbGRTYXNoID0gc2FzaC5nZXRCb3VuZHMoKTsKLQkJCQkJCXNhc2guc2V0Qm91bmRzKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQkJaW50IGRpZmYgPSBldmVudC55IC0gb2xkU2FzaC55OwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlQ2FudmFzLmdldEJvdW5kcygpOwotCQkJCQkJaW1hZ2VDYW52YXMuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0ICsgZGlmZik7Ci0JCQkJCQlib3VuZHMgPSBwYWxldHRlQ2FudmFzQm91bmRzOwotCQkJCQkJcGFsZXR0ZUNhbnZhcy5zZXRCb3VuZHMoYm91bmRzLngsIGJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQgKyBkaWZmKTsKLQkJCQkJCWJvdW5kcyA9IGRhdGFMYWJlbEJvdW5kczsKLQkJCQkJCWRhdGFMYWJlbC5zZXRCb3VuZHMoYm91bmRzLngsIGJvdW5kcy55ICsgZGlmZiwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQkJCWJvdW5kcyA9IGRhdGFUZXh0LmdldEJvdW5kcygpOwotCQkJCQkJZGF0YVRleHQuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSArIGRpZmYsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCAtIGRpZmYpOwotCQkJCQkJLy9zaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExhYmVsIHRvIHNob3cgZGF0YS1zcGVjaWZpYyBmaWVsZHMuCi0JCWRhdGFMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQaXhlbF9kYXRhX2luaXRpYWwiKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGFMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIFRleHQgdG8gc2hvdyBhIGR1bXAgb2YgdGhlIGRhdGEuCi0JCWRhdGFUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJZGF0YVRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotCQlkYXRhVGV4dC5zZXRGb250KGZpeGVkV2lkdGhGb250KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTI4OwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWRhdGFUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlkYXRhVGV4dC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsICYmIGV2ZW50LmJ1dHRvbiA9PSAxKSB7Ci0JCQkJCXNob3dDb2xvckZvckRhdGEoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlkYXRhVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlzaG93Q29sb3JGb3JEYXRhKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCS8vIExhYmVsIHRvIHNob3cgc3RhdHVzIGFuZCBjdXJzb3IgbG9jYXRpb24gaW4gaW1hZ2UuCi0JCXN0YXR1c0xhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JTWVudSBjcmVhdGVNZW51QmFyKCkgewotCQkvLyBNZW51IGJhci4KLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQljcmVhdGVGaWxlTWVudShtZW51QmFyKTsKLQkJY3JlYXRlQWxwaGFNZW51KG1lbnVCYXIpOwotCQlyZXR1cm4gbWVudUJhcjsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVGaWxlTWVudShNZW51IG1lbnVCYXIpIHsKLQkJLy8gRmlsZSBtZW51Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRmlsZSIpKTsKLQkJTWVudSBmaWxlTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRNZW51KGZpbGVNZW51KTsKLQotCQkvLyBGaWxlIC0+IE9wZW4gRmlsZS4uLgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPcGVuRmlsZSIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdPJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuRmlsZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gT3BlbiBVUkwuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT3BlblVSTCIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdVJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuVVJMKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gRmlsZSAtPiBSZW9wZW4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUmVvcGVuIikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UmVvcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEZpbGUgLT4gU2F2ZQotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlIikpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1MnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVNhdmUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IFNhdmUgQXMuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hcyIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVNhdmVBcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gU2F2ZSBNYXNrIEFzLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfbWFza19hcyIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVNhdmVNYXNrQXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkKLQkJLy8gRmlsZSAtPiBQcmludAotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQcmludCIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdQJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVQcmludCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0KLQkJLy8gRmlsZSAtPiBFeGl0Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkV4aXQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCX0KLQotCXZvaWQgY3JlYXRlQWxwaGFNZW51KE1lbnUgbWVudUJhcikgewotCQkvLyBBbHBoYSBtZW51Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQWxwaGEiKSk7Ci0JCU1lbnUgYWxwaGFNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldE1lbnUoYWxwaGFNZW51KTsKLQotCQkvLyBBbHBoYSAtPiBLCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oYWxwaGFNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiSyIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Q29tcG9zZUFscGhhKEFMUEhBX0NPTlNUQU5UKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWxwaGEgLT4gKEsgKyB4KSAlIDI1NgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGFscGhhTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIihLICsgeCkgJSAyNTYiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUNvbXBvc2VBbHBoYShBTFBIQV9YKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWxwaGEgLT4gKEsgKyB5KSAlIDI1NgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGFscGhhTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIihLICsgeSkgJSAyNTYiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUNvbXBvc2VBbHBoYShBTFBIQV9ZKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jdm9pZCBtZW51Q29tcG9zZUFscGhhKGludCBhbHBoYV9vcCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQlpZiAoYWxwaGFfb3AgPT0gQUxQSEFfQ09OU1RBTlQpIHsKLQkJCQlpbWFnZURhdGEuYWxwaGEgPSBhbHBoYTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2VEYXRhLmFscGhhID0gLTE7Ci0JCQkJc3dpdGNoIChhbHBoYV9vcCkgewotCQkJCQljYXNlIEFMUEhBX1g6IAotCQkJCQkJZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCQkJCWZvciAoaW50IHggPSAwOyB4IDwgaW1hZ2VEYXRhLndpZHRoOyB4KyspIHsKLQkJCQkJCQlpbWFnZURhdGEuc2V0QWxwaGEoeCwgeSwgKHggKyBhbHBoYSkgJSAyNTYpOwotCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfWTogCi0JCQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IGltYWdlRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJCQkJZm9yIChpbnQgeCA9IDA7IHggPCBpbWFnZURhdGEud2lkdGg7IHgrKykgewotCQkJCQkJCWltYWdlRGF0YS5zZXRBbHBoYSh4LCB5LCAoeSArIGFscGhhKSAlIDI1Nik7Ci0JCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDogYnJlYWs7Ci0JCQkJfQkJCQkJCi0JCQl9CQkJCi0JCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudU9wZW5GaWxlKCkgewotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGFuIGltYWdlIGZpbGUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlpZiAobGFzdFBhdGggIT0gbnVsbCkKLQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKE9QRU5fRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhPUEVOX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJaWYgKGluY3JlbWVudGFsKSB7Ci0JCQkJLy8gUHJlcGFyZSB0byBoYW5kbGUgaW5jcmVtZW50YWwgZXZlbnRzLgotCQkJCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKG5ldyBJbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBpbWFnZURhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBldmVudCkgewotCQkJCQkJaW5jcmVtZW50YWxEYXRhTG9hZGVkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWluY3JlbWVudGFsVGhyZWFkU3RhcnQoKTsKLQkJCX0KLQkJCS8vIFJlYWQgdGhlIG5ldyBpbWFnZShzKSBmcm9tIHRoZSBjaG9zZW4gZmlsZS4KLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlpbWFnZURhdGFBcnJheSA9IGxvYWRlci5sb2FkKGZpbGVuYW1lKTsKLQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCS8vIENhY2hlIHRoZSBmaWxlbmFtZS4KLQkJCQljdXJyZW50TmFtZSA9IGZpbGVuYW1lOwotCQkJCWZpbGVOYW1lID0gZmlsZW5hbWU7Ci0JCQkJCi0JCQkJLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGltYWdlcyBpbiB0aGUgZmlsZSAodHlwaWNhbGx5IEdJRikKLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgUHJldmlvdXMsIE5leHQgYW5kIEFuaW1hdGUgYnV0dG9ucy4KLQkJCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQlhbmltYXRlQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSAmJiBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoID4gMCAmJiBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCA+IDApOwotCQotCQkJCS8vIERpc3BsYXkgdGhlIGZpcnN0IGltYWdlIGluIHRoZSBmaWxlLgotCQkJCWltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJCQlyZXNldFNjcm9sbEJhcnMoKTsKLQkJCX0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXZvaWQgbWVudU9wZW5VUkwoKSB7Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCXJlc2V0U2NhbGVDb21ib3MoKTsKLQkJCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYW4gaW1hZ2UgVVJMLgotCQlUZXh0UHJvbXB0ZXIgdGV4dFByb21wdGVyID0gbmV3IFRleHRQcm9tcHRlcihzaGVsbCwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULkRJQUxPR19UUklNKTsKLQkJdGV4dFByb21wdGVyLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT3BlblVSTERpYWxvZyIpKTsKLQkJdGV4dFByb21wdGVyLnNldE1lc3NhZ2UoYnVuZGxlLmdldFN0cmluZygiRW50ZXJVUkwiKSk7Ci0JCVN0cmluZyB1cmxuYW1lID0gdGV4dFByb21wdGVyLm9wZW4oKTsKLQkJaWYgKHVybG5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybG5hbWUpOwotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJaWYgKGluY3JlbWVudGFsKSB7Ci0JCQkJLy8gUHJlcGFyZSB0byBoYW5kbGUgaW5jcmVtZW50YWwgZXZlbnRzLgotCQkJCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKG5ldyBJbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBpbWFnZURhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBldmVudCkgewotCQkJCQkJaW5jcmVtZW50YWxEYXRhTG9hZGVkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWluY3JlbWVudGFsVGhyZWFkU3RhcnQoKTsKLQkJCX0KLQkJCS8vIFJlYWQgdGhlIG5ldyBpbWFnZShzKSBmcm9tIHRoZSBjaG9zZW4gVVJMLgotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJbG9hZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJY3VycmVudE5hbWUgPSB1cmxuYW1lOwotCQkJCWZpbGVOYW1lID0gbnVsbDsKLQkJCQkKLQkJCQkvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaW1hZ2VzICh0eXBpY2FsbHkgR0lGKQotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBQcmV2aW91cywgTmV4dCBhbmQgQW5pbWF0ZSBidXR0b25zLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSk7Ci0JCQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCWFuaW1hdGVCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxICYmIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGggPiAwICYmIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0ID4gMCk7Ci0JCi0JCQkJLy8gRGlzcGxheSB0aGUgZmlyc3QgaW1hZ2UuCi0JCQkJaW1hZ2VEYXRhSW5kZXggPSAwOwotCQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQkJCXJlc2V0U2Nyb2xsQmFycygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgdXJsbmFtZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENhbGxlZCB0byBzdGFydCBhIHRocmVhZCB0aGF0IGRyYXdzIGluY3JlbWVudGFsIGltYWdlcwotCSAqIGFzIHRoZXkgYXJlIGxvYWRlZC4KLQkgKi8KLQl2b2lkIGluY3JlbWVudGFsVGhyZWFkU3RhcnQoKSB7Ci0JCWluY3JlbWVudGFsRXZlbnRzID0gbmV3IFZlY3RvcigpOwotCQlpbmNyZW1lbnRhbFRocmVhZCA9IG5ldyBUaHJlYWQoIkluY3JlbWVudGFsIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIERyYXcgdGhlIGZpcnN0IEltYWdlRGF0YSBpbmNyZW1lbnQuCi0JCQkJd2hpbGUgKGluY3JlbWVudGFsRXZlbnRzICE9IG51bGwpIHsKLQkJCQkJLy8gU3luY2hyb25pemUgc28gd2UgZG9uJ3QgdHJ5IHRvIHJlbW92ZSB3aGVuIHRoZSB2ZWN0b3IgaXMgbnVsbC4KLQkJCQkJc3luY2hyb25pemVkIChJbWFnZUFuYWx5emVyLnRoaXMpIHsKLQkJCQkJCWlmIChpbmNyZW1lbnRhbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGluY3JlbWVudGFsRXZlbnRzLnNpemUoKSA+IDApIHsKLQkJCQkJCQkJSW1hZ2VMb2FkZXJFdmVudCBldmVudCA9IChJbWFnZUxvYWRlckV2ZW50KSBpbmNyZW1lbnRhbEV2ZW50cy5yZW1vdmUoMCk7Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGV2ZW50LmltYWdlRGF0YSk7Ci0JCQkJCQkJCWltYWdlRGF0YSA9IGV2ZW50LmltYWdlRGF0YTsKLQkJCQkJCQkJaW1hZ2VDYW52YXNHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl5aWVsZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCX0KLQkJfTsKLQkJaW5jcmVtZW50YWxUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQlpbmNyZW1lbnRhbFRocmVhZC5zdGFydCgpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIGluY3JlbWVudGFsIGltYWdlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLAotCSAqIGZvciBleGFtcGxlLCBmb3IgaW50ZXJsYWNlZCBHSUYvUE5HIG9yIHByb2dyZXNzaXZlIEpQRUcuCi0JICovCi0Jdm9pZCBpbmNyZW1lbnRhbERhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBldmVudCkgewotCQkvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IHdlIGRvIG5vdCB0cnkgdG8gYWRkIHdoaWxlCi0JCS8vIHRoZSBpbmNyZW1lbnRhbCBkcmF3aW5nIHRocmVhZCBpcyByZW1vdmluZy4KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpbmNyZW1lbnRhbEV2ZW50cy5hZGRFbGVtZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQl2b2lkIG1lbnVTYXZlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCi0JCS8vIElmIHRoZSBpbWFnZSBmaWxlIHR5cGUgaXMgdW5rbm93biwgd2UgY2FuJ3QgJ1NhdmUnLAotCQkvLyBzbyB3ZSBoYXZlIHRvIHVzZSAnU2F2ZSBBcy4uLicuCi0JCWlmIChpbWFnZURhdGEudHlwZSA9PSBTV1QuSU1BR0VfVU5ERUZJTkVEIHx8IGZpbGVOYW1lID09IG51bGwpIHsKLQkJCW1lbnVTYXZlQXMoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgaW1hZ2UgdG8gdGhlIGN1cnJlbnQgZmlsZS4KLQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZURhdGF9OwotCQkJbG9hZGVyLnNhdmUoZmlsZU5hbWUsIGltYWdlRGF0YS50eXBlKTsKLQkJCQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlTmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZU5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51U2F2ZUFzKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlIG5hbWUgYW5kIHR5cGUgdG8gc2F2ZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU0FWRSk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSBmaWxlTmFtZTsKLQkJCWludCBuYW1lU3RhcnQgPSBuYW1lLmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCWlmIChuYW1lU3RhcnQgPiAtMSkgewotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lU3RhcnQgKyAxKTsKLQkJCX0KLQkJCWZpbGVDaG9vc2VyLnNldEZpbGVOYW1lKG5hbWUpOwotCQl9Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoU0FWRV9GSUxURVJfRVhURU5TSU9OUyk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKFNBVkVfRklMVEVSX05BTUVTKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZUNob29zZXIub3BlbigpOwotCQlsYXN0UGF0aCA9IGZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKTsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gRmlndXJlIG91dCB3aGF0IGZpbGUgdHlwZSB0aGUgdXNlciB3YW50cyBzYXZlZC4KLQkJLy8gV2UgbmVlZCB0byByZWx5IG9uIHRoZSBmaWxlIGV4dGVuc2lvbiBiZWNhdXNlIEZpbGVEaWFsb2cKLQkJLy8gZG9lcyBub3QgaGF2ZSBBUEkgZm9yIGFza2luZyB3aGF0IGZpbHRlciB0eXBlIHdhcyBzZWxlY3RlZC4KLQkJaW50IGZpbGV0eXBlID0gZGV0ZXJtaW5lRmlsZVR5cGUoZmlsZW5hbWUpOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX1VOREVGSU5FRCkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlVua25vd25fZXh0ZW5zaW9uIiksIAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpICsgMSkpKTsKLQkJCWJveC5vcGVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKS5leGlzdHMoKSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fUVVFU1RJT04gfCBTV1QuT0sgfCBTV1QuQ0FOQ0VMKTsKLQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJPdmVyd3JpdGUiKSwgZmlsZW5hbWUpKTsKLQkJCWlmIChib3gub3BlbigpID09IFNXVC5DQU5DRUwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIHRoZSBjdXJyZW50IGltYWdlIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkJCWJvb2xlYW4gbXVsdGkgPSBmYWxzZTsKLQkJCWlmIChsb2FkZXIuZGF0YS5sZW5ndGggPiAxKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fUVVFU1RJT04gfCBTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYWxsIiksIG5ldyBJbnRlZ2VyKGxvYWRlci5kYXRhLmxlbmd0aCkpKTsKLQkJCQlpbnQgcmVzdWx0ID0gYm94Lm9wZW4oKTsKLQkJCQlpZiAocmVzdWx0ID09IFNXVC5DQU5DRUwpIHJldHVybjsKLQkJCQlpZiAocmVzdWx0ID09IFNXVC5ZRVMpIG11bHRpID0gdHJ1ZTsKLQkJCX0KLQkJCS8qIElmIHRoZSBpbWFnZSBoYXMgdHJhbnNwYXJlbmN5IGJ1dCB0aGUgdXNlciBoYXMgdHJhbnNwYXJlbmN5IHR1cm5lZCBvZmYsCi0JCQkgKiB0dXJuIGl0IG9mZiBpbiB0aGUgc2F2ZWQgaW1hZ2UuICovCi0JCQlpbnQgdHJhbnNwYXJlbnRQaXhlbCA9IGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsOwotCQkJaWYgKCFtdWx0aSAmJiB0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JCQl9Ci0JCQkKLQkJCWlmICghbXVsdGkpIGxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZURhdGF9OwotCQkJbG9hZGVyLnNhdmUoZmlsZW5hbWUsIGZpbGV0eXBlKTsKLQkJCQotCQkJLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgdHJhbnNwYXJlbmN5IHNldHRpbmcuICovCi0JCQlpZiAoIW11bHRpICYmIHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSB0cmFuc3BhcmVudFBpeGVsOwotCQkJfQotCi0JCQkvLyBVcGRhdGUgdGhlIHNoZWxsIHRpdGxlIGFuZCBmaWxlIHR5cGUgbGFiZWwsCi0JCQkvLyBhbmQgdXNlIHRoZSBuZXcgZmlsZS4KLQkJCWZpbGVOYW1lID0gZmlsZW5hbWU7Ci0JCQlzaGVsbC5zZXRUZXh0KGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJBbmFseXplcl9vbiIpLCBmaWxlbmFtZSkpOwotCQkJdHlwZUxhYmVsLnNldFRleHQoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfc3RyaW5nIiksIGZpbGVUeXBlU3RyaW5nKGZpbGV0eXBlKSkpOwotCi0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVTYXZlTWFza0FzKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCAhc2hvd01hc2spIHJldHVybjsKLQkJaWYgKGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkgPT0gU1dULlRSQU5TUEFSRU5DWV9OT05FKSByZXR1cm47Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0KLQkJLy8gR2V0IHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUgbmFtZSBhbmQgdHlwZSB0byBzYXZlLgotCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TQVZFKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyUGF0aChsYXN0UGF0aCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSBmaWxlQ2hvb3Nlci5zZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoU0FWRV9GSUxURVJfRVhURU5TSU9OUyk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKFNBVkVfRklMVEVSX05BTUVTKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZUNob29zZXIub3BlbigpOwotCQlsYXN0UGF0aCA9IGZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKTsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gRmlndXJlIG91dCB3aGF0IGZpbGUgdHlwZSB0aGUgdXNlciB3YW50cyBzYXZlZC4KLQkJLy8gV2UgbmVlZCB0byByZWx5IG9uIHRoZSBmaWxlIGV4dGVuc2lvbiBiZWNhdXNlIEZpbGVEaWFsb2cKLQkJLy8gZG9lcyBub3QgaGF2ZSBBUEkgZm9yIGFza2luZyB3aGF0IGZpbHRlciB0eXBlIHdhcyBzZWxlY3RlZC4KLQkJaW50IGZpbGV0eXBlID0gZGV0ZXJtaW5lRmlsZVR5cGUoZmlsZW5hbWUpOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX1VOREVGSU5FRCkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlVua25vd25fZXh0ZW5zaW9uIiksIAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpICsgMSkpKTsKLQkJCWJveC5vcGVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKS5leGlzdHMoKSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fUVVFU1RJT04gfCBTV1QuT0sgfCBTV1QuQ0FOQ0VMKTsKLQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJPdmVyd3JpdGUiKSwgZmlsZW5hbWUpKTsKLQkJCWlmIChib3gub3BlbigpID09IFNXVC5DQU5DRUwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIHRoZSBtYXNrIG9mIHRoZSBjdXJyZW50IGltYWdlIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkJCUltYWdlRGF0YSBtYXNrSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHttYXNrSW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5zYXZlKGZpbGVuYW1lLCBmaWxldHlwZSk7Ci0JCQkKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVByaW50KCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQkvLyBBc2sgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcHJpbnRlci4KLQkJCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQkJUHJpbnRlckRhdGEgcHJpbnRlckRhdGEgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHByaW50ZXJEYXRhID09IG51bGwpIHJldHVybjsKLQkJCQotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIocHJpbnRlckRhdGEpOwotCQkJUG9pbnQgc2NyZWVuRFBJID0gZGlzcGxheS5nZXREUEkoKTsKLQkJCVBvaW50IHByaW50ZXJEUEkgPSBwcmludGVyLmdldERQSSgpOwotCQkJaW50IHNjYWxlRmFjdG9yID0gcHJpbnRlckRQSS54IC8gc2NyZWVuRFBJLng7Ci0JCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlpZiAocHJpbnRlci5zdGFydEpvYihjdXJyZW50TmFtZSkpIHsKLQkJCQlpZiAocHJpbnRlci5zdGFydFBhZ2UoKSkgewotCQkJCQlHQyBnYyA9IG5ldyBHQyhwcmludGVyKTsKLQkJCQkJaW50IHRyYW5zcGFyZW50UGl4ZWwgPSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbDsKLQkJCQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQkJCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCQkJCQl9Ci0JCQkJCUltYWdlIHByaW50ZXJJbWFnZSA9IG5ldyBJbWFnZShwcmludGVyLCBpbWFnZURhdGEpOwotCQkJCQlnYy5kcmF3SW1hZ2UoCi0JCQkJCQlwcmludGVySW1hZ2UsCi0JCQkJCQkwLAotCQkJCQkJMCwKLQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQktdHJpbS54LAotCQkJCQkJLXRyaW0ueSwKLQkJCQkJCXNjYWxlRmFjdG9yICogaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJc2NhbGVGYWN0b3IgKiBpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQkJCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JCQkJCX0KLQkJCQkJcHJpbnRlckltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJZ2MuZGlzcG9zZSgpOwotCQkJCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJCQl9Ci0JCQkJcHJpbnRlci5lbmRKb2IoKTsKLQkJCX0KLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZShidW5kbGUuZ2V0U3RyaW5nKCJQcmludGluZ19lcnJvciIpICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJYm94Lm9wZW4oKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVJlb3BlbigpIHsKLQkJaWYgKGN1cnJlbnROYW1lID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJcmVzZXRTY3JvbGxCYXJzKCk7Ci0JCXJlc2V0U2NhbGVDb21ib3MoKTsKLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJSW1hZ2VEYXRhW10gbmV3SW1hZ2VEYXRhOwotCQkJaWYgKGZpbGVOYW1lID09IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChjdXJyZW50TmFtZSk7Ci0JCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQluZXdJbWFnZURhdGEgPSBsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXdJbWFnZURhdGEgPSBsb2FkZXIubG9hZChmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlsb2FkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotCQkJaW1hZ2VEYXRhSW5kZXggPSAwOwotCQkJZGlzcGxheUltYWdlKG5ld0ltYWdlRGF0YVtpbWFnZURhdGFJbmRleF0pOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiUmVsb2FkaW5nX2xjIiksIGN1cnJlbnROYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsJCi0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBjaGFuZ2VCYWNrZ3JvdW5kKCkgewotCQlTdHJpbmcgYmFja2dyb3VuZCA9IGJhY2tncm91bmRDb21iby5nZXRUZXh0KCk7Ci0JCWlmIChiYWNrZ3JvdW5kLmVxdWFscyhidW5kbGUuZ2V0U3RyaW5nKCJXaGl0ZSIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZCh3aGl0ZUNvbG9yKTsKLQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmVxdWFscyhidW5kbGUuZ2V0U3RyaW5nKCJCbGFjayIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChibGFja0NvbG9yKTsKLQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmVxdWFscyhidW5kbGUuZ2V0U3RyaW5nKCJSZWQiKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQocmVkQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIkdyZWVuIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKGdyZWVuQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIkJsdWUiKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQoYmx1ZUNvbG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgU2NhbGVYIGNvbWJvIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXZvaWQgc2NhbGVYKCkgewotCQl0cnkgewotCQkJeHNjYWxlID0gRmxvYXQucGFyc2VGbG9hdChzY2FsZVhDb21iby5nZXRUZXh0KCkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJeHNjYWxlID0gMTsKLQkJCXNjYWxlWENvbWJvLnNlbGVjdChzY2FsZVhDb21iby5pbmRleE9mKCIxIikpOwotCQl9Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXNpemVTY3JvbGxCYXJzKCk7Ci0JCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBTY2FsZVkgY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBzY2FsZVkoKSB7Ci0JCXRyeSB7Ci0JCQl5c2NhbGUgPSBGbG9hdC5wYXJzZUZsb2F0KHNjYWxlWUNvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl5c2NhbGUgPSAxOwotCQkJc2NhbGVZQ29tYm8uc2VsZWN0KHNjYWxlWUNvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCX0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXJlc2l6ZVNjcm9sbEJhcnMoKTsKLQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIEFscGhhIGNvbWJvIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXZvaWQgYWxwaGEoKSB7Ci0JCXRyeSB7Ci0JCQlhbHBoYSA9IEludGVnZXIucGFyc2VJbnQoYWxwaGFDb21iby5nZXRUZXh0KCkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJYWxwaGFDb21iby5zZWxlY3QoYWxwaGFDb21iby5pbmRleE9mKCIyNTUiKSk7Ci0JCQlhbHBoYSA9IDI1NTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBtb3VzZSBtb3ZlcyBpbiB0aGUgaW1hZ2UgY2FudmFzLgotCSAqIFNob3cgdGhlIGNvbG9yIG9mIHRoZSBpbWFnZSBhdCB0aGUgcG9pbnQgdW5kZXIgdGhlIG1vdXNlLgotCSAqLwotCXZvaWQgc2hvd0NvbG9yQXQoaW50IG14LCBpbnQgbXkpIHsKLQkJaW50IHggPSBteCAtIGltYWdlRGF0YS54IC0gaXg7Ci0JCWludCB5ID0gbXkgLSBpbWFnZURhdGEueSAtIGl5OwotCQlzaG93Q29sb3JGb3JQaXhlbCh4LCB5KTsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiBhIG1vdXNlIGRvd24gb3Iga2V5IHByZXNzIGlzIGRldGVjdGVkCi0JICogaW4gdGhlIGRhdGEgdGV4dC4gU2hvdyB0aGUgY29sb3Igb2YgdGhlIHBpeGVsIGF0Ci0JICogdGhlIGNhcmV0IHBvc2l0aW9uIGluIHRoZSBkYXRhIHRleHQuCi0JICovCi0Jdm9pZCBzaG93Q29sb3JGb3JEYXRhKCkgewotCQlpbnQgZGVsaW1pdGVyTGVuZ3RoID0gZGF0YVRleHQuZ2V0TGluZURlbGltaXRlcigpLmxlbmd0aCgpOwotCQlpbnQgY2hhcmFjdGVyc1BlckxpbmUgPSA2ICsgMyAqIGltYWdlRGF0YS5ieXRlc1BlckxpbmUgKyBkZWxpbWl0ZXJMZW5ndGg7Ci0JCWludCBwb3NpdGlvbiA9IGRhdGFUZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCWludCB5ID0gcG9zaXRpb24gLyBjaGFyYWN0ZXJzUGVyTGluZTsKLQkJaWYgKChwb3NpdGlvbiAtIHkgKiBjaGFyYWN0ZXJzUGVyTGluZSkgPCA2IHx8ICgoeSArIDEpICogY2hhcmFjdGVyc1BlckxpbmUgLSBwb3NpdGlvbikgPD0gZGVsaW1pdGVyTGVuZ3RoKSB7Ci0JCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgZGF0YVBvc2l0aW9uID0gcG9zaXRpb24gLSA2ICogKHkgKyAxKSAtIGRlbGltaXRlckxlbmd0aCAqIHk7Ci0JCWludCBieXRlTnVtYmVyID0gZGF0YVBvc2l0aW9uIC8gMzsKLQkJaW50IHdoZXJlID0gZGF0YVBvc2l0aW9uIC0gYnl0ZU51bWJlciAqIDM7Ci0JCWludCB4Qnl0ZSA9IGJ5dGVOdW1iZXIgJSBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lOwotCQlpbnQgeCA9IC0xOwotCQlpbnQgZGVwdGggPSBpbWFnZURhdGEuZGVwdGg7Ci0JCWlmIChkZXB0aCA9PSAxKSB7IC8vIDggcGl4ZWxzIHBlciBieXRlIChjYW4gb25seSBzaG93IDMgb2YgOCkKLQkJCWlmICh3aGVyZSA9PSAwKSB4ID0geEJ5dGUgKiA4OwotCQkJaWYgKHdoZXJlID09IDEpIHggPSB4Qnl0ZSAqIDggKyAzOwotCQkJaWYgKHdoZXJlID09IDIpIHggPSB4Qnl0ZSAqIDggKyA3OwotCQl9Ci0JCWlmIChkZXB0aCA9PSAyKSB7IC8vIDQgcGl4ZWxzIHBlciBieXRlIChjYW4gb25seSBzaG93IDMgb2YgNCkKLQkJCWlmICh3aGVyZSA9PSAwKSB4ID0geEJ5dGUgKiA0OwotCQkJaWYgKHdoZXJlID09IDEpIHggPSB4Qnl0ZSAqIDQgKyAxOwotCQkJaWYgKHdoZXJlID09IDIpIHggPSB4Qnl0ZSAqIDQgKyAzOwotCQl9Ci0JCWlmIChkZXB0aCA9PSA0KSB7IC8vIDIgcGl4ZWxzIHBlciBieXRlCi0JCQlpZiAod2hlcmUgPT0gMCkgeCA9IHhCeXRlICogMjsKLQkJCWlmICh3aGVyZSA9PSAxKSB4ID0geEJ5dGUgKiAyOwotCQkJaWYgKHdoZXJlID09IDIpIHggPSB4Qnl0ZSAqIDIgKyAxOwotCQl9Ci0JCWlmIChkZXB0aCA9PSA4KSB7IC8vIDEgYnl0ZSBwZXIgcGl4ZWwKLQkJCXggPSB4Qnl0ZTsKLQkJfQotCQlpZiAoZGVwdGggPT0gMTYpIHsgLy8gMiBieXRlcyBwZXIgcGl4ZWwKLQkJCXggPSB4Qnl0ZSAvIDI7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDI0KSB7IC8vIDMgYnl0ZXMgcGVyIHBpeGVsCi0JCQl4ID0geEJ5dGUgLyAzOwotCQl9Ci0JCWlmIChkZXB0aCA9PSAzMikgeyAvLyA0IGJ5dGVzIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlIC8gNDsKLQkJfQotCQlpZiAoeCAhPSAtMSkgewotCQkJc2hvd0NvbG9yRm9yUGl4ZWwoeCwgeSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFNldCB0aGUgc3RhdHVzIGxhYmVsIHRvIHNob3cgY29sb3IgaW5mb3JtYXRpb24KLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUgaW1hZ2UuCi0JICovCi0Jdm9pZCBzaG93Q29sb3JGb3JQaXhlbChpbnQgeCwgaW50IHkpIHsKLQkJaWYgKHggPj0gMCAmJiB4IDwgaW1hZ2VEYXRhLndpZHRoICYmIHkgPj0gMCAmJiB5IDwgaW1hZ2VEYXRhLmhlaWdodCkgewotCQkJaW50IHBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJUkdCIHJnYiA9IGltYWdlRGF0YS5wYWxldHRlLmdldFJHQihwaXhlbCk7Ci0JCQlib29sZWFuIGhhc0FscGhhID0gZmFsc2U7Ci0JCQlpbnQgYWxwaGFWYWx1ZSA9IDA7Ci0JCQlpZiAoaW1hZ2VEYXRhLmFscGhhRGF0YSAhPSBudWxsICYmIGltYWdlRGF0YS5hbHBoYURhdGEubGVuZ3RoID4gMCkgewotCQkJCWhhc0FscGhhID0gdHJ1ZTsKLQkJCQlhbHBoYVZhbHVlID0gaW1hZ2VEYXRhLmdldEFscGhhKHgsIHkpOwotCQkJfQotCQkJU3RyaW5nIHJnYk1lc3NhZ2VGb3JtYXQgPSBidW5kbGUuZ2V0U3RyaW5nKGhhc0FscGhhID8gIlJHQkEiIDogIlJHQiIpOwotCQkJT2JqZWN0W10gcmdiQXJncyA9IHsKLQkJCQkJSW50ZWdlci50b1N0cmluZyhyZ2IucmVkKSwKLQkJCQkJSW50ZWdlci50b1N0cmluZyhyZ2IuZ3JlZW4pLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5ibHVlKSwKLQkJCQkJSW50ZWdlci50b1N0cmluZyhhbHBoYVZhbHVlKQotCQkJfTsKLQkJCU9iamVjdFtdIHJnYkhleEFyZ3MgPSB7Ci0JCQkJCUludGVnZXIudG9IZXhTdHJpbmcocmdiLnJlZCksCi0JCQkJCUludGVnZXIudG9IZXhTdHJpbmcocmdiLmdyZWVuKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IuYmx1ZSksCi0JCQkJCUludGVnZXIudG9IZXhTdHJpbmcoYWxwaGFWYWx1ZSkKLQkJCX07Ci0JCQlPYmplY3RbXSBhcmdzID0gewotCQkJCQluZXcgSW50ZWdlcih4KSwKLQkJCQkJbmV3IEludGVnZXIoeSksCi0JCQkJCW5ldyBJbnRlZ2VyKHBpeGVsKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhwaXhlbCksCi0JCQkJCWNyZWF0ZU1zZyhyZ2JNZXNzYWdlRm9ybWF0LCByZ2JBcmdzKSwKLQkJCQkJY3JlYXRlTXNnKHJnYk1lc3NhZ2VGb3JtYXQsIHJnYkhleEFyZ3MpLAotCQkJCQkocGl4ZWwgPT0gaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwpID8gYnVuZGxlLmdldFN0cmluZygiQ29sb3JfYXRfdHJhbnNwYXJlbnQiKSA6ICIifTsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkNvbG9yX2F0IiksIGFyZ3MpKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIEFuaW1hdGUgYnV0dG9uIGlzIHByZXNzZWQuCi0JICovCi0Jdm9pZCBhbmltYXRlKCkgewotCQlhbmltYXRlID0gIWFuaW1hdGU7Ci0JCWlmIChhbmltYXRlICYmIGltYWdlICE9IG51bGwgJiYgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJYW5pbWF0ZVRocmVhZCA9IG5ldyBUaHJlYWQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0aW9uIikpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFByZS1hbmltYXRpb24gd2lkZ2V0IHNldHVwLgotCQkJCQlwcmVBbmltYXRpb24oKTsKLQkJCQkJCi0JCQkJCS8vIEFuaW1hdGUuCi0JCQkJCXRyeSB7Ci0JCQkJCQlhbmltYXRlTG9vcCgpOwotCQkJCQl9IGNhdGNoIChmaW5hbCBTV1RFeGNlcHRpb24gZSkgewotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlzaG93RXJyb3JEaWFsb2coY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkNyZWF0aW5nX2ltYWdlIiksIAotCQkJCQkJCQkJCSAgICBuZXcgSW50ZWdlcihpbWFnZURhdGFJbmRleCsxKSksCi0JCQkJCQkJCQkJICAgIGN1cnJlbnROYW1lLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gUG9zdCBhbmltYXRpb24gd2lkZ2V0IHJlc2V0LgotCQkJCQlwb3N0QW5pbWF0aW9uKCk7Ci0JCQkJfQotCQkJfTsKLQkJCWFuaW1hdGVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJYW5pbWF0ZVRocmVhZC5zdGFydCgpOwotCQl9Ci0JfQotCQotCS8qCi0JICogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgaW1hZ2VzIGluIGEgbXVsdGktaW1hZ2UgZmlsZQotCSAqIGFuZCBkaXNwbGF5IHRoZW0gb25lIGFmdGVyIGFub3RoZXIuCi0JICovCi0Jdm9pZCBhbmltYXRlTG9vcCgpIHsKLQkJLy8gQ3JlYXRlIGFuIG9mZi1zY3JlZW4gaW1hZ2UgdG8gZHJhdyBvbiwgYW5kIGEgR0MgdG8gZHJhdyB3aXRoLgotCQkvLyBCb3RoIGFyZSBkaXNwb3NlZCBhZnRlciB0aGUgYW5pbWF0aW9uLgotCQlJbWFnZSBvZmZTY3JlZW5JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCUdDIG9mZlNjcmVlbkltYWdlR0MgPSBuZXcgR0Mob2ZmU2NyZWVuSW1hZ2UpOwotCQkKLQkJdHJ5IHsKLQkJCS8vIFVzZSBzeW5jRXhlYyB0byBnZXQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGltYWdlQ2FudmFzLgotCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQljYW52YXNCYWNrZ3JvdW5kID0gaW1hZ2VDYW52YXMuZ2V0QmFja2dyb3VuZCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQkvLyBGaWxsIHRoZSBvZmYtc2NyZWVuIGltYWdlIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcy4KLQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChjYW52YXNCYWNrZ3JvdW5kKTsKLQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZSgKLQkJCQkwLAotCQkJCTAsCi0JCQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCwKLQkJCQlsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQotCQkJLy8gRHJhdyB0aGUgY3VycmVudCBpbWFnZSBvbnRvIHRoZSBvZmYtc2NyZWVuIGltYWdlLgotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJaW1hZ2UsCi0JCQkJMCwKLQkJCQkwLAotCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCWltYWdlRGF0YS54LAotCQkJCWltYWdlRGF0YS55LAotCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQotCQkJaW50IHJlcGVhdENvdW50ID0gbG9hZGVyLnJlcGVhdENvdW50OwotCQkJd2hpbGUgKGFuaW1hdGUgJiYgKGxvYWRlci5yZXBlYXRDb3VudCA9PSAwIHx8IHJlcGVhdENvdW50ID4gMCkpIHsKLQkJCQlpZiAoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kID09IFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQpIHsKLQkJCQkJLy8gRmlsbCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGJlZm9yZSBkcmF3aW5nLgotCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJaW50IGJhY2tncm91bmRQaXhlbCA9IGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWw7Ci0JCQkJCWlmIChzaG93QmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kUGl4ZWwgIT0gLTEpIHsKLQkJCQkJCS8vIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvci4KLQkJCQkJCVJHQiBiYWNrZ3JvdW5kUkdCID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGJhY2tncm91bmRQaXhlbCk7Ci0JCQkJCQliZ0NvbG9yID0gbmV3IENvbG9yKG51bGwsIGJhY2tncm91bmRSR0IpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlvZmZTY3JlZW5JbWFnZUdDLnNldEJhY2tncm91bmQoYmdDb2xvciAhPSBudWxsID8gYmdDb2xvciA6IGNhbnZhc0JhY2tncm91bmQpOwotCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKAotCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChiZ0NvbG9yICE9IG51bGwpIGJnQ29sb3IuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QgPT0gU1dULkRNX0ZJTExfUFJFVklPVVMpIHsKLQkJCQkJLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgaW1hZ2UgYmVmb3JlIGRyYXdpbmcuCi0JCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJaW1hZ2UsCi0JCQkJCQkwLAotCQkJCQkJMCwKLQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJfQotCQkJCQkJCQkJCi0JCQkJLy8gR2V0IHRoZSBuZXh0IGltYWdlIGRhdGEuCi0JCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCQlpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCi0JCQkJLy8gRHJhdyB0aGUgbmV3IGltYWdlIGRhdGEuCi0JCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCWltYWdlLAotCQkJCQkwLAotCQkJCQkwLAotCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCWltYWdlRGF0YS54LAotCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkKLQkJCQkvLyBEcmF3IHRoZSBvZmYtc2NyZWVuIGltYWdlIHRvIHRoZSBzY3JlZW4uCi0JCQkJaW1hZ2VDYW52YXNHQy5kcmF3SW1hZ2Uob2ZmU2NyZWVuSW1hZ2UsIDAsIDApOwotCQkJCQotCQkJCS8vIFNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5IHRpbWUgYmVmb3JlIGRyYXdpbmcgYWdhaW4uCi0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKHZpc2libGVEZWxheShpbWFnZURhdGEuZGVsYXlUaW1lICogMTApKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCQotCQkJCS8vIElmIHdlIGhhdmUganVzdCBkcmF3biB0aGUgbGFzdCBpbWFnZSBpbiB0aGUgc2V0LAotCQkJCS8vIHRoZW4gZGVjcmVtZW50IHRoZSByZXBlYXQgY291bnQuCi0JCQkJaWYgKGltYWdlRGF0YUluZGV4ID09IGltYWdlRGF0YUFycmF5Lmxlbmd0aCAtIDEpIHJlcGVhdENvdW50LS07Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlvZmZTY3JlZW5JbWFnZS5kaXNwb3NlKCk7Ci0JCQlvZmZTY3JlZW5JbWFnZUdDLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogUHJlIGFuaW1hdGlvbiBzZXR1cC4KLQkgKi8KLQl2b2lkIHByZUFuaW1hdGlvbigpIHsKLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gQ2hhbmdlIHRoZSBsYWJlbCBvZiB0aGUgQW5pbWF0ZSBidXR0b24gdG8gJ1N0b3AnLgotCQkJCWFuaW1hdGVCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTdG9wIikpOwotCQkJCQotCQkJCS8vIERpc2FibGUgYW55dGhpbmcgd2UgZG9uJ3Qgd2FudCB0aGUgdXNlcgotCQkJCS8vIHRvIHNlbGVjdCBkdXJpbmcgdGhlIGFuaW1hdGlvbi4KLQkJCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWJhY2tncm91bmRDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlzY2FsZVhDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlzY2FsZVlDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlhbHBoYUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWluY3JlbWVudGFsQ2hlY2suc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJdHJhbnNwYXJlbnRDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQltYXNrQ2hlY2suc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJLy8gbGVhdmUgYmFja2dyb3VuZENoZWNrIGVuYWJsZWQKLQkJCQotCQkJCS8vIFJlc2V0IHRoZSBzY2FsZSBjb21ib3MgYW5kIHNjcm9sbGJhcnMuCi0JCQkJcmVzZXRTY2FsZUNvbWJvcygpOwotCQkJCXJlc2V0U2Nyb2xsQmFycygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIFBvc3QgYW5pbWF0aW9uIHJlc2V0LgotCSAqLwotCXZvaWQgcG9zdEFuaW1hdGlvbigpIHsKLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gRW5hYmxlIGFueXRoaW5nIHdlIGRpc2FibGVkIGJlZm9yZSB0aGUgYW5pbWF0aW9uLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWJhY2tncm91bmRDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCXNjYWxlWENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJc2NhbGVZQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlhbHBoYUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJaW5jcmVtZW50YWxDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCXRyYW5zcGFyZW50Q2hlY2suc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQltYXNrQ2hlY2suc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQkJCS8vIFJlc2V0IHRoZSBsYWJlbCBvZiB0aGUgQW5pbWF0ZSBidXR0b24uCi0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGUiKSk7Ci0JCQkKLQkJCQlpZiAoYW5pbWF0ZSkgewotCQkJCQkvLyBJZiBhbmltYXRlIGlzIHN0aWxsIHRydWUsIHdlIGZpbmlzaGVkIHRoZQotCQkJCQkvLyBmdWxsIG51bWJlciBvZiByZXBlYXRzLiBMZWF2ZSB0aGUgaW1hZ2UgYXMtaXMuCi0JCQkJCWFuaW1hdGUgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBSZWRpc3BsYXkgdGhlIGN1cnJlbnQgaW1hZ2UgYW5kIGl0cyBwYWxldHRlLgotCQkJCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIFByZXZpb3VzIGJ1dHRvbiBpcyBwcmVzc2VkLgotCSAqIERpc3BsYXkgdGhlIHByZXZpb3VzIGltYWdlIGluIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkgKi8KLQl2b2lkIHByZXZpb3VzKCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gMCkgewotCQkJCWltYWdlRGF0YUluZGV4ID0gaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJfQotCQkJaW1hZ2VEYXRhSW5kZXggPSBpbWFnZURhdGFJbmRleCAtIDE7Ci0JCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJfQkKLQl9Ci0KLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBOZXh0IGJ1dHRvbiBpcyBwcmVzc2VkLgotCSAqIERpc3BsYXkgdGhlIG5leHQgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCSAqLwotCXZvaWQgbmV4dCgpIHsKLQkJaWYgKGltYWdlICE9IG51bGwgJiYgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQl9CQotCX0KLQotCXZvaWQgZGlzcGxheUltYWdlKEltYWdlRGF0YSBuZXdJbWFnZURhdGEpIHsKLQkJaWYgKGluY3JlbWVudGFsICYmIGluY3JlbWVudGFsVGhyZWFkICE9IG51bGwpIHsKLQkJCS8vIFRlbGwgdGhlIGluY3JlbWVudGFsIHRocmVhZCB0byBzdG9wIGRyYXdpbmcuCi0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpbmNyZW1lbnRhbEV2ZW50cyA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIFdhaXQgdW50aWwgdGhlIGluY3JlbWVudGFsIHRocmVhZCBpcyBkb25lLgotCQkJd2hpbGUgKGluY3JlbWVudGFsVGhyZWFkLmlzQWxpdmUoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCQkJCQotCQkvLyBEaXNwb3NlIG9mIHRoZSBvbGQgaW1hZ2UsIGlmIHRoZXJlIHdhcyBvbmUuCi0JCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIENhY2hlIHRoZSBuZXcgaW1hZ2UgYW5kIGltYWdlRGF0YS4KLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIG5ld0ltYWdlRGF0YSk7Ci0JCQlpbWFnZURhdGEgPSBuZXdJbWFnZURhdGE7Ci0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJDcmVhdGluZ19mcm9tIikgKyAiICIsIGN1cnJlbnROYW1lLCBlKTsKLQkJCWltYWdlID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgd2lkZ2V0cyB3aXRoIHRoZSBuZXcgaW1hZ2UgaW5mby4KLQkJU3RyaW5nIHN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJBbmFseXplcl9vbiIpLCBjdXJyZW50TmFtZSk7Ci0JCXNoZWxsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfaW5kZXgiKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtmaWxlVHlwZVN0cmluZyhpbWFnZURhdGEudHlwZSksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihpbWFnZURhdGFJbmRleCArIDEpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoKX0pOwotCQl9IGVsc2UgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfc3RyaW5nIiksIGZpbGVUeXBlU3RyaW5nKGltYWdlRGF0YS50eXBlKSk7Ci0JCX0KLQkJdHlwZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiU2l6ZV92YWx1ZSIpLCAKLQkJCQkJIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLndpZHRoKSwKLQkJCQkJCQkgICBuZXcgSW50ZWdlcihpbWFnZURhdGEuaGVpZ2h0KX0pOwotCQlzaXplTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZXB0aF92YWx1ZSIpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEuZGVwdGgpKTsKLQkJZGVwdGhMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlRyYW5zcGFyZW50X3BpeGVsX3ZhbHVlIiksIHBpeGVsSW5mbyhpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCkpOwotCQl0cmFuc3BhcmVudFBpeGVsTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUaW1lX3RvX2xvYWRfdmFsdWUiKSwgbmV3IExvbmcobG9hZFRpbWUpKTsKLQkJdGltZVRvTG9hZExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5pbWF0aW9uX3NpemVfdmFsdWUiKSwgCi0JCSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgpLAotCQkJCQkJCQluZXcgSW50ZWdlcihsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCl9KTsKLQkJc2NyZWVuU2l6ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZF9waXhlbF92YWx1ZSIpLCBwaXhlbEluZm8obG9hZGVyLmJhY2tncm91bmRQaXhlbCkpOwotCQliYWNrZ3JvdW5kUGl4ZWxMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkltYWdlX2xvY2F0aW9uX3ZhbHVlIiksIAotCQkgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbWFnZURhdGEueCksIG5ldyBJbnRlZ2VyKGltYWdlRGF0YS55KX0pOwotCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGlzcG9zYWxfdmFsdWUiKSwKLQkJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKSwKLQkJCQkJCQkgICAgICBkaXNwb3NhbFN0cmluZyhpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QpfSk7Ci0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCWludCBkZWxheSA9IGltYWdlRGF0YS5kZWxheVRpbWUgKiAxMDsKLQkJaW50IGRlbGF5VXNlZCA9IHZpc2libGVEZWxheShkZWxheSk7Ci0JCWlmIChkZWxheSAhPSBkZWxheVVzZWQpIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV92YWx1ZSIpLCAKLQkJCSAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGRlbGF5KSwgbmV3IEludGVnZXIoZGVsYXlVc2VkKX0pOwotCQl9IGVsc2UgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkRlbGF5X3VzZWQiKSwgbmV3IEludGVnZXIoZGVsYXkpKTsKLQkJfQotCQlkZWxheVRpbWVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJaWYgKGxvYWRlci5yZXBlYXRDb3VudCA9PSAwKSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coIGJ1bmRsZS5nZXRTdHJpbmcoIlJlcGVhdHNfZm9yZXZlciIpLCBuZXcgSW50ZWdlcihsb2FkZXIucmVwZWF0Q291bnQpKTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX3ZhbHVlIiksIG5ldyBJbnRlZ2VyKGxvYWRlci5yZXBlYXRDb3VudCkpOwotCQl9Ci0JCXJlcGVhdENvdW50TGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0KLQkJaWYgKGltYWdlRGF0YS5wYWxldHRlLmlzRGlyZWN0KSB7Ci0JCQlzdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKCJQYWxldHRlX2RpcmVjdCIpOwotCQl9IGVsc2UgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlBhbGV0dGVfdmFsdWUiKSwgbmV3IEludGVnZXIoaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCkpOwotCQl9Ci0JCXBhbGV0dGVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlBpeGVsX2RhdGFfdmFsdWUiKSwgCi0JCQkJCSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS5ieXRlc1BlckxpbmUpLAotCQkJCQkJICAgICAgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhLnNjYW5saW5lUGFkKSwKLQkJCQkJCQkgICBkZXB0aEluZm8oaW1hZ2VEYXRhLmRlcHRoKX0pOwotCQlkYXRhTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCVN0cmluZyBkYXRhID0gZGF0YUhleER1bXAoZGF0YVRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLQkJZGF0YVRleHQuc2V0VGV4dChkYXRhKTsKLQkJCi0JCS8vIGJvbGQgdGhlIGZpcnN0IGNvbHVtbiBhbGwgdGhlIHdheSBkb3duCi0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlKChpbmRleCA9IGRhdGEuaW5kZXhPZignOicsIGluZGV4KzEpKSAhPSAtMSkgewotCQkJaW50IHN0YXJ0ID0gaW5kZXggLSBJTkRFWF9ESUdJVFM7Ci0JCQlpbnQgbGVuZ3RoID0gSU5ERVhfRElHSVRTOwotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihkYXRhLmNoYXJBdChpbmRleC0xKSkpIHsKLQkJCQlzdGFydCA9IGluZGV4IC0gQUxQSEFfQ0hBUlM7Ci0JCQkJbGVuZ3RoID0gQUxQSEFfQ0hBUlM7Ci0JCQl9Ci0JCQlkYXRhVGV4dC5zZXRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBsZW5ndGgsIGRhdGFUZXh0LmdldEZvcmVncm91bmQoKSwgZGF0YVRleHQuZ2V0QmFja2dyb3VuZCgpLCBTV1QuQk9MRCkpOwotCQl9Ci0KLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0KLQkJLy8gUmVkcmF3IGJvdGggY2FudmFzZXMuCi0JCXBhbGV0dGVDYW52YXMucmVkcmF3KCk7Ci0JCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCX0KLQotCXZvaWQgcGFpbnRJbWFnZShQYWludEV2ZW50IGV2ZW50KSB7Ci0JCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCUltYWdlIHBhaW50SW1hZ2UgPSBpbWFnZTsKLQkJCi0JCS8qIElmIHRoZSB1c2VyIHdhbnRzIHRvIHNlZSB0aGUgdHJhbnNwYXJlbnQgcGl4ZWwgaW4gaXRzIGFjdHVhbCBjb2xvciwKLQkJICogdGhlbiB0ZW1wb3JhcmlseSB0dXJuIG9mZiB0cmFuc3BhcmVuY3kuCi0JCSAqLwotCQlpbnQgdHJhbnNwYXJlbnRQaXhlbCA9IGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsOwotCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JCQlwYWludEltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCX0KLQkJCi0JCS8qIFNjYWxlIHRoZSBpbWFnZSB3aGVuIGRyYXdpbmcsIHVzaW5nIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgc2NhbGluZyBmYWN0b3IuICovCi0JCWludCB3ID0gTWF0aC5yb3VuZChpbWFnZURhdGEud2lkdGggKiB4c2NhbGUpOwotCQlpbnQgaCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLmhlaWdodCAqIHlzY2FsZSk7Ci0JCQotCQkvKiBJZiBhbnkgb2YgdGhlIGJhY2tncm91bmQgaXMgdmlzaWJsZSwgZmlsbCBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLiAqLwotCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCWlmIChpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpICE9IFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSkgewotCQkJLyogSWYgdGhlcmUgaXMgYW55IHRyYW5zcGFyZW5jeSBhdCBhbGwsIGZpbGwgdGhlIHdob2xlIGJhY2tncm91bmQuICovCi0JCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBPdGhlcndpc2UsIGp1c3QgZmlsbCBpbiB0aGUgYmFja3dhcmRzIEwuICovCi0JCQlpZiAoaXggKyB3IDwgYm91bmRzLndpZHRoKSBnYy5maWxsUmVjdGFuZ2xlKGl4ICsgdywgMCwgYm91bmRzLndpZHRoIC0gKGl4ICsgdyksIGJvdW5kcy5oZWlnaHQpOwotCQkJaWYgKGl5ICsgaCA8IGJvdW5kcy5oZWlnaHQpIGdjLmZpbGxSZWN0YW5nbGUoMCwgaXkgKyBoLCBpeCArIHcsIGJvdW5kcy5oZWlnaHQgLSAoaXkgKyBoKSk7Ci0JCX0KLQkJCi0JCS8qIERyYXcgdGhlIGltYWdlICovCi0JCWdjLmRyYXdJbWFnZSgKLQkJCXBhaW50SW1hZ2UsCi0JCQkwLAotCQkJMCwKLQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQlpeCArIGltYWdlRGF0YS54LAotCQkJaXkgKyBpbWFnZURhdGEueSwKLQkJCXcsCi0JCQloKTsKLQkJCi0JCS8qIElmIHRoZXJlIGlzIGEgbWFzayBhbmQgdGhlIHVzZXIgd2FudHMgdG8gc2VlIGl0LCBkcmF3IGl0LiAqLwotCQlpZiAoc2hvd01hc2sgJiYgKGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkgIT0gU1dULlRSQU5TUEFSRU5DWV9OT05FKSkgewotCQkJSW1hZ2VEYXRhIG1hc2tJbWFnZURhdGEgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgbWFza0ltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIG1hc2tJbWFnZURhdGEpOwotCQkJZ2MuZHJhd0ltYWdlKAotCQkJCW1hc2tJbWFnZSwKLQkJCQkwLAotCQkJCTAsCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJdyArIDEwICsgaXggKyBpbWFnZURhdGEueCwKLQkJCQlpeSArIGltYWdlRGF0YS55LAotCQkJCXcsCi0JCQkJaCk7Ci0JCQltYXNrSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQkvKiBJZiB0cmFuc3BhcmVuY3kgd2FzIHRlbXBvcmFyaWx5IGRpc2FibGVkLCByZXN0b3JlIGl0LiAqLwotCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQkJCXBhaW50SW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBwYWludFBhbGV0dGUoUGFpbnRFdmVudCBldmVudCkgewotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlnYy5maWxsUmVjdGFuZ2xlKHBhbGV0dGVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpKTsKLQkJaWYgKGltYWdlRGF0YS5wYWxldHRlLmlzRGlyZWN0KSB7Ci0JCQkvLyBGb3IgYSBkaXJlY3QgcGFsZXR0ZSwgZGlzcGxheSB0aGUgbWFza3MuCi0JCQlpbnQgeSA9IHB5ICsgMTA7Ci0JCQlpbnQgeFRhYiA9IDUwOwotCQkJZ2MuZHJhd1N0cmluZygick1zayIsIDEwLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcodG9IZXg0Qnl0ZVN0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5yZWRNYXNrKSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJnTXNrIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcodG9IZXg0Qnl0ZVN0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5ncmVlbk1hc2spLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImJNc2siLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyh0b0hleDRCeXRlU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmJsdWVNYXNrKSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJyU2hmIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5yZWRTaGlmdCksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiZ1NoZiIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUuZ3JlZW5TaGlmdCksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiYlNoZiIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUuYmx1ZVNoaWZ0KSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBGb3IgYW4gaW5kZXhlZCBwYWxldHRlLCBkaXNwbGF5IHRoZSBwYWxldHRlIGNvbG9ycyBhbmQgaW5kaWNlcy4KLQkJCVJHQltdIHJnYnMgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0JzKCk7Ci0JCQlpZiAocmdicyAhPSBudWxsKSB7Ci0JCQkJaW50IHhUYWIxID0gNDAsIHhUYWIyID0gMTAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmdicy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgeSA9IChpKzEpICogMTAgKyBweTsKLQkJCQkJZ2MuZHJhd1N0cmluZyhTdHJpbmcudmFsdWVPZihpKSwgMTAsIHksIHRydWUpOwotCQkJCQlnYy5kcmF3U3RyaW5nKHRvSGV4Qnl0ZVN0cmluZyhyZ2JzW2ldLnJlZCkgKyB0b0hleEJ5dGVTdHJpbmcocmdic1tpXS5ncmVlbikgKyB0b0hleEJ5dGVTdHJpbmcocmdic1tpXS5ibHVlKSwgeFRhYjEsIHksIHRydWUpOwotCQkJCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2JzW2ldKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoeFRhYjIsIHkrMiwgMTAsIDEwKTsKLQkJCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQl2b2lkIHJlc2l6ZVNoZWxsKENvbnRyb2xFdmVudCBldmVudCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCXJlc2l6ZVNjcm9sbEJhcnMoKTsKLQl9Ci0KLQkvLyBSZXNldCB0aGUgc2NhbGUgY29tYm9zIHRvIDEuCi0Jdm9pZCByZXNldFNjYWxlQ29tYm9zKCkgewotCQl4c2NhbGUgPSAxOyB5c2NhbGUgPSAxOwotCQlzY2FsZVhDb21iby5zZWxlY3Qoc2NhbGVYQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJc2NhbGVZQ29tYm8uc2VsZWN0KHNjYWxlWUNvbWJvLmluZGV4T2YoIjEiKSk7Ci0JfQotCQotCS8vIFJlc2V0IHRoZSBzY3JvbGwgYmFycyB0byAwLgotCXZvaWQgcmVzZXRTY3JvbGxCYXJzKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlpeCA9IDA7IGl5ID0gMDsgcHkgPSAwOwotCQlyZXNpemVTY3JvbGxCYXJzKCk7Ci0JCWltYWdlQ2FudmFzLmdldEhvcml6b250YWxCYXIoKS5zZXRTZWxlY3Rpb24oMCk7Ci0JCWltYWdlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCkuc2V0U2VsZWN0aW9uKDApOwotCQlwYWxldHRlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCkuc2V0U2VsZWN0aW9uKDApOwotCX0KLQkKLQl2b2lkIHJlc2l6ZVNjcm9sbEJhcnMoKSB7Ci0JCS8vIFNldCB0aGUgbWF4IGFuZCB0aHVtYiBmb3IgdGhlIGltYWdlIGNhbnZhcyBzY3JvbGwgYmFycy4KLQkJU2Nyb2xsQmFyIGhvcml6b250YWwgPSBpbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCVNjcm9sbEJhciB2ZXJ0aWNhbCA9IGltYWdlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCVJlY3RhbmdsZSBjYW52YXNCb3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLndpZHRoICogeHNjYWxlKTsKLQkJaWYgKHdpZHRoID4gY2FudmFzQm91bmRzLndpZHRoKSB7Ci0JCQkvLyBUaGUgaW1hZ2UgaXMgd2lkZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJaG9yaXpvbnRhbC5zZXRNYXhpbXVtKHdpZHRoKTsKLQkJCWhvcml6b250YWwuc2V0VGh1bWIoY2FudmFzQm91bmRzLndpZHRoKTsKLQkJCWhvcml6b250YWwuc2V0UGFnZUluY3JlbWVudChjYW52YXNCb3VuZHMud2lkdGgpOwotCQl9IGVsc2UgewotCQkJLy8gVGhlIGNhbnZhcyBpcyB3aWRlciB0aGFuIHRoZSBpbWFnZS4KLQkJCWhvcml6b250YWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoaXggIT0gMCkgewotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgaW1hZ2UgaXMgY29tcGxldGVseSB2aXNpYmxlLgotCQkJCWl4ID0gMDsKLQkJCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJCX0KLQkJfQotCQlpbnQgaGVpZ2h0ID0gTWF0aC5yb3VuZChpbWFnZURhdGEuaGVpZ2h0ICogeXNjYWxlKTsKLQkJaWYgKGhlaWdodCA+IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCS8vIFRoZSBpbWFnZSBpcyB0YWxsZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJdmVydGljYWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXZlcnRpY2FsLnNldE1heGltdW0oaGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFRodW1iKGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQkJdmVydGljYWwuc2V0UGFnZUluY3JlbWVudChjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBjYW52YXMgaXMgdGFsbGVyIHRoYW4gdGhlIGltYWdlLgotCQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoaXkgIT0gMCkgewotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgaW1hZ2UgaXMgY29tcGxldGVseSB2aXNpYmxlLgotCQkJCWl5ID0gMDsKLQkJCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNldCB0aGUgbWF4IGFuZCB0aHVtYiBmb3IgdGhlIHBhbGV0dGUgY2FudmFzIHNjcm9sbCBiYXIuCi0JCXZlcnRpY2FsID0gcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlpZiAoaW1hZ2VEYXRhLnBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgeyAvLyBpbmRleGVkIHBhbGV0dGUKLQkJCWNhbnZhc0JvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJaW50IHBhbGV0dGVIZWlnaHQgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0JzKCkubGVuZ3RoICogMTAgKyAyMDsgLy8gMTAgcGl4ZWxzIGVhY2ggaW5kZXggKyAyMCBmb3IgbWFyZ2lucy4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl2ZXJ0aWNhbC5zZXRNYXhpbXVtKHBhbGV0dGVIZWlnaHQpOwotCQkJdmVydGljYWwuc2V0VGh1bWIoY2FudmFzQm91bmRzLmhlaWdodCk7Ci0JCQl2ZXJ0aWNhbC5zZXRQYWdlSW5jcmVtZW50KGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgY2FudmFzJyBob3Jpem9udGFsIHNjcm9sbGJhciBpcyBzZWxlY3RlZC4KLQkgKi8KLQl2b2lkIHNjcm9sbEhvcml6b250YWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCVJlY3RhbmdsZSBjYW52YXNCb3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLndpZHRoICogeHNjYWxlKTsKLQkJaW50IGhlaWdodCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLmhlaWdodCAqIHlzY2FsZSk7Ci0JCWlmICh3aWR0aCA+IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJLy8gT25seSBzY3JvbGwgaWYgdGhlIGltYWdlIGlzIGJpZ2dlciB0aGFuIHRoZSBjYW52YXMuCi0JCQlpbnQgeCA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoeCArIHdpZHRoIDwgY2FudmFzQm91bmRzLndpZHRoKSB7Ci0JCQkJLy8gRG9uJ3Qgc2Nyb2xsIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuCi0JCQkJeCA9IGNhbnZhc0JvdW5kcy53aWR0aCAtIHdpZHRoOwotCQkJfQotCQkJaW1hZ2VDYW52YXMuc2Nyb2xsKHgsIGl5LCBpeCwgaXksIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKLQkJCWl4ID0geDsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBpbWFnZSBjYW52YXMnIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBzZWxlY3RlZC4KLQkgKi8KLQl2b2lkIHNjcm9sbFZlcnRpY2FsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWludCBoZWlnaHQgPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQlpZiAoaGVpZ2h0ID4gY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJLy8gT25seSBzY3JvbGwgaWYgdGhlIGltYWdlIGlzIGJpZ2dlciB0aGFuIHRoZSBjYW52YXMuCi0JCQlpbnQgeSA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoeSArIGhlaWdodCA8IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCQkvLyBEb24ndCBzY3JvbGwgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4KLQkJCQl5ID0gY2FudmFzQm91bmRzLmhlaWdodCAtIGhlaWdodDsKLQkJCX0KLQkJCWltYWdlQ2FudmFzLnNjcm9sbChpeCwgeSwgaXgsIGl5LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7Ci0JCQlpeSA9IHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwYWxldHRlIGNhbnZhcycgdmVydGljYWwgc2Nyb2xsYmFyIGlzIHNlbGVjdGVkLgotCSAqLwotCXZvaWQgc2Nyb2xsUGFsZXR0ZShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCVJlY3RhbmdsZSBjYW52YXNCb3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHBhbGV0dGVIZWlnaHQgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0JzKCkubGVuZ3RoICogMTAgKyAyMDsKLQkJaWYgKHBhbGV0dGVIZWlnaHQgPiBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkvLyBPbmx5IHNjcm9sbCBpZiB0aGUgcGFsZXR0ZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHkgKyBwYWxldHRlSGVpZ2h0IDwgY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJCS8vIERvbid0IHNjcm9sbCBwYXN0IHRoZSBlbmQgb2YgdGhlIHBhbGV0dGUuCi0JCQkJeSA9IGNhbnZhc0JvdW5kcy5oZWlnaHQgLSBwYWxldHRlSGVpZ2h0OwotCQkJfQotCQkJcGFsZXR0ZUNhbnZhcy5zY3JvbGwoMCwgeSwgMCwgcHksIHBhbGV0dGVXaWR0aCwgcGFsZXR0ZUhlaWdodCwgZmFsc2UpOwotCQkJcHkgPSB5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIGxpbmUtYnktbGluZSBkdW1wIG9mCi0JICogdGhlIGRhdGEgaW4gdGhlIGN1cnJlbnQgaW1hZ2VEYXRhLiBUaGUgbGluZURlbGltaXRlcgotCSAqIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAxIG9yIDIuCi0JICovCi0JU3RyaW5nIGRhdGFIZXhEdW1wKFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7Ci0JCWZpbmFsIGludCBNQVhfRFVNUCA9IDEwMjQgKiAxMDI0OwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuICIiOwotCQlib29sZWFuIHRydW5jYXRlZCA9IGZhbHNlOwotCQljaGFyW10gZHVtcCA9IG51bGw7Ci0JCWJ5dGVbXSBhbHBoYXMgPSBpbWFnZURhdGEuYWxwaGFEYXRhOwotCQl0cnkgewotCQkJaW50IGxlbmd0aCA9IGltYWdlRGF0YS5oZWlnaHQgKiAoNiArIDMgKiBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lICsgbGluZURlbGltaXRlci5sZW5ndGgoKSk7Ci0JCQlpZiAoYWxwaGFzICE9IG51bGwgJiYgYWxwaGFzLmxlbmd0aCA+IDApIHsKLQkJCQlsZW5ndGggKz0gaW1hZ2VEYXRhLmhlaWdodCAqICg2ICsgMyAqIGltYWdlRGF0YS53aWR0aCArIGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkpICsgNiArIGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCk7Ci0JCQl9Ci0JCQlkdW1wID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0JCQkvKiBUb28gbXVjaCBkYXRhIHRvIGR1bXAgLSB0cnVuY2F0ZS4gKi8KLQkJCWR1bXAgPSBuZXcgY2hhcltNQVhfRFVNUF07Ci0JCQl0cnVuY2F0ZWQgPSB0cnVlOwotCQl9Ci0JCWludCBpbmRleCA9IDA7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgJSBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lID09IDApIHsKLQkJCQkJaW50IGxpbmUgPSBpIC8gaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lIC8gMTAwMCAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMCAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwICUgMTAsIDEwKTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lICUgMTAsIDEwKTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9ICc6JzsKLQkJCQkJZHVtcFtpbmRleCsrXSA9ICcgJzsKLQkJCQl9Ci0JCQkJYnl0ZSBiID0gaW1hZ2VEYXRhLmRhdGFbaV07Ci0JCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdCgoYiAmIDB4RjApID4+IDQsIDE2KTsKLQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGIgJiAweDBGLCAxNik7Ci0JCQkJZHVtcFtpbmRleCsrXSA9ICcgJzsKLQkJCQlpZiAoKGkgKyAxKSAlIGltYWdlRGF0YS5ieXRlc1BlckxpbmUgPT0gMCkgewotCQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMCk7Ci0JCQkJCWlmIChsaW5lRGVsaW1pdGVyLmxlbmd0aCgpID4gMSkgewotCQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFscGhhcyAhPSBudWxsICYmIGFscGhhcy5sZW5ndGggPiAwKSB7Ci0JCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDApOwotCQkJCWlmIChsaW5lRGVsaW1pdGVyLmxlbmd0aCgpID4gMSkgewotCQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3IGNoYXJbXXsnQScsJ2wnLCdwJywnaCcsJ2EnLCc6J30sIDAsIGR1bXAsIGluZGV4LCA2KTsKLQkJCQlpbmRleCArPTY7Ci0JCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDApOwotCQkJCWlmIChsaW5lRGVsaW1pdGVyLmxlbmd0aCgpID4gMSkgewotCQkJCQlkdW1wW2luZGV4KytdID0gbGluZURlbGltaXRlci5jaGFyQXQoMSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICUgaW1hZ2VEYXRhLndpZHRoID09IDApIHsKLQkJCQkJCWludCBsaW5lID0gaSAvIGltYWdlRGF0YS53aWR0aDsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMDAgJSAxMCwgMTApOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChsaW5lIC8gMTAwICUgMTAsIDEwKTsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwICUgMTAsIDEwKTsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gJzonOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9ICcgJzsKLQkJCQkJfQotCQkJCQlieXRlIGIgPSBhbHBoYXNbaV07Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGIgJiAweEYwKSA+PiA0LCAxNik7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoYiAmIDB4MEYsIDE2KTsKLQkJCQkJZHVtcFtpbmRleCsrXSA9ICcgJzsKLQkJCQkJaWYgKChpICsgMSkgJSBpbWFnZURhdGEud2lkdGggPT0gMCkgewotCQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDApOwotCQkJCQkJaWYgKGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkgPiAxKSB7Ci0JCQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHt9Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoZHVtcCk7Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJLyogVG9vIG11Y2ggZGF0YSB0byBkaXNwbGF5IGluIHRoZSB0ZXh0IHdpZGdldCAtIHRydW5jYXRlLiAqLwotCQkJcmVzdWx0ID0gbmV3IFN0cmluZyhkdW1wLCAwLCBNQVhfRFVNUCk7Ci0JCQl0cnVuY2F0ZWQgPSB0cnVlOwotCQl9Ci0JCWlmICh0cnVuY2F0ZWQpIHJlc3VsdCArPSAiXG4gLi4uZGF0YSBkdW1wIHRydW5jYXRlZCBhdCAiICsgTUFYX0RVTVAgKyAiYnl0ZXMuLi4iOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKgotCSAqIE9wZW4gYW4gZXJyb3IgZGlhbG9nIGRpc3BsYXlpbmcgdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIHNob3dFcnJvckRpYWxvZyhTdHJpbmcgb3BlcmF0aW9uLCBTdHJpbmcgZmlsZW5hbWUsIFRocm93YWJsZSBlKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRXJyb3IiKSwgbmV3IFN0cmluZ1tdIHtvcGVyYXRpb24sIGZpbGVuYW1lfSk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSAiIjsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBTV1RFeGNlcHRpb24pIHsKLQkJCQlTV1RFeGNlcHRpb24gc3d0ZSA9IChTV1RFeGNlcHRpb24pIGU7Ci0JCQkJZXJyb3JNZXNzYWdlID0gc3d0ZS5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYgKHN3dGUudGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCQkJZXJyb3JNZXNzYWdlICs9ICI6XG4iICsgc3d0ZS50aHJvd2FibGUudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBTV1RFcnJvcikgewotCQkJCVNXVEVycm9yIHN3dGUgPSAoU1dURXJyb3IpIGU7Ci0JCQkJZXJyb3JNZXNzYWdlID0gc3d0ZS5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYgKHN3dGUudGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCQkJZXJyb3JNZXNzYWdlICs9ICI6XG4iICsgc3d0ZS50aHJvd2FibGUudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yTWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlib3guc2V0TWVzc2FnZShtZXNzYWdlICsgZXJyb3JNZXNzYWdlKTsKLQkJYm94Lm9wZW4oKTsKLQl9Ci0JCi0JLyoKLQkgKiBPcGVuIGEgZGlhbG9nIGFza2luZyB0aGUgdXNlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgdHlwZSBvZiBCTVAgZmlsZSB0byBzYXZlLgotCSAqLwotCWludCBzaG93Qk1QRGlhbG9nKCkgewotCQlmaW5hbCBpbnQgW10gYm1wVHlwZSA9IG5ldyBpbnRbMV07Ci0JCWJtcFR5cGVbMF0gPSBTV1QuSU1BR0VfQk1QOwotCQlTZWxlY3Rpb25MaXN0ZW5lciByYWRpb1NlbGVjdGVkID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnV0dG9uIHJhZGlvID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJCWlmIChyYWRpby5nZXRTZWxlY3Rpb24oKSkgYm1wVHlwZVswXSA9ICgoSW50ZWdlcilyYWRpby5nZXREYXRhKCkpLmludFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JCS8vIG5lZWQgdG8gZXh0ZXJuYWxpemUgc3RyaW5ncwotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0KLQkJZGlhbG9nLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hc190eXBlIikpOwotCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hc190eXBlX2xhYmVsIikpOwotCQkKLQkJQnV0dG9uIHJhZGlvID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5SQURJTyk7Ci0JCXJhZGlvLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hc190eXBlX25vX2NvbXByZXNzIikpOwotCQlyYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJhZGlvLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUCkpOwotCQlyYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihyYWRpb1NlbGVjdGVkKTsKLQotCQlyYWRpbyA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUkFESU8pOwotCQlyYWRpby5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9ybGVfY29tcHJlc3MiKSk7Ci0JCXJhZGlvLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUF9STEUpKTsKLQkJcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0JCQotCQlyYWRpbyA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUkFESU8pOwotCQlyYWRpby5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9vczIiKSk7Ci0JCXJhZGlvLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX09TMl9CTVApKTsKLQkJcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCW9rLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT0siKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZGlhbG9nLnBhY2soKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJd2hpbGUgKCFkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlyZXR1cm4gYm1wVHlwZVswXTsKLQl9CQotCQotCS8qCi0JICogUmV0dXJuIGEgU3RyaW5nIGRlc2NyaWJpbmcgaG93IHRvIGFuYWx5emUgdGhlIGJ5dGVzCi0JICogaW4gdGhlIGhleCBkdW1wLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZGVwdGhJbmZvKGludCBkZXB0aCkgewotCQlPYmplY3RbXSBhcmdzID0ge25ldyBJbnRlZ2VyKGRlcHRoKSwgIiJ9OwotCQlzd2l0Y2ggKGRlcHRoKSB7Ci0JCQljYXNlIDE6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9waXhlbHMiKSwgCi0JCQkJICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKDgpLCAiIFswMTIzNDU2N10ifSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9waXhlbHMiKSwKLQkJCQkgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoNCksICJbMDAxMTIyMzNdIn0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksCi0JCQkJICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKDIpLCAiWzAwMDAxMTExXSJ9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgODoKLQkJCQlhcmdzWzFdID0gYnVuZGxlLmdldFN0cmluZygiT25lX2J5dGUiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9ieXRlcyIpLCBuZXcgSW50ZWdlcigyKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfYnl0ZXMiKSwgbmV3IEludGVnZXIoMykpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX2J5dGVzIiksIG5ldyBJbnRlZ2VyKDQpKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYXJnc1sxXSA9IGJ1bmRsZS5nZXRTdHJpbmcoIlVuc3VwcG9ydGVkX2xjIik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZXB0aF9pbmZvIiksIGFyZ3MpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0JICogSWYgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGlzIHRvbyBzbWFsbAotCSAqIHRvIHNlZSBhIHZpc3VhbCBjaGFuZ2UsIHRoZW4gcmV0dXJuIGEgaGlnaGVyIG51bWJlci4KLQkgKi8KLQlzdGF0aWMgaW50IHZpc2libGVEZWxheShpbnQgbXMpIHsKLQkJaWYgKG1zIDwgMjApIHJldHVybiBtcyArIDMwOwotCQlpZiAobXMgPCAzMCkgcmV0dXJuIG1zICsgMTA7Ci0JCXJldHVybiBtczsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGJ5dGUgdmFsdWUgYXMgYSBoZXggc3RyaW5nLAotCSAqIHByZXNlcnZpbmcgbGVhZGluZyAwJ3MuCi0JICovCi0Jc3RhdGljIFN0cmluZyB0b0hleEJ5dGVTdHJpbmcoaW50IGkpIHsKLQkJaWYgKGkgPD0gMHgwZikKLQkJCXJldHVybiAiMCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGkpOwotCQlyZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyhpICYgMHhmZik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCA0LWJ5dGUgdmFsdWUgYXMgYSBoZXggc3RyaW5nLAotCSAqIHByZXNlcnZpbmcgbGVhZGluZyAwJ3MuCi0JICogKGEgYml0ICdicnV0ZSBmb3JjZScuLi4gc2hvdWxkIHByb2JhYmx5IHVzZSBhIGxvb3AuLi4pCi0JICovCi0Jc3RhdGljIFN0cmluZyB0b0hleDRCeXRlU3RyaW5nKGludCBpKSB7Ci0JCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGkpOwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gIjAwMDAwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDIpCi0JCQlyZXR1cm4gIjAwMDAwMCIgKyBoZXg7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gMykKLQkJCXJldHVybiAiMDAwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDQpCi0JCQlyZXR1cm4gIjAwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDUpCi0JCQlyZXR1cm4gIjAwMCIgKyBoZXg7Ci0JCWlmIChoZXgubGVuZ3RoKCkgPT0gNikKLQkJCXJldHVybiAiMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDcpCi0JCQlyZXR1cm4gIjAiICsgaGV4OwotCQlyZXR1cm4gaGV4OwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQKLQkgKiB0cmFuc3BhcmVudCBvciBiYWNrZ3JvdW5kIHBpeGVsLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgcGl4ZWxJbmZvKGludCBwaXhlbCkgewotCQlpZiAocGl4ZWwgPT0gLTEpCi0JCQlyZXR1cm4gcGl4ZWwgKyAiICgiICsgYnVuZGxlLmdldFN0cmluZygiTm9uZV9sYyIpICsgIikiOwotCQllbHNlCi0JCQlyZXR1cm4gcGl4ZWwgKyAiICgweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHBpeGVsKSArICIpIjsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWVkIGRpc3Bvc2FsIG1ldGhvZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGRpc3Bvc2FsU3RyaW5nKGludCBkaXNwb3NhbE1ldGhvZCkgewotCQlzd2l0Y2ggKGRpc3Bvc2FsTWV0aG9kKSB7Ci0JCQljYXNlIFNXVC5ETV9GSUxMX05PTkU6IHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJOb25lX2xjIik7Ci0JCQljYXNlIFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQ6IHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJCYWNrZ3JvdW5kX2xjIik7Ci0JCQljYXNlIFNXVC5ETV9GSUxMX1BSRVZJT1VTOiByZXR1cm4gYnVuZGxlLmdldFN0cmluZygiUHJldmlvdXNfbGMiKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZygiVW5zcGVjaWZpZWRfbGMiKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWVkIGltYWdlIGZpbGUgdHlwZS4KLQkgKi8KLQlTdHJpbmcgZmlsZVR5cGVTdHJpbmcoaW50IGZpbGV0eXBlKSB7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfQk1QKQotCQkJcmV0dXJuICJCTVAiOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX0JNUF9STEUpCi0JCQlyZXR1cm4gIlJMRSIgKyBpbWFnZURhdGEuZGVwdGggKyAiIEJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfT1MyX0JNUCkKLQkJCXJldHVybiAiT1MvMiBCTVAiOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX0dJRikKLQkJCXJldHVybiAiR0lGIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9JQ08pCi0JCQlyZXR1cm4gIklDTyI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfSlBFRykKLQkJCXJldHVybiAiSlBFRyI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfUE5HKQotCQkJcmV0dXJuICJQTkciOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX1RJRkYpCi0JCQlyZXR1cm4gIlRJRkYiOwotCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZygiVW5rbm93bl9hYyIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGZpbGUncyBpbWFnZSB0eXBlLCBiYXNlZCBvbiBpdHMgZXh0ZW5zaW9uLgotCSAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIHZlcnkgcm9idXN0IHdheSB0byBkZXRlcm1pbmUgaW1hZ2UgdHlwZSwKLQkgKiBhbmQgaXQgaXMgb25seSB0byBiZSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIGFueSBiZXR0ZXIgbWV0aG9kLgotCSAqLwotCWludCBkZXRlcm1pbmVGaWxlVHlwZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nIGV4dCA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiYm1wIikpIHsKLQkJCXJldHVybiBzaG93Qk1QRGlhbG9nKCk7Ci0JCX0KLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJnaWYiKSkKLQkJCXJldHVybiBTV1QuSU1BR0VfR0lGOwotCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoImljbyIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9JQ087Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgianBnIikgfHwgZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpwZWciKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgiamZpZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9KUEVHOwotCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoInBuZyIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9QTkc7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgidGlmIikgfHwgZXh0LmVxdWFsc0lnbm9yZUNhc2UoInRpZmYiKSkKLQkJCXJldHVybiBTV1QuSU1BR0VfVElGRjsKLQkJcmV0dXJuIFNXVC5JTUFHRV9VTkRFRklORUQ7Ci0JfQotCQotCXN0YXRpYyBTdHJpbmcgY3JlYXRlTXNnKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKLQkJTWVzc2FnZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgTWVzc2FnZUZvcm1hdChtc2cpOwotCQlyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChhcmdzKTsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjcmVhdGVNc2coU3RyaW5nIG1zZywgT2JqZWN0IGFyZykgewotCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KG1zZyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KG5ldyBPYmplY3RbXXthcmd9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFMaW5lU3R5bGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFMaW5lU3R5bGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0ZWNiZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhTGluZVN0eWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuamF2YXZpZXdlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi1jbGFzcyBKYXZhTGluZVN0eWxlciBpbXBsZW1lbnRzIExpbmVTdHlsZUxpc3RlbmVyIHsKLQlKYXZhU2Nhbm5lciBzY2FubmVyID0gbmV3IEphdmFTY2FubmVyKCk7Ci0JaW50W10gdG9rZW5Db2xvcnM7Ci0JQ29sb3JbXSBjb2xvcnM7Ci0JVmVjdG9yIGJsb2NrQ29tbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPTD0gMTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JEPQkJMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSElURT0JCTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZPQkJCTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVD0JCTM7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklORz0JCTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1RIRVI9CQk2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTUJFUj0JCTc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX1RPS0VOPSA4OwotCi1wdWJsaWMgSmF2YUxpbmVTdHlsZXIoKSB7Ci0JaW5pdGlhbGl6ZUNvbG9ycygpOwotCXNjYW5uZXIgPSBuZXcgSmF2YVNjYW5uZXIoKTsKLX0KLQotQ29sb3IgZ2V0Q29sb3IoaW50IHR5cGUpIHsKLQlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSB0b2tlbkNvbG9ycy5sZW5ndGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBjb2xvcnNbdG9rZW5Db2xvcnNbdHlwZV1dOwotfQotCi1ib29sZWFuIGluQmxvY2tDb21tZW50KGludCBzdGFydCwgaW50IGVuZCkgewotCWZvciAoaW50IGk9MDsgaTxibG9ja0NvbW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCWludFtdIG9mZnNldHMgPSAoaW50W10pYmxvY2tDb21tZW50cy5lbGVtZW50QXQoaSk7Ci0JCS8vIHN0YXJ0IG9mIGNvbW1lbnQgaW4gdGhlIGxpbmUKLQkJaWYgKChvZmZzZXRzWzBdID49IHN0YXJ0KSAmJiAob2Zmc2V0c1swXSA8PSBlbmQpKSByZXR1cm4gdHJ1ZTsKLQkJLy8gZW5kIG9mIGNvbW1lbnQgaW4gdGhlIGxpbmUKLQkJaWYgKChvZmZzZXRzWzFdID49IHN0YXJ0KSAmJiAob2Zmc2V0c1sxXSA8PSBlbmQpKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKChvZmZzZXRzWzBdIDw9IHN0YXJ0KSAmJiAob2Zmc2V0c1sxXSA+PSBlbmQpKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JY29sb3JzPSBuZXcgQ29sb3JbXSB7Ci0JCW5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDAsIDAsIDApKSwJCS8vIGJsYWNrCi0JCW5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDI1NSwgMCwgMCkpLAkvLyByZWQKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgMjU1LCAwKSksCS8vIGdyZWVuCi0JCW5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDAsICAgMCwgMjU1KSkJLy8gYmx1ZQotCX07Ci0JdG9rZW5Db2xvcnM9IG5ldyBpbnRbTUFYSU1VTV9UT0tFTl07Ci0JdG9rZW5Db2xvcnNbV09SRF09CQkwOwotCXRva2VuQ29sb3JzW1dISVRFXT0JCTA7Ci0JdG9rZW5Db2xvcnNbS0VZXT0JCTM7IAotCXRva2VuQ29sb3JzW0NPTU1FTlRdPQkxOyAKLQl0b2tlbkNvbG9yc1tTVFJJTkddPSAJMjsgCi0JdG9rZW5Db2xvcnNbT1RIRVJdPQkJMDsKLQl0b2tlbkNvbG9yc1tOVU1CRVJdPQkwOwotfQotCi12b2lkIGRpc3Bvc2VDb2xvcnMoKSB7Ci0JZm9yIChpbnQgaT0wO2k8Y29sb3JzLmxlbmd0aDtpKyspIHsKLQkJY29sb3JzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLS8qKgotICogRXZlbnQuZGV0YWlsCQkJbGluZSBzdGFydCBvZmZzZXQgKGlucHV0KQkKLSAqIEV2ZW50LnRleHQgCQkJbGluZSB0ZXh0IChpbnB1dCkKLSAqIExpbmVTdHlsZUV2ZW50LnN0eWxlcyAJRW51bWVyYXRpb24gb2YgU3R5bGVSYW5nZXMsIG5lZWQgdG8gYmUgaW4gb3JkZXIuIChvdXRwdXQpCi0gKiBMaW5lU3R5bGVFdmVudC5iYWNrZ3JvdW5kIAlsaW5lIGJhY2tncm91bmQgY29sb3IgKG91dHB1dCkKLSAqLwotcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JVmVjdG9yIHN0eWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlpbnQgdG9rZW47Ci0JU3R5bGVSYW5nZSBsYXN0U3R5bGU7Ci0JLy8gSWYgdGhlIGxpbmUgaXMgcGFydCBvZiBhIGJsb2NrIGNvbW1lbnQsIGNyZWF0ZSBvbmUgc3R5bGUgZm9yIHRoZSBlbnRpcmUgbGluZS4KLQlpZiAoaW5CbG9ja0NvbW1lbnQoZXZlbnQubGluZU9mZnNldCwgZXZlbnQubGluZU9mZnNldCArIGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpKSkgewotCQlzdHlsZXMuYWRkRWxlbWVudChuZXcgU3R5bGVSYW5nZShldmVudC5saW5lT2Zmc2V0LCBldmVudC5saW5lVGV4dC5sZW5ndGgoKSwgZ2V0Q29sb3IoQ09NTUVOVCksIG51bGwpKTsKLQkJZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2Vbc3R5bGVzLnNpemUoKV07Ci0JCXN0eWxlcy5jb3B5SW50byhldmVudC5zdHlsZXMpOwotCQlyZXR1cm47Ci0JfQotCUNvbG9yIGRlZmF1bHRGZ0NvbG9yID0gKChDb250cm9sKWV2ZW50LndpZGdldCkuZ2V0Rm9yZWdyb3VuZCgpOwotCXNjYW5uZXIuc2V0UmFuZ2UoZXZlbnQubGluZVRleHQpOwotCXRva2VuID0gc2Nhbm5lci5uZXh0VG9rZW4oKTsKLQl3aGlsZSAodG9rZW4gIT0gRU9GKSB7Ci0JCWlmICh0b2tlbiA9PSBPVEhFUikgewotCQkJLy8gZG8gbm90aGluZyBmb3Igbm9uLWNvbG9yZWQgdG9rZW5zCi0JCX0gZWxzZSBpZiAodG9rZW4gIT0gV0hJVEUpIHsKLQkJCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3IodG9rZW4pOwotCQkJLy8gT25seSBjcmVhdGUgYSBzdHlsZSBpZiB0aGUgdG9rZW4gY29sb3IgaXMgZGlmZmVyZW50IHRoYW4gdGhlIAotCQkJLy8gd2lkZ2V0J3MgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0aGUgdG9rZW4ncyBzdHlsZSBpcyBub3QgCi0JCQkvLyBib2xkLiAgS2V5d29yZHMgYXJlIGJvbGRlZC4KLQkJCWlmICgoIWNvbG9yLmVxdWFscyhkZWZhdWx0RmdDb2xvcikpIHx8ICh0b2tlbiA9PSBLRVkpKSB7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKHNjYW5uZXIuZ2V0U3RhcnRPZmZzZXQoKSArIGV2ZW50LmxpbmVPZmZzZXQsIHNjYW5uZXIuZ2V0TGVuZ3RoKCksIGNvbG9yLCBudWxsKTsKLQkJCQlpZiAodG9rZW4gPT0gS0VZKSB7Ci0JCQkJCXN0eWxlLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVzLmlzRW1wdHkoKSkgewotCQkJCQlzdHlsZXMuYWRkRWxlbWVudChzdHlsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gTWVyZ2Ugc2ltaWxhciBzdHlsZXMuICBEb2luZyBzbyB3aWxsIGltcHJvdmUgcGVyZm9ybWFuY2UuCi0JCQkJCWxhc3RTdHlsZSA9IChTdHlsZVJhbmdlKXN0eWxlcy5sYXN0RWxlbWVudCgpOwotCQkJCQlpZiAobGFzdFN0eWxlLnNpbWlsYXJUbyhzdHlsZSkgJiYgKGxhc3RTdHlsZS5zdGFydCArIGxhc3RTdHlsZS5sZW5ndGggPT0gc3R5bGUuc3RhcnQpKSB7Ci0JCQkJCQlsYXN0U3R5bGUubGVuZ3RoICs9IHN0eWxlLmxlbmd0aDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlcy5hZGRFbGVtZW50KHN0eWxlKTsgCi0JCQkJCX0KLQkJCQl9IAotCQkJfSAKLQkJfSBlbHNlIGlmICgoIXN0eWxlcy5pc0VtcHR5KCkpICYmICgobGFzdFN0eWxlPShTdHlsZVJhbmdlKXN0eWxlcy5sYXN0RWxlbWVudCgpKS5mb250U3R5bGUgPT0gU1dULkJPTEQpKSB7Ci0JCQlpbnQgc3RhcnQgPSBzY2FubmVyLmdldFN0YXJ0T2Zmc2V0KCkgKyBldmVudC5saW5lT2Zmc2V0OwotCQkJbGFzdFN0eWxlID0gKFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkvLyBBIGZvbnQgc3R5bGUgb2YgU1dULkJPTEQgaW1wbGllcyB0aGF0IHRoZSBsYXN0IHN0eWxlCi0JCQkvLyByZXByZXNlbnRzIGEgamF2YSBrZXl3b3JkLgotCQkJaWYgKGxhc3RTdHlsZS5zdGFydCArIGxhc3RTdHlsZS5sZW5ndGggPT0gc3RhcnQpIHsKLQkJCQkvLyBIYXZlIHRoZSB3aGl0ZSBzcGFjZSB0YWtlIG9uIHRoZSBzdHlsZSBiZWZvcmUgaXQgdG8gCi0JCQkJLy8gbWluaW1pemUgdGhlIG51bWJlciBvZiBzdHlsZSByYW5nZXMgY3JlYXRlZCBhbmQgdGhlCi0JCQkJLy8gbnVtYmVyIG9mIGZvbnQgc3R5bGUgY2hhbmdlcyBkdXJpbmcgcmVuZGVyaW5nLgotCQkJCWxhc3RTdHlsZS5sZW5ndGggKz0gc2Nhbm5lci5nZXRMZW5ndGgoKTsKLQkJCX0KLQkJfSAKLQkJdG9rZW49IHNjYW5uZXIubmV4dFRva2VuKCk7Ci0JfQotCWV2ZW50LnN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW3N0eWxlcy5zaXplKCldOwotCXN0eWxlcy5jb3B5SW50byhldmVudC5zdHlsZXMpOwotfQotcHVibGljIHZvaWQgcGFyc2VCbG9ja0NvbW1lbnRzKFN0cmluZyB0ZXh0KSB7Ci0JYmxvY2tDb21tZW50cyA9IG5ldyBWZWN0b3IoKTsKLQlTdHJpbmdSZWFkZXIgYnVmZmVyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXh0KTsKLQlpbnQgY2g7Ci0JYm9vbGVhbiBibGtDb21tZW50ID0gZmFsc2U7Ci0JaW50IGNudCA9IDA7Ci0JaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbMl07Ci0JYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQl3aGlsZSAoIWRvbmUpIHsKLQkJc3dpdGNoIChjaCA9IGJ1ZmZlci5yZWFkKCkpIHsKLQkJCWNhc2UgLTEgOiB7Ci0JCQkJaWYgKGJsa0NvbW1lbnQpIHsKLQkJCQkJb2Zmc2V0c1sxXSA9IGNudDsKLQkJCQkJYmxvY2tDb21tZW50cy5hZGRFbGVtZW50KG9mZnNldHMpOwotCQkJCX0KLQkJCQlkb25lID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgJy8nIDogewotCQkJCWNoID0gYnVmZmVyLnJlYWQoKTsKLQkJCQlpZiAoKGNoID09ICcqJykgJiYgKCFibGtDb21tZW50KSkgewotCQkJCQlvZmZzZXRzID0gbmV3IGludFsyXTsKLQkJCQkJb2Zmc2V0c1swXSA9IGNudDsKLQkJCQkJYmxrQ29tbWVudCA9IHRydWU7Ci0JCQkJCWNudCsrOwkKLQkJCQl9IGVsc2UgewotCQkJCQljbnQrKzsKLQkJCQl9CQkJCQkJCi0JCQkJY250Kys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlICcqJyA6IHsKLQkJCQlpZiAoYmxrQ29tbWVudCkgewotCQkJCQljaCA9IGJ1ZmZlci5yZWFkKCk7Ci0JCQkJCWNudCsrOwotCQkJCQlpZiAoY2ggPT0gJy8nKSB7Ci0JCQkJCQlibGtDb21tZW50ID0gZmFsc2U7CQotCQkJCQkJb2Zmc2V0c1sxXSA9IGNudDsKLQkJCQkJCWJsb2NrQ29tbWVudHMuYWRkRWxlbWVudChvZmZzZXRzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljbnQrKzsJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWNudCsrOwkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0JCQotCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkvLyBpZ25vcmUgZXJyb3JzCi0JfQotfQotCi0vKioKLSAqIEEgc2ltcGxlIGZ1enp5IHNjYW5uZXIgZm9yIEphdmEKLSAqLwotcHVibGljIGNsYXNzIEphdmFTY2FubmVyIHsKLQotCXByb3RlY3RlZCBIYXNodGFibGUgZmdLZXlzPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZkJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXByb3RlY3RlZCBTdHJpbmcgZkRvYzsKLQlwcm90ZWN0ZWQgaW50IGZQb3M7Ci0JcHJvdGVjdGVkIGludCBmRW5kOwotCXByb3RlY3RlZCBpbnQgZlN0YXJ0VG9rZW47Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkVvZlNlZW49IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBmZ0tleXdvcmRzPSB7IAotCQkiYWJzdHJhY3QiLAotCQkiYm9vbGVhbiIsICJicmVhayIsICJieXRlIiwKLQkJImNhc2UiLCAiY2F0Y2giLCAiY2hhciIsICJjbGFzcyIsICJjb250aW51ZSIsCi0JCSJkZWZhdWx0IiwgImRvIiwgImRvdWJsZSIsCi0JCSJlbHNlIiwgImV4dGVuZHMiLAotCQkiZmFsc2UiLCAiZmluYWwiLCAiZmluYWxseSIsICJmbG9hdCIsICJmb3IiLAotCQkiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW5zdGFuY2VvZiIsICJpbnQiLCAiaW50ZXJmYWNlIiwKLQkJImxvbmciLAotCQkibmF0aXZlIiwgIm5ldyIsICJudWxsIiwKLQkJInBhY2thZ2UiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwKLQkJInJldHVybiIsCi0JCSJzaG9ydCIsICJzdGF0aWMiLCAic3VwZXIiLCAic3dpdGNoIiwgInN5bmNocm9uaXplZCIsCi0JCSJ0aGlzIiwgInRocm93IiwgInRocm93cyIsICJ0cmFuc2llbnQiLCAidHJ1ZSIsICJ0cnkiLAotCQkidm9pZCIsICJ2b2xhdGlsZSIsCi0JCSJ3aGlsZSIKLQl9OwotCi0JcHVibGljIEphdmFTY2FubmVyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuIGluIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZQb3MgLSBmU3RhcnRUb2tlbjsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBsb29rdXAgdGFibGUuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKCkgewotCQlmZ0tleXM9IG5ldyBIYXNodGFibGUoKTsKLQkJSW50ZWdlciBrPSBuZXcgSW50ZWdlcihLRVkpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZmdLZXl3b3Jkcy5sZW5ndGg7IGkrKykKLQkJCWZnS2V5cy5wdXQoZmdLZXl3b3Jkc1tpXSwgayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmU3RhcnRUb2tlbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IGxleGljYWwgdG9rZW4gaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgbmV4dFRva2VuKCkgewotCQlpbnQgYzsKLQkJZlN0YXJ0VG9rZW49IGZQb3M7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlzd2l0Y2ggKGM9IHJlYWQoKSkgewkJCQotCQkJY2FzZSBFT0Y6Ci0JCQkJcmV0dXJuIEVPRjsJCQkJCi0JCQljYXNlICcvJzoJLy8gY29tbWVudAotCQkJCWM9IHJlYWQoKTsKLQkJCQlpZiAoYyA9PSAnLycpIHsKLQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJCWlmICgoYyA9PSBFT0YpIHx8IChjID09IEVPTCkpIHsKLQkJCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCQkJcmV0dXJuIENPTU1FTlQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl1bnJlYWQoYyk7Ci0JCQkJfQotCQkJCXJldHVybiBPVEhFUjsKLQkJCWNhc2UgJ1wnJzoJLy8gY2hhciBjb25zdAotCQkJCWNoYXJhY3RlcjogZm9yKDs7KSB7Ci0JCQkJCWM9IHJlYWQoKTsKLQkJCQkJc3dpdGNoIChjKSB7Ci0JCQkJCQljYXNlICdcJyc6Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgRU9GOgotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJCQkJY2FzZSAnXFwnOgotCQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCWNhc2UgJyInOgkvLyBzdHJpbmcKLQkJCQlzdHJpbmc6IGZvciAoOzspIHsKLQkJCQkJYz0gcmVhZCgpOwotCQkJCQlzd2l0Y2ggKGMpIHsKLQkJCQkJCWNhc2UgJyInOgotCQkJCQkJCXJldHVybiBTVFJJTkc7Ci0JCQkJCQljYXNlIEVPRjoKLQkJCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgJ1xcJzoKLQkJCQkJCQljPSByZWFkKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJfQotCi0JCQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JCQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JCQkJZG8gewotCQkJCQljPSByZWFkKCk7Ci0JCQkJfSB3aGlsZShDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljKSk7Ci0JCQkJdW5yZWFkKGMpOwotCQkJCXJldHVybiBOVU1CRVI7Ci0JCQlkZWZhdWx0OgotCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWMpKSB7Ci0JCQkJCWRvIHsKLQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJfSB3aGlsZShDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWMpKTsKLQkJCQkJdW5yZWFkKGMpOwotCQkJCQlyZXR1cm4gV0hJVEU7Ci0JCQkJfQotCQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KChjaGFyKWMpKSB7Ci0JCQkJCWZCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQkJCQlkbyB7Ci0JCQkJCQlmQnVmZmVyLmFwcGVuZCgoY2hhciljKTsKLQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJfSB3aGlsZShDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoKGNoYXIpYykpOwotCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCUludGVnZXIgaT0gKEludGVnZXIpIGZnS2V5cy5nZXQoZkJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQkJaWYgKGkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBpLmludFZhbHVlKCk7Ci0JCQkJCQlyZXR1cm4gV09SRDsKLQkJCQl9Ci0JCQkJcmV0dXJuIE9USEVSOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBuZXh0IGNoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJlYWQoKSB7Ci0JCWlmIChmUG9zIDw9IGZFbmQpIHsKLQkJCXJldHVybiBmRG9jLmNoYXJBdChmUG9zKyspOwotCQl9Ci0JCXJldHVybiBFT0Y7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmFuZ2UoU3RyaW5nIHRleHQpIHsKLQkJZkRvYz0gdGV4dDsKLQkJZlBvcz0gMDsKLQkJZkVuZD0gZkRvYy5sZW5ndGgoKSAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bnJlYWQoaW50IGMpIHsKLQkJaWYgKGMgIT0gRU9GKQotCSAgICAJZlBvcy0tOwotCX0KLX0KLQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFWaWV3ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGY4YWJiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuamF2YXZpZXdlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVZpZXdlciB7ICAKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHRleHQ7Ci0JSmF2YUxpbmVTdHlsZXIgbGluZVN0eWxlciA9IG5ldyBKYXZhTGluZVN0eWxlcigpOwotCUZpbGVEaWFsb2cgZmlsZURpYWxvZzsKLQlzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VzID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19qYXZhdmlld2VyIik7Ci0KLU1lbnUgY3JlYXRlRmlsZU1lbnUoKSB7Ci0JTWVudSBiYXIgPSBzaGVsbC5nZXRNZW51QmFyICgpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChiYXIpOwotCU1lbnVJdGVtIGl0ZW07Ci0KLQkvLyBPcGVuIAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIk9wZW5fbWVudWl0ZW0iKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdPJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCW9wZW5GaWxlKCk7Ci0JCX0KLQl9KTsKLQotCS8vIEV4aXQKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFeGl0X21lbnVpdGVtIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCW1lbnVGaWxlRXhpdCAoKTsKLQkJfQotCX0pOwotCXJldHVybiBtZW51OwotfQotCi12b2lkIGNyZWF0ZU1lbnVCYXIgKCkgewotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCi0JTWVudUl0ZW0gZmlsZUl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCWZpbGVJdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkZpbGVfbWVudWl0ZW0iKSk7Ci0JZmlsZUl0ZW0uc2V0TWVudSAoY3JlYXRlRmlsZU1lbnUgKCkpOwotCi19Ci0KLXZvaWQgY3JlYXRlU2hlbGwgKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJXaW5kb3dfdGl0bGUiKSk7CQotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0Jc2hlbGwuYWRkU2hlbGxMaXN0ZW5lciAobmV3IFNoZWxsQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkIChTaGVsbEV2ZW50IGUpIHsKLQkJCWxpbmVTdHlsZXIuZGlzcG9zZUNvbG9ycygpOwotCQkJdGV4dC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihsaW5lU3R5bGVyKTsKLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVTdHlsZWRUZXh0KCkgewotCXRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCXRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobGluZVN0eWxlcik7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JQ29sb3IgYmcgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JdGV4dC5zZXRCYWNrZ3JvdW5kKGJnKTsKLX0KLQotdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIG1zZykgewotCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQlib3guc2V0TWVzc2FnZShtc2cpOwotCWJveC5vcGVuKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSmF2YVZpZXdlciBleGFtcGxlID0gbmV3IEphdmFWaWV3ZXIgKCk7Ci0JU2hlbGwgc2hlbGwgPSBleGFtcGxlLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQljcmVhdGVTaGVsbCAoZGlzcGxheSk7Ci0JY3JlYXRlTWVudUJhciAoKTsKLQljcmVhdGVTdHlsZWRUZXh0ICgpOwotCXNoZWxsLnNldFNpemUoNTAwLCA0MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotCi12b2lkIG9wZW5GaWxlKCkgewkKLQlpZiAoZmlsZURpYWxvZyA9PSBudWxsKSB7Ci0JCWZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCX0KLQotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmphdmEiLCAiKi4qIn0pOwotCVN0cmluZyBuYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0JCi0Jb3BlbihuYW1lKTsKLX0KLQotdm9pZCBvcGVuKFN0cmluZyBuYW1lKSB7Ci0JZmluYWwgU3RyaW5nIHRleHRTdHJpbmc7Ci0JCi0JaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSByZXR1cm47Ci0KLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFcnJfZmlsZV9ub19leGlzdCIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCWRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJcmV0dXJuOwotCX0KLQotCXRyeSB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZS5nZXRQYXRoKCkpOwotCQl0cnkgewotCQkJUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQkJCWNoYXJbXSByZWFkQnVmZmVyPSBuZXcgY2hhclsyMDQ4XTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKGludCkgZmlsZS5sZW5ndGgoKSk7Ci0JCQlpbnQgbjsKLQkJCXdoaWxlICgobiA9IGluLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQl9Ci0JCQl0ZXh0U3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gRXJyX2ZpbGVfaW8KLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzb3VyY2VzLmdldFN0cmluZygiRXJyX2ZpbGVfaW8iKSwgbmV3IFN0cmluZ1tdIHtmaWxlLmdldE5hbWUoKX0pOwotCQkJZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJlc291cmNlcy5nZXRTdHJpbmcoIkVycl9ub3RfZm91bmQiKSwgbmV3IFN0cmluZ1tdIHtmaWxlLmdldE5hbWUoKX0pOwotCQlkaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JCXJldHVybjsKLQl9Ci0JLy8gR3VhcmQgYWdhaW5zdCBzdXBlcmZsdW91cyBtb3VzZSBtb3ZlIGV2ZW50cyAtLSBkZWZlciBhY3Rpb24gdW50aWwgbGF0ZXIKLQlEaXNwbGF5IGRpc3BsYXkgPSB0ZXh0LmdldERpc3BsYXkoKTsKLQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkJfQotCX0pOwkKLQkKLQkvLyBwYXJzZSB0aGUgYmxvY2sgY29tbWVudHMgdXAgZnJvbnQgc2luY2UgYmxvY2sgY29tbWVudHMgY2FuIGdvIGFjcm9zcwotCS8vIGxpbmVzIC0gaW5lZmZpY2llbnQgd2F5IG9mIGRvaW5nIHRoaXMKLQlsaW5lU3R5bGVyLnBhcnNlQmxvY2tDb21tZW50cyh0ZXh0U3RyaW5nKTsKLX0KLQotdm9pZCBtZW51RmlsZUV4aXQgKCkgewotCXNoZWxsLmNsb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9GaWxsTGF5b3V0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0ZpbGxMYXlvdXRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YjA2NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0ZpbGxMYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEZpbGxMYXlvdXRUYWIgZXh0ZW5kcyBUYWIgewotCS8qIENvbnRyb2xzIGZvciBzZXR0aW5nIGxheW91dCBwYXJhbWV0ZXJzICovCi0JQnV0dG9uIGhvcml6b250YWwsIHZlcnRpY2FsOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCUZpbGxMYXlvdXQgZmlsbExheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlGaWxsTGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB3aWRnZXRzIGluIHRoZSAiY2hpbGQiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRXaWRnZXRzICgpIHsKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDaGlsZFdpZGdldHMgKCk7Ci0JCQotCQkvKiBBZGQgVGFibGVFZGl0b3JzICovCi0JCWNvbWJvRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQkJCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCQkJbmV3SXRlbSA9IHRhYmxlLmdldEl0ZW0gKGluZGV4KTsKLQkJCQlpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkKLQkJLyogQWRkIGxpc3RlbmVyIHRvIGFkZCBhbiBlbGVtZW50IHRvIHRoZSB0YWJsZSAqLwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoMCwgU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmluZGV4T2YgKGl0ZW0pKSk7Ci0JCQkJaXRlbS5zZXRUZXh0ICgxLCAiQnV0dG9uIik7Ci0JCQkJZGF0YS5hZGRFbGVtZW50ICgiQnV0dG9uIik7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDb250cm9scyB0aGUgdHlwZSBvZiBGaWxsTGF5b3V0ICovCi0JCUdyb3VwIHR5cGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXR5cGVHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiVHlwZSIpKTsKLQkJdHlwZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJaG9yaXpvbnRhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbC5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWhvcml6b250YWwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZlcnRpY2FsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbC5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCXZlcnRpY2FsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsgCi0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2ggKi8KLQkJc2FzaC5zZXRXZWlnaHRzIChuZXcgaW50IFtdIHs0LDF9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCQlmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKGZpbGxMYXlvdXQpOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCX0KLQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0RmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKCk7XG4iKTsKLQkJaWYgKGZpbGxMYXlvdXQudHlwZSA9PSBTV1QuVkVSVElDQUwpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAoZmlsbExheW91dCk7XG4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZSAoY29udHJvbCwgaSkpOwotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YSBmaWVsZCBuYW1lcy4KLQkgKi8KLQlTdHJpbmcgW10gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiIiwiQ29udHJvbCJ9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJGaWxsTGF5b3V0IjsKLQl9Ci0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoKSB7Ci0JCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCWRhdGEuaW5zZXJ0RWxlbWVudEF0IChjb21iby5nZXRUZXh0ICgpLCByb3cpOwotCQkJb2xkSXRlbS5zZXRUZXh0ICgxLCBkYXRhLmVsZW1lbnRBdCAocm93KS50b1N0cmluZyAoKSk7Ci0JCQljb21iby5kaXNwb3NlICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwotCQlyZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpOwotCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dFN0YXRlICgpIHsKLQkJaWYgKHZlcnRpY2FsLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlmaWxsTGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxsTGF5b3V0LnR5cGUgPSBTV1QuSE9SSVpPTlRBTDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRm9ybUxheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Gb3JtTGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmQzYWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Gb3JtTGF5b3V0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1jbGFzcyBGb3JtTGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCUNvbWJvIG1hcmdpbkhlaWdodCwgbWFyZ2luV2lkdGg7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JRm9ybUxheW91dCBmb3JtTGF5b3V0OwotCS8qIFRhYmxlRWRpdG9ycyBhbmQgcmVsYXRlZCBjb250cm9scyovCi0JVGFibGVFZGl0b3IgY29tYm9FZGl0b3IsIHdpZHRoRWRpdG9yLCBoZWlnaHRFZGl0b3I7Ci0JVGFibGVFZGl0b3IgbGVmdEVkaXRvciwgcmlnaHRFZGl0b3IsIHRvcEVkaXRvciwgYm90dG9tRWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQlUZXh0IHdpZHRoVGV4dCwgaGVpZ2h0VGV4dDsKLQlCdXR0b24gbGVmdEF0dGFjaCwgcmlnaHRBdHRhY2gsIHRvcEF0dGFjaCwgYm90dG9tQXR0YWNoOwotCQotCS8qIENvbnN0YW50cyAqLwotCWZpbmFsIGludCBDT01CT19DT0wgPSAxOwotCWZpbmFsIGludCBXSURUSF9DT0wgPSAyOwotCWZpbmFsIGludCBIRUlHSFRfQ09MID0gMzsKLQlmaW5hbCBpbnQgTEVGVF9DT0wgPSA0OwotCWZpbmFsIGludCBSSUdIVF9DT0wgPSA1OwotCWZpbmFsIGludCBUT1BfQ09MID0gNjsKLQlmaW5hbCBpbnQgQk9UVE9NX0NPTCA9IDc7Ci0JCi0JZmluYWwgaW50IE1PRElGWV9DT0xTID0gNDsJLy8gVGhlIG51bWJlciBvZiBjb2x1bW5zIHdpdGggY29tYm8gb3IgdGV4dCBlZGl0b3JzCi0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSA4OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIExheW91dEV4YW1wbGUuCi0JICovCi0JRm9ybUxheW91dFRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uc3RhbnQgZm9yIHRoZSBhbGlnbm1lbnQgZm9yIGFuCi0JICogYXR0YWNobWVudCBnaXZlbiBhIHN0cmluZy4KLQkgKi8KLQlpbnQgYWxpZ25tZW50Q29uc3RhbnQgKFN0cmluZyBhbGlnbikgewotCQlpZiAoYWxpZ24uZXF1YWxzKCJMRUZUIikpIHJldHVybiBTV1QuTEVGVDsKLQkJaWYgKGFsaWduLmVxdWFscygiUklHSFQiKSkgcmV0dXJuIFNXVC5SSUdIVDsKLQkJaWYgKGFsaWduLmVxdWFscygiVE9QIikpIHJldHVybiBTV1QuVE9QOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJCT1RUT00iKSkgcmV0dXJuIFNXVC5CT1RUT007Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkNFTlRFUiIpKSByZXR1cm4gU1dULkNFTlRFUjsKLQkJcmV0dXJuIFNXVC5ERUZBVUxUOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYWxpZ25tZW50IGZvciBhbgotCSAqIGF0dGFjaG1lbnQgZ2l2ZW4gYSBjb25zdGFudC4KLQkgKi8KLQlTdHJpbmcgYWxpZ25tZW50U3RyaW5nIChpbnQgYWxpZ24pIHsKLQkJc3dpdGNoIChhbGlnbikgewotCQkJY2FzZSBTV1QuTEVGVDogcmV0dXJuICJMRUZUIjsKLQkJCWNhc2UgU1dULlJJR0hUOiByZXR1cm4gIlJJR0hUIjsKLQkJCWNhc2UgU1dULlRPUDogcmV0dXJuICJUT1AiOwotCQkJY2FzZSBTV1QuQk9UVE9NOiByZXR1cm4gIkJPVFRPTSI7Ci0JCQljYXNlIFNXVC5DRU5URVI6IHJldHVybiAiQ0VOVEVSIjsKLQkJfQotCQlyZXR1cm4gIkRFRkFVTFQiOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGF0dGFjaG1lbnQgZmllbGQgaW4gY2FzZSB0aGUgdHlwZSBvZiBjb250cm9sCi0JICogaGFzIGNoYW5nZWQuIAotCSAqLwotCVN0cmluZyBjaGVja0F0dGFjaG1lbnQgKFN0cmluZyBvbGRBdHRhY2gsIEZvcm1BdHRhY2htZW50IG5ld0F0dGFjaCkgewotCQlTdHJpbmcgY29udHJvbENsYXNzID0gbmV3QXR0YWNoLmNvbnRyb2wuZ2V0Q2xhc3MoKS50b1N0cmluZyAoKTsKLQkJU3RyaW5nIGNvbnRyb2xUeXBlID0gY29udHJvbENsYXNzLnN1YnN0cmluZyAoY29udHJvbENsYXNzLmxhc3RJbmRleE9mICgnLicpICsgMSk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBvbGRBdHRhY2gubGVuZ3RoICgpICYmICFDaGFyYWN0ZXIuaXNEaWdpdChvbGRBdHRhY2guY2hhckF0IChpKSkpIHsKLQkJCWkrKzsKLQkJfQotCQlTdHJpbmcgaW5kZXggPSBvbGRBdHRhY2guc3Vic3RyaW5nIChpLCBvbGRBdHRhY2guaW5kZXhPZiAoJywnKSk7Ci0JCXJldHVybiBjb250cm9sVHlwZSArIGluZGV4ICsgIiwiICsgbmV3QXR0YWNoLm9mZnNldCArICI6IiArIGFsaWdubWVudFN0cmluZyAobmV3QXR0YWNoLmFsaWdubWVudCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIFJlc2l6ZSB0aGUgY29sdW1ucyAqLwotCQl0YWJsZS5nZXRDb2x1bW4gKExFRlRfQ09MKS5zZXRXaWR0aCAoMTAwKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChSSUdIVF9DT0wpLnNldFdpZHRoICgxMDApOwotCQl0YWJsZS5nZXRDb2x1bW4gKFRPUF9DT0wpLnNldFdpZHRoICgxMDApOwotCQl0YWJsZS5nZXRDb2x1bW4gKEJPVFRPTV9DT0wpLnNldFdpZHRoICgxMDApOwotCQkJCQotCQkvKiBBZGQgVGFibGVFZGl0b3JzICovCQkJCi0JCWNvbWJvRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXdpZHRoRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhlaWdodEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlsZWZ0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXJpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRvcEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlib3R0b21FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQl3aWR0aFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCXdpZHRoVGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbV0lEVEhfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAod2lkdGhUZXh0LCB3aWR0aEVkaXRvciwgV0lEVEhfQ09MKTsKLQkJCQkKLQkJCQloZWlnaHRUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtIRUlHSFRfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAoaGVpZ2h0VGV4dCwgaGVpZ2h0RWRpdG9yLCBIRUlHSFRfQ09MKTsKLQkJCQkKLQkJCQlsZWZ0QXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlsZWZ0QXR0YWNoLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBdHRhY2hfRWRpdCIpKTsKLQkJCQlsZWZ0RWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQlsZWZ0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlsZWZ0RWRpdG9yLm1pbmltdW1XaWR0aCA9IGxlZnRBdHRhY2guY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJCQlsZWZ0RWRpdG9yLnNldEVkaXRvciAobGVmdEF0dGFjaCwgbmV3SXRlbSwgTEVGVF9DT0wpOwotCQkJCWxlZnRBdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkxlZnRfQXR0YWNobWVudCIpKTsKLQkJCQkJCWRpYWxvZy5zZXRDb2x1bW4gKExFRlRfQ09MKTsKLQkJCQkJCVN0cmluZyBhdHRhY2ggPSBkaWFsb2cub3BlbiAoKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCAoTEVGVF9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQlyaWdodEF0dGFjaCA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJcmlnaHRBdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCXJpZ2h0RWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQlyaWdodEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJcmlnaHRFZGl0b3IubWluaW11bVdpZHRoID0gcmlnaHRBdHRhY2guY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJCQlyaWdodEVkaXRvci5zZXRFZGl0b3IgKHJpZ2h0QXR0YWNoLCBuZXdJdGVtLCBSSUdIVF9DT0wpOwotCQkJCXJpZ2h0QXR0YWNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCk7Ci0JCQkJCQlBdHRhY2hEaWFsb2cgZGlhbG9nID0gbmV3IEF0dGFjaERpYWxvZyAoc2hlbGwpOwotCQkJCQkJZGlhbG9nLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJSaWdodF9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoUklHSFRfQ09MKTsKLQkJCQkJCVN0cmluZyBhdHRhY2ggPSBkaWFsb2cub3BlbiAoKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCAoUklHSFRfQ09MLCBhdHRhY2gpOwotCQkJCQkJaWYgKG5ld0l0ZW0uZ2V0VGV4dCAoTEVGVF9DT0wpLmVuZHNXaXRoICgiKSIpKSBuZXdJdGVtLnNldFRleHQgKExFRlRfQ09MLCAiIik7Ci0JCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQl0b3BBdHRhY2ggPSBuZXcgQnV0dG9uICh0YWJsZSwgU1dULlBVU0gpOwotCQkJCXRvcEF0dGFjaC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQXR0YWNoX0VkaXQiKSk7Ci0JCQkJdG9wRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQl0b3BFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCXRvcEVkaXRvci5taW5pbXVtV2lkdGggPSB0b3BBdHRhY2guY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJCQl0b3BFZGl0b3Iuc2V0RWRpdG9yICh0b3BBdHRhY2gsIG5ld0l0ZW0sIFRPUF9DT0wpOwotCQkJCXRvcEF0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJCQkJQXR0YWNoRGlhbG9nIGRpYWxvZyA9IG5ldyBBdHRhY2hEaWFsb2cgKHNoZWxsKTsKLQkJCQkJCWRpYWxvZy5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiVG9wX0F0dGFjaG1lbnQiKSk7Ci0JCQkJCQlkaWFsb2cuc2V0Q29sdW1uIChUT1BfQ09MKTsKLQkJCQkJCVN0cmluZyBhdHRhY2ggPSBkaWFsb2cub3BlbiAoKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCAoVE9QX0NPTCwgYXR0YWNoKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJvdHRvbUF0dGFjaCA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJYm90dG9tQXR0YWNoLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBdHRhY2hfRWRpdCIpKTsKLQkJCQlib3R0b21FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWJvdHRvbUVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJYm90dG9tRWRpdG9yLm1pbmltdW1XaWR0aCA9IGJvdHRvbUF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWJvdHRvbUVkaXRvci5zZXRFZGl0b3IgKGJvdHRvbUF0dGFjaCwgbmV3SXRlbSwgQk9UVE9NX0NPTCk7Ci0JCQkJYm90dG9tQXR0YWNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCk7Ci0JCQkJCQlBdHRhY2hEaWFsb2cgZGlhbG9nID0gbmV3IEF0dGFjaERpYWxvZyAoc2hlbGwpOwotCQkJCQkJZGlhbG9nLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCb3R0b21fQXR0YWNobWVudCIpKTsKLQkJCQkJCWRpYWxvZy5zZXRDb2x1bW4gKEJPVFRPTV9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChCT1RUT01fQ09MLCBhdHRhY2gpOwotCQkJCQkJaWYgKG5ld0l0ZW0uZ2V0VGV4dCAoVE9QX0NPTCkuZW5kc1dpdGggKCIpIikpIG5ld0l0ZW0uc2V0VGV4dCAoVE9QX0NPTCwgIiIpOwotCQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAJUmVjdGFuZ2xlIHJlY3QgPSBuZXdJdGVtLmdldEJvdW5kcyAoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zIChwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCXN3aXRjaCAoaSkgewotICAgICAgICAgICAgICAgICAgICAJCWNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgCQkJcmVzZXRFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgICAgICAJCQlicmVhazsKLQkJCQkJCQljYXNlIENPTUJPX0NPTCA6Ci0JCQkJCQkJCWNvbWJvLnNldEZvY3VzICgpOwkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBXSURUSF9DT0wgOgkKLQkJCQkJCQkJd2lkdGhUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhFSUdIVF9DT0wgOgotCQkJCQkJCQloZWlnaHRUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQkJCi0JCS8qIEFkZCBsaXN0ZW5lciB0byBhZGQgYW4gZWxlbWVudCB0byB0aGUgdGFibGUgKi8KLQkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7Ci0JCQkJCVN0cmluZy52YWx1ZU9mICh0YWJsZS5pbmRleE9mIChpdGVtKSksICJCdXR0b24iLCAiLTEiLCAiLTEiLAotCQkJCQkiMCwwICgiICsgTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlZmF1bHQiKSArICIpIiwgIiIsIAotCQkJCQkiMCwwICgiICsgTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlZmF1bHQiKSArICIpIiwgIiJ9OwotCQkJCWl0ZW0uc2V0VGV4dCAoaW5zZXJ0KTsKLQkJCQlkYXRhLmFkZEVsZW1lbnQgKGluc2VydCk7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nIG9mIHRoZSBGb3JtTGF5b3V0ICovCi0JCVN0cmluZyBbXSBtYXJnaW5WYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiMCIsIjMiLCI1IiwiMTAifTsKLQkJR3JvdXAgbWFyZ2luR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5Hcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTWFyZ2lucyIpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luSGVpZ2h0LnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5IZWlnaHQuc2VsZWN0ICgwKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW1hcmdpbkhlaWdodC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luSGVpZ2h0LnNldExheW91dERhdGEgKGRhdGEpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpbldpZHRoIik7Ci0JCW1hcmdpbldpZHRoID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5XaWR0aC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luV2lkdGguc2VsZWN0ICgwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luV2lkdGguYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCW1hcmdpbldpZHRoLnNldExheW91dERhdGEgKGRhdGEpOwotCQkKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIFBvc2l0aW9uIHRoZSBzYXNoICovCi0JCXNhc2guc2V0V2VpZ2h0cyAobmV3IGludCBbXSB7Niw0fSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0IChmb3JtTGF5b3V0KTsKLQl9Ci0JCi0JLyoqIAotCSAqIERpc3Bvc2VzIHRoZSBlZGl0b3JzIHdpdGhvdXQgcGxhY2luZyB0aGVpciBjb250ZW50cwotCSAqIGludG8gdGhlIHRhYmxlLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSAoKTsKLQkJd2lkdGhUZXh0LmRpc3Bvc2UgKCk7Ci0JCWhlaWdodFRleHQuZGlzcG9zZSAoKTsKLQkJbGVmdEF0dGFjaC5kaXNwb3NlICgpOwotCQlyaWdodEF0dGFjaC5kaXNwb3NlICgpOwotCQl0b3BBdHRhY2guZGlzcG9zZSAoKTsKLQkJYm90dG9tQXR0YWNoLmRpc3Bvc2UgKCk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8JCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0Rm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7XG4iKTsKLQkJaWYgKGZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gIiArIGZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChmb3JtTGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSAiICsgZm9ybUxheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQljb2RlLmFwcGVuZCAoIlx0XHRzaGVsbC5zZXRMYXlvdXQgKGZvcm1MYXlvdXQpO1xuIik7Ci0JCQotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZSAoY29udHJvbCwgaSkpOwotCQkJRm9ybURhdGEgZGF0YSA9IChGb3JtRGF0YSkgY29udHJvbC5nZXRMYXlvdXREYXRhICgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIpOwotCQkJCWlmIChmaXJzdCkgewotCQkJCQljb2RlLmFwcGVuZCAoIkZvcm1EYXRhICIpOwotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQljb2RlLmFwcGVuZCAoImRhdGEgPSBuZXcgRm9ybURhdGEgKCk7XG4iKTsJCi0JCQkJaWYgKGRhdGEud2lkdGggIT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS53aWR0aCA9ICIgKyBkYXRhLndpZHRoICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5oZWlnaHQgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5oZWlnaHQgPSAiICsgZGF0YS5oZWlnaHQgKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmxlZnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS5sZWZ0LmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpKTsKLQkJCQkJCVN0cmluZyBjb250cm9sU3RyaW5nID0gaXRlbS5nZXRUZXh0IChMRUZUX0NPTCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBuZXcgSW50ZWdlciAoY29udHJvbFN0cmluZy5zdWJzdHJpbmcgKGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSAtIDEsIGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSkpLmludFZhbHVlICgpOwotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLmxlZnQub2Zmc2V0ICsgIiwgU1dULiIgKyBhbGlnbm1lbnRTdHJpbmcgKGRhdGEubGVmdC5hbGlnbm1lbnQpICsgIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChkYXRhLnJpZ2h0ICE9IG51bGwgfHwgKGRhdGEubGVmdC5udW1lcmF0b3IgIT0gMCB8fGRhdGEubGVmdC5vZmZzZXQgIT0gMCkpIHsKLQkJCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBkYXRhLmxlZnQubnVtZXJhdG9yICsgIiwgIiArIGRhdGEubGVmdC5vZmZzZXQgKyAiKTtcbiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLnJpZ2h0ICE9IG51bGwpIHsKLQkJCQkJaWYgKGRhdGEucmlnaHQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKFJJR0hUX0NPTCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBuZXcgSW50ZWdlciAoY29udHJvbFN0cmluZy5zdWJzdHJpbmcgKGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSAtIDEsIGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSkpLmludFZhbHVlICgpOwotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIG5hbWVzIFtpbmRleF0gKyAiLCAiICsgZGF0YS5yaWdodC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS5yaWdodC5hbGlnbm1lbnQpICsgIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBkYXRhLnJpZ2h0Lm51bWVyYXRvciArICIsICIgKyBkYXRhLnJpZ2h0Lm9mZnNldCArICIpO1xuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRhdGEudG9wICE9IG51bGwpIHsKLQkJCQkJaWYgKGRhdGEudG9wLmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpKTsKLQkJCQkJCVN0cmluZyBjb250cm9sU3RyaW5nID0gaXRlbS5nZXRUZXh0IChUT1BfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIG5hbWVzIFtpbmRleF0gKyAiLCAiICsgZGF0YS50b3Aub2Zmc2V0ICsgIiwgU1dULiIgKyBhbGlnbm1lbnRTdHJpbmcgKGRhdGEudG9wLmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGRhdGEuYm90dG9tICE9IG51bGwgfHwgKGRhdGEudG9wLm51bWVyYXRvciAhPSAwIHx8ZGF0YS50b3Aub2Zmc2V0ICE9IDApKSB7Ci0JCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBkYXRhLnRvcC5udW1lcmF0b3IgKyAiLCAiICsgZGF0YS50b3Aub2Zmc2V0ICsgIik7XG4iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGF0YS5ib3R0b20gIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS5ib3R0b20uY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKEJPVFRPTV9DT0wpOwotCQkJCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGNvbnRyb2xTdHJpbmcuc3Vic3RyaW5nIChjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykgLSAxLCBjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykpKS5pbnRWYWx1ZSAoKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLmJvdHRvbS5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS5ib3R0b20uYWxpZ25tZW50KSArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEuYm90dG9tLm51bWVyYXRvciArICIsICIgKyBkYXRhLmJvdHRvbS5vZmZzZXQgKyAiKTtcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldExheW91dERhdGEgKGRhdGEpO1xuIik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJIiIsCi0JCQkiQ29udHJvbCIsIAotCQkJIndpZHRoIiwgCi0JCQkiaGVpZ2h0IiwgCi0JCQkibGVmdCIsIAotCQkJInJpZ2h0IiwgCi0JCQkidG9wIiwgCi0JCQkiYm90dG9tIgotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJGb3JtTGF5b3V0IjsKLQl9Ci0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoKSB7Ci0JCXJlc2V0RWRpdG9ycyAoZmFsc2UpOwotCX0KLQkKLQl2b2lkIHJlc2V0RWRpdG9ycyAoYm9vbGVhbiB0YWIpIHsKLQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQlpZiAob2xkSXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgcm93ID0gdGFibGUuaW5kZXhPZiAob2xkSXRlbSk7Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyICh3aWR0aFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFdJRFRIX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaGVpZ2h0VGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHtTdHJpbmcudmFsdWVPZiAocm93KSwgY29tYm8uZ2V0VGV4dCAoKSwgd2lkdGhUZXh0LmdldFRleHQgKCksIGhlaWdodFRleHQuZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgTU9ESUZZX0NPTFM7IGkrKykgewotCQkJCW9sZEl0ZW0uc2V0VGV4dCAoaSwgKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKHJvdykpIFtpXSk7Ci0JCQl9Ci0JCQlpZiAoIXRhYikgZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCX0KLQkJc2V0TGF5b3V0U3RhdGUgKCk7Ci0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCXNldExheW91dERhdGEgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIGVkZ2Ugb2YgYSB3aWRnZXQgdXNpbmcgdGhlCi0JICogaW5mb3JtYXRpb24gaW4gdGhlIHRhYmxlLgotCSAqLwotCUZvcm1BdHRhY2htZW50IHNldEF0dGFjaG1lbnQgKFN0cmluZyBhdHRhY2htZW50KSB7Ci0JCVN0cmluZyBjb250cm9sLCBhbGlnbjsKLQkJaW50IHBvc2l0aW9uLCBvZmZzZXQ7Ci0JCWludCBjb21tYSA9IGF0dGFjaG1lbnQuaW5kZXhPZiAoJywnKTsKLQkJY2hhciBmaXJzdCA9IGF0dGFjaG1lbnQuY2hhckF0ICgwKTsKLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihmaXJzdCkpIHsKLQkJCS8qIENhc2Ugd2hlcmUgdGhlcmUgaXMgYSBjb250cm9sICovCi0JCQljb250cm9sID0gYXR0YWNobWVudC5zdWJzdHJpbmcgKDAsIGNvbW1hKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgY29udHJvbC5sZW5ndGggKCkgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0IChjb250cm9sLmNoYXJBdCAoaSkpKSB7Ci0JCQkJaSsrOwotCQkJfQotCQkJU3RyaW5nIGVuZCA9IGNvbnRyb2wuc3Vic3RyaW5nIChpKTsKLQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChlbmQpLmludFZhbHVlICgpOwotCQkJQ29udHJvbCBhdHRhY2hDb250cm9sID0gY2hpbGRyZW4gW2luZGV4XTsKLQkJCWludCBjb2xvbiA9IGF0dGFjaG1lbnQuaW5kZXhPZiAoJzonKTsKLQkJCXRyeSB7Ci0JCQkJb2Zmc2V0ID0gbmV3IEludGVnZXIgKGF0dGFjaG1lbnQuc3Vic3RyaW5nIChjb21tYSArIDEsIGNvbG9uKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW9mZnNldCA9IDA7Ci0JCQl9Ci0JCQlhbGlnbiA9IGF0dGFjaG1lbnQuc3Vic3RyaW5nIChjb2xvbiArIDEpOwotCQkJcmV0dXJuIG5ldyBGb3JtQXR0YWNobWVudCAoYXR0YWNoQ29udHJvbCwgb2Zmc2V0LCBhbGlnbm1lbnRDb25zdGFudCAoYWxpZ24pKTsKLQkJfSBlbHNlIHsKLQkJCS8qIENhc2Ugd2hlcmUgdGhlcmUgaXMgYSBwb3NpdGlvbiAqLwotCQkJdHJ5IHsKLQkJCQlwb3NpdGlvbiA9IG5ldyBJbnRlZ2VyIChhdHRhY2htZW50LnN1YnN0cmluZyAoMCxjb21tYSkpLmludFZhbHVlICgpOwkKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcG9zaXRpb24gPSAwOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlvZmZzZXQgPSBuZXcgSW50ZWdlciAoYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbW1hICsgMSkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlvZmZzZXQgPSAwOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGb3JtQXR0YWNobWVudCAocG9zaXRpb24sIG9mZnNldCk7CQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXREYXRhICgpIHsKLQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IGxheW91dENvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0JCWludCB3aWR0aCwgaGVpZ2h0OwotCQlTdHJpbmcgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQl3aWR0aCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoV0lEVEhfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQloZWlnaHQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhFSUdIVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JCQlpZiAod2lkdGggPiAwKSBkYXRhLndpZHRoID0gd2lkdGg7Ci0JCQlpZiAoaGVpZ2h0ID4gMCkgZGF0YS5oZWlnaHQgPSBoZWlnaHQ7Ci0JCQkKLQkJCWxlZnQgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoTEVGVF9DT0wpOwotCQkJaWYgKGxlZnQubGVuZ3RoICgpID4gMCkgewotCQkJCWRhdGEubGVmdCA9IHNldEF0dGFjaG1lbnQgKGxlZnQpOwotCQkJCWlmIChkYXRhLmxlZnQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50ID0gY2hlY2tBdHRhY2htZW50IChsZWZ0LCBkYXRhLmxlZnQpOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoTEVGVF9DT0wsIGF0dGFjaG1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCXJpZ2h0ID0gaXRlbXMgW2ldLmdldFRleHQgKFJJR0hUX0NPTCk7Ci0JCQlpZiAocmlnaHQubGVuZ3RoICgpID4gMCkgewotCQkJCWRhdGEucmlnaHQgPSBzZXRBdHRhY2htZW50IChyaWdodCk7Ci0JCQkJaWYgKGRhdGEucmlnaHQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50ID0gY2hlY2tBdHRhY2htZW50IChyaWdodCwgZGF0YS5yaWdodCk7Ci0JCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChSSUdIVF9DT0wsIGF0dGFjaG1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCXRvcCA9IGl0ZW1zIFtpXS5nZXRUZXh0IChUT1BfQ09MKTsKLQkJCWlmICh0b3AubGVuZ3RoICgpID4gMCApIHsKLQkJCQlkYXRhLnRvcCA9IHNldEF0dGFjaG1lbnQgKHRvcCk7Ci0JCQkJaWYgKGRhdGEudG9wLmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IGNoZWNrQXR0YWNobWVudCAodG9wLCBkYXRhLnRvcCk7Ci0JCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChUT1BfQ09MLCBhdHRhY2htZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlib3R0b20gPSBpdGVtcyBbaV0uZ2V0VGV4dCAoQk9UVE9NX0NPTCk7Ci0JCQlpZiAoYm90dG9tLmxlbmd0aCAoKSA+IDApIHsKLQkJCQlkYXRhLmJvdHRvbSA9IHNldEF0dGFjaG1lbnQgKGJvdHRvbSk7Ci0JCQkJaWYgKGRhdGEuYm90dG9tLmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IGNoZWNrQXR0YWNobWVudCAoYm90dG9tLCBkYXRhLmJvdHRvbSk7Ci0JCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChCT1RUT01fQ09MLCBhdHRhY2htZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZHJlbiBbaV0uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dFN0YXRlICgpIHsKLQkJLyogU2V0IHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nICovCi0JCXRyeSB7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5IZWlnaHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQltYXJnaW5IZWlnaHQuc2VsZWN0ICgwKTsKLQkJfQotCQl0cnkgewotCQkJZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5XaWR0aC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbWFyZ2luV2lkdGguc2VsZWN0ICgwKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiA8Y29kZT5BdHRhY2hEaWFsb2c8L2NvZGU+IGlzIHRoZSBjbGFzcyB0aGF0IGNyZWF0ZXMgYQotCSAqIGRpYWxvZyBzcGVjaWZpYyBmb3IgdGhpcyBleGFtcGxlLiBJdCBjcmVhdGVzIGEgZGlhbG9nCi0JICogd2l0aCBjb250cm9scyB0byBzZXQgdGhlIHZhbHVlcyBpbiBhIEZvcm1BdHRhY2htZW50LgotCSAqLwotCXB1YmxpYyBjbGFzcyBBdHRhY2hEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCVN0cmluZyBjb250cm9sSW5wdXQsIHBvc2l0aW9uSW5wdXQsIGFsaWdubWVudElucHV0LCBvZmZzZXRJbnB1dDsKLQkJaW50IGNvbCA9IDA7Ci0JCQotCQlwdWJsaWMgQXR0YWNoRGlhbG9nIChTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgQXR0YWNoRGlhbG9nIChTaGVsbCBwYXJlbnQpIHsKLQkJCXRoaXMgKHBhcmVudCwgMCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldENvbHVtbiAoaW50IGNvbCkgewotCQkJdGhpcy5jb2wgPSBjb2w7Ci0JCX0KLQkgCi0JCXB1YmxpYyBTdHJpbmcgb3BlbiAoKSB7Ci0JCQlTaGVsbCBwYXJlbnQgPSBnZXRQYXJlbnQgKCk7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJc2hlbGwuc2V0VGV4dCAoZ2V0VGV4dCAoKSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCQlzaGVsbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCQkKLQkJCS8qIEZpbmQgb3V0IHdoYXQgd2FzIHByZXZpb3VzbHkgc2V0IGFzIGFuIGF0dGFjaG1lbnQgKi8KLQkJCVRhYmxlSXRlbSBuZXdJdGVtID0gbGVmdEVkaXRvci5nZXRJdGVtICgpOwotCQkJcmVzdWx0ID0gbmV3SXRlbS5nZXRUZXh0IChjb2wpOwotCQkJU3RyaW5nIG9sZEF0dGFjaCA9IHJlc3VsdDsKLQkJCVN0cmluZyBvbGRQb3MgPSAiMCIsIG9sZENvbnRyb2wgPSAiIiwgb2xkQWxpZ24gPSAiREVGQVVMVCIsIG9sZE9mZnNldCA9ICIwIjsKLQkJCWJvb2xlYW4gaXNDb250cm9sID0gZmFsc2U7Ci0JCQlpZiAob2xkQXR0YWNoLmxlbmd0aCAoKSAhPSAwKSB7Ci0JCQkJY2hhciBmaXJzdCA9IG9sZEF0dGFjaC5jaGFyQXQgKDApOwotCQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoZmlyc3QpKSB7Ci0JCQkJCS8qIFdlIGhhdmUgYSBjb250cm9sICovCi0JCQkJCWlzQ29udHJvbCA9IHRydWU7Ci0JCQkJCW9sZENvbnRyb2wgPSBvbGRBdHRhY2guc3Vic3RyaW5nICgwLCBvbGRBdHRhY2guaW5kZXhPZiAoJywnKSk7Ci0JCQkJCW9sZEFsaWduID0gb2xkQXR0YWNoLnN1YnN0cmluZyAob2xkQXR0YWNoLmluZGV4T2YgKCc6JykgKyAxKTsKLQkJCQkJb2xkT2Zmc2V0ID0gb2xkQXR0YWNoLnN1YnN0cmluZyAob2xkQXR0YWNoLmluZGV4T2YgKCcsJykgKyAxLCBvbGRBdHRhY2guaW5kZXhPZiAoJzonKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogV2UgaGF2ZSBhIHBvc2l0aW9uICovCi0JCQkJCW9sZFBvcyA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKDAsIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJCQkJb2xkT2Zmc2V0ID0gb2xkQXR0YWNoLnN1YnN0cmluZyAob2xkQXR0YWNoLmluZGV4T2YgKCcsJykgKyAxKTsKLQkJCQkJaWYgKG9sZE9mZnNldC5lbmRzV2l0aCAoIikiKSkgeyAvLyBpLmUuIChEZWZhdWx0KQotCQkJCQkJb2xkT2Zmc2V0ID0gb2xkT2Zmc2V0LnN1YnN0cmluZyAoMCwgb2xkT2Zmc2V0LmluZGV4T2YgKCcgJykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKiBBZGQgcG9zaXRpb24gZmllbGQgKi8KLQkJCWZpbmFsIEJ1dHRvbiBwb3NCdXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlJBRElPKTsKLQkJCXBvc0J1dHRvbi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiUG9zaXRpb24iKSk7Ci0JCQlwb3NCdXR0b24uc2V0U2VsZWN0aW9uICghaXNDb250cm9sKTsJCQkKLQkJCWZpbmFsIENvbWJvIHBvc2l0aW9uID0gbmV3IENvbWJvIChzaGVsbCwgU1dULk5PTkUpOwotCQkJcG9zaXRpb24uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyIwIiwiMjUiLCI1MCIsIjc1IiwiMTAwIn0pOwotCQkJcG9zaXRpb24uc2V0VGV4dCAob2xkUG9zKTsKLQkJCXBvc2l0aW9uLnNldEVuYWJsZWQgKCFpc0NvbnRyb2wpOwkJCQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJcG9zaXRpb24uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQkKLQkJCS8qIEFkZCBjb250cm9sIGZpZWxkICovCi0JCQlmaW5hbCBCdXR0b24gY29udEJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUkFESU8pOwotCQkJY29udEJ1dHRvbi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ29udHJvbCIpKTsKLQkJCWNvbnRCdXR0b24uc2V0U2VsZWN0aW9uIChpc0NvbnRyb2wpOwotCQkJZmluYWwgQ29tYm8gY29udHJvbCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlUYWJsZUl0ZW0gY3VycmVudEl0ZW0gPSBsZWZ0RWRpdG9yLmdldEl0ZW0gKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zIFtpXS5nZXRUZXh0ICgwKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKGl0ZW1zIFtpXSAhPSBjdXJyZW50SXRlbSkgewotCQkJCQkJY29udHJvbC5hZGQgKGl0ZW1zIFtpXS5nZXRUZXh0IChDT01CT19DT0wpICsgaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2xkQ29udHJvbC5sZW5ndGggKCkgIT0gMCkgY29udHJvbC5zZXRUZXh0IChvbGRDb250cm9sKTsKLQkJCWVsc2UgY29udHJvbC5zZWxlY3QgKDApOwotCQkJY29udHJvbC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQotCQkJLyogQWRkIGFsaWdubWVudCBmaWVsZCAqLwotCQkJbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBbGlnbm1lbnQiKSk7Ci0JCQlmaW5hbCBDb21ibyBhbGlnbm1lbnQgPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlTdHJpbmdbXSBhbGlnbm1lbnRWYWx1ZXM7Ci0JCQlpZiAoY29sID09IExFRlRfQ09MIHx8IGNvbCA9PSBSSUdIVF9DT0wpIHsKLQkJCQlhbGlnbm1lbnRWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiU1dULkxFRlQiLCAiU1dULlJJR0hUIiwgIlNXVC5DRU5URVIiLCAiU1dULkRFRkFVTFQifTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY29sID09IFRPUF9DT0wgfHwgY29sID09IEJPVFRPTV9DT0wKLQkJCQlhbGlnbm1lbnRWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiU1dULlRPUCIsICJTV1QuQk9UVE9NIiwgIlNXVC5DRU5URVIiLCAiU1dULkRFRkFVTFQifTsKLQkJCX0KLQkJCWFsaWdubWVudC5zZXRJdGVtcyAoYWxpZ25tZW50VmFsdWVzKTsKLQkJCWFsaWdubWVudC5zZXRUZXh0ICgiU1dULiIgKyBvbGRBbGlnbik7Ci0JCQlhbGlnbm1lbnQuc2V0RW5hYmxlZCAoaXNDb250cm9sKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWFsaWdubWVudC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQotCQkJLyogQWRkIG9mZnNldCBmaWVsZCAqLwotCQkJbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJPZmZzZXQiKSk7Ci0JCQlmaW5hbCBUZXh0IG9mZnNldCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJb2Zmc2V0LnNldFRleHQgKG9sZE9mZnNldCk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlvZmZzZXQuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQkKLQkJCS8qIEFkZCBsaXN0ZW5lcnMgZm9yIGNob29zaW5nIGJldHdlZW4gcG9zaXRpb24gYW5kIGNvbnRyb2wgKi8KLQkJCXBvc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBvc2l0aW9uLnNldEVuYWJsZWQgKHRydWUpOwotCQkJCQljb250cm9sLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCQkJYWxpZ25tZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQkJY29udEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBvc2l0aW9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCQkJY29udHJvbC5zZXRFbmFibGVkICh0cnVlKTsKLQkJCQkJYWxpZ25tZW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCUJ1dHRvbiBjbGVhciA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCQljbGVhci5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2xlYXIiKSk7Ci0JCQljbGVhci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCQljbGVhci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlc3VsdCA9ICIiOwotCQkJCQlzaGVsbC5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8qIE9LIGJ1dHRvbiBzZXRzIGRhdGEgaW50byB0YWJsZSAqLwotCQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJPSyIpKTsKLQkJCW9rLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJY29udHJvbElucHV0ID0gY29udHJvbC5nZXRUZXh0ICgpOwotCQkJCQlhbGlnbm1lbnRJbnB1dCA9IGFsaWdubWVudC5nZXRUZXh0ICgpLnN1YnN0cmluZyAoNCk7Ci0JCQkJCXBvc2l0aW9uSW5wdXQgPSBwb3NpdGlvbi5nZXRUZXh0ICgpOwotCQkJCQlpZiAocG9zaXRpb25JbnB1dC5sZW5ndGggKCkgPT0gMCkgcG9zaXRpb25JbnB1dCA9ICIwIjsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBJbnRlZ2VyIChwb3NpdGlvbklucHV0KS5pbnRWYWx1ZSAoKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdCkgewotCQkJCQkJcG9zaXRpb25JbnB1dCA9ICIwIjsKLQkJCQkJfQotCQkJCQlvZmZzZXRJbnB1dCA9IG9mZnNldC5nZXRUZXh0ICgpOwotCQkJCQlpZiAob2Zmc2V0SW5wdXQubGVuZ3RoICgpID09IDApIG9mZnNldElucHV0ID0gIjAiOwotCQkJCQl0cnkgewotCQkJCQkJbmV3IEludGVnZXIgKG9mZnNldElucHV0KS5pbnRWYWx1ZSAoKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdCkgewotCQkJCQkJb2Zmc2V0SW5wdXQgPSAiMCI7Ci0JCQkJCX0KLQkJCQkJaWYgKHBvc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSB8fCBjb250cm9sSW5wdXQubGVuZ3RoICgpID09IDApIHsKLQkJCQkJCXJlc3VsdCA9IHBvc2l0aW9uSW5wdXQgKyAiLCIgKyBvZmZzZXRJbnB1dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdCA9IGNvbnRyb2xJbnB1dCArICIsIiArIG9mZnNldElucHV0ICsgIjoiICsgYWxpZ25tZW50SW5wdXQ7Ci0JCQkJCX0KLQkJCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCWNhbmNlbC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2FuY2VsIikpOwotCQkJY2FuY2VsLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uIChvayk7Ci0JCQlzaGVsbC5wYWNrICgpOwotCQkJLyogQ2VudGVyIHRoZSBkaWFsb2cgKi8KLQkJCVBvaW50IGNlbnRlciA9IHBhcmVudC5nZXRMb2NhdGlvbiAoKTsKLQkJCWNlbnRlci54ID0gY2VudGVyLnggKyAocGFyZW50LmdldEJvdW5kcyAoKS53aWR0aCAvIDIpIC0gKHNoZWxsLmdldEJvdW5kcyAoKS53aWR0aCAvIDIpOwotCQkJY2VudGVyLnkgPSBjZW50ZXIueSArIChwYXJlbnQuZ2V0Qm91bmRzICgpLmhlaWdodCAvIDIpIC0gKHNoZWxsLmdldEJvdW5kcyAoKS5oZWlnaHQgLyAyKTsKLQkJCXNoZWxsLnNldExvY2F0aW9uIChjZW50ZXIpOwotCQkJc2hlbGwub3BlbiAoKTsKLQkJCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkgKCk7Ci0JCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlpZiAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0dyaWRMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvR3JpZExheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODkwMWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvR3JpZExheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotY2xhc3MgR3JpZExheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlUZXh0IG51bUNvbHVtbnM7Ci0JQnV0dG9uIG1ha2VDb2x1bW5zRXF1YWxXaWR0aDsKLQlDb21ibyBtYXJnaW5IZWlnaHQsIG1hcmdpbldpZHRoLCBob3Jpem9udGFsU3BhY2luZywgdmVydGljYWxTcGFjaW5nOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCB3aWR0aEVkaXRvciwgaGVpZ2h0RWRpdG9yOwotCVRhYmxlRWRpdG9yIHZBbGlnbkVkaXRvciwgaEFsaWduRWRpdG9yLCBoSW5kZW50RWRpdG9yOwotCVRhYmxlRWRpdG9yIGhTcGFuRWRpdG9yLCB2U3BhbkVkaXRvciwgaEdyYWJFZGl0b3IsIHZHcmFiRWRpdG9yOwotCUNDb21ibyBjb21ibywgdkFsaWduLCBoQWxpZ24sIGhHcmFiLCB2R3JhYjsKLQlUZXh0IHdpZHRoVGV4dCwgaGVpZ2h0VGV4dCwgaEluZGVudCwgaFNwYW4sIHZTcGFuOwotCQotCS8qIENvbnN0YW50cyAqLwotCWZpbmFsIGludCBDT01CT19DT0wgPSAxOwotCWZpbmFsIGludCBXSURUSF9DT0wgPSAyOwotCWZpbmFsIGludCBIRUlHSFRfQ09MID0gMzsKLQlmaW5hbCBpbnQgSEFMSUdOX0NPTCA9IDQ7Ci0JZmluYWwgaW50IFZBTElHTl9DT0wgPSA1OwotCWZpbmFsIGludCBISU5ERU5UX0NPTCA9IDY7Ci0JZmluYWwgaW50IEhTUEFOX0NPTCA9IDc7Ci0JZmluYWwgaW50IFZTUEFOX0NPTCA9IDg7Ci0JZmluYWwgaW50IEhHUkFCX0NPTCA9IDk7Ci0JZmluYWwgaW50IFZHUkFCX0NPTCA9IDEwOwotCQotCWZpbmFsIGludCBUT1RBTF9DT0xTID0gMTE7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUdyaWRMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBDcmVhdGUgdGhlIFRyYXZlcnNlTGlzdGVuZXIgKi8KLQkJZmluYWwgVHJhdmVyc2VMaXN0ZW5lciB0cmF2ZXJzZUxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkIChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTiB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0JCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkKLQkJCQkJZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCQotCQkvKiBBZGQgVGFibGVFZGl0b3JzICovCQkKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZBbGlnbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloQWxpZ25FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaEluZGVudEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloU3BhbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl2U3BhbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloR3JhYkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl2R3JhYkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMoKTsKLQkJCQlpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChlLngsIGUueSk7Ci0gICAgICAgICAgICAgICAgbmV3SXRlbSA9IHRhYmxlLmdldEl0ZW0gKHB0KTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uICgpOwotCQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5SRUFEX09OTFkpOwotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yIChjb21ibywgY29tYm9FZGl0b3IpOwotCQkJCQotCQkJCXdpZHRoVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtXSURUSF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh3aWR0aFRleHQsIHdpZHRoRWRpdG9yLCBXSURUSF9DT0wpOwotCQkJCQotCQkJCWhlaWdodFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hFSUdIVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoZWlnaHRUZXh0LCBoZWlnaHRFZGl0b3IsIEhFSUdIVF9DT0wpOwotCQkJCVN0cmluZyBbXSBhbGlnblZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJCRUdJTk5JTkciLCJDRU5URVIiLCJFTkQiLCJGSUxMIn07Ci0JCQkJaEFsaWduID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJCQloQWxpZ24uc2V0SXRlbXMgKGFsaWduVmFsdWVzKTsKLQkJCQloQWxpZ24uc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChIQUxJR05fQ09MKSk7Ci0JCQkJaEFsaWduRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQloQWxpZ25FZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWhBbGlnbkVkaXRvci5taW5pbXVtV2lkdGggPSA1MDsKLQkJCQloQWxpZ25FZGl0b3Iuc2V0RWRpdG9yIChoQWxpZ24sIG5ld0l0ZW0sIEhBTElHTl9DT0wpOwotCQkJCWhBbGlnbi5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJCQkKLQkJCQl2QWxpZ24gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCXZBbGlnbi5zZXRJdGVtcyAoYWxpZ25WYWx1ZXMpOwotCQkJCXZBbGlnbi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKFZBTElHTl9DT0wpKTsKLQkJCQl2QWxpZ25FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXZBbGlnbkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdkFsaWduRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCXZBbGlnbkVkaXRvci5zZXRFZGl0b3IgKHZBbGlnbiwgbmV3SXRlbSwgVkFMSUdOX0NPTCk7Ci0JCQkJdkFsaWduLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkJCQotCQkJCWhJbmRlbnQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhJbmRlbnQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hJTkRFTlRfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAoaEluZGVudCwgaEluZGVudEVkaXRvciwgSElOREVOVF9DT0wpOwotCQkJCQotCQkJCWhTcGFuID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQloU3Bhbi5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSFNQQU5fQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAoaFNwYW4sIGhTcGFuRWRpdG9yLCBIU1BBTl9DT0wpOwotCQkJCQotCQkJCXZTcGFuID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl2U3Bhbi5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbVlNQQU5fQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAodlNwYW4sIHZTcGFuRWRpdG9yLCBWU1BBTl9DT0wpOwotCQkJCQotCQkJCVN0cmluZyBbXSBib29sVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7ImZhbHNlIiwidHJ1ZSJ9OwotCQkJCWhHcmFiID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJCQloR3JhYi5zZXRJdGVtcyAoYm9vbFZhbHVlcyk7Ci0JCQkJaEdyYWIuc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChIR1JBQl9DT0wpKTsKLQkJCQloR3JhYkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJaEdyYWJFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWhHcmFiRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhHcmFiRWRpdG9yLnNldEVkaXRvciAoaEdyYWIsIG5ld0l0ZW0sIEhHUkFCX0NPTCk7Ci0JCQkJaEdyYWIuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJdkdyYWIgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCXZHcmFiLnNldEl0ZW1zIChib29sVmFsdWVzKTsKLQkJCQl2R3JhYi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKFZHUkFCX0NPTCkpOwotCQkJCXZHcmFiRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQl2R3JhYkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdkdyYWJFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkdyYWJFZGl0b3Iuc2V0RWRpdG9yICh2R3JhYiwgbmV3SXRlbSwgVkdSQUJfQ09MKTsKLQkJCQl2R3JhYi5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0JCQkJCQkJY2FzZSBDT01CT19DT0wgOgotCQkJCQkJCQljb21iby5zZXRGb2N1cyAoKTsJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgV0lEVEhfQ09MIDoJCi0JCQkJCQkJCXdpZHRoVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIRUlHSFRfQ09MIDoKLQkJCQkJCQkJaGVpZ2h0VGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIQUxJR05fQ09MIDoKLQkJCQkJCQkJaEFsaWduLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZBTElHTl9DT0wgOgotCQkJCQkJCQl2QWxpZ24uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSElOREVOVF9DT0wgOgotCQkJCQkJCQloSW5kZW50LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhTUEFOX0NPTCA6Ci0JCQkJCQkJCWhTcGFuLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZTUEFOX0NPTCA6Ci0JCQkJCQkJCXZTcGFuLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhHUkFCX0NPTCA6Ci0JCQkJCQkJCWhHcmFiLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZHUkFCX0NPTCA6Ci0JCQkJCQkJCXZHcmFiLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0JCQl9Ci0JCX0pOwotCQkKLQkJLyogQWRkIGxpc3RlbmVyIHRvIGFkZCBhbiBlbGVtZW50IHRvIHRoZSB0YWJsZSAqLwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHsgCi0JCQkJCVN0cmluZy52YWx1ZU9mICh0YWJsZS5pbmRleE9mIChpdGVtKSksICJCdXR0b24iLAotCQkJCQkiLTEiLCItMSIsIkJFR0lOTklORyIsIkNFTlRFUiIsCi0JCQkJCSIwIiwiMSIsIjEiLCJmYWxzZSIsImZhbHNlIn07Ci0JCQkJaXRlbS5zZXRUZXh0IChpbnNlcnQpOwotCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJLyogUmVhcnJhbmdlIHRoZSBsYXlvdXQgb2YgdGhlIGNvbnRyb2wgZ3JvdXAgKi8KLQkJc2l6ZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKCkpOwotCQkKLQkJLyogQ29udHJvbHMgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgb2YgdGhlIEdyaWRMYXlvdXQgKi8KLQkJU3RyaW5nIFtdIG1hcmdpblZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyIwIiwiMyIsIjUiLCIxMCJ9OwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zX1NwYWNpbmciKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpbkhlaWdodCIpOwotCQltYXJnaW5IZWlnaHQgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkhlaWdodC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luSGVpZ2h0LnNlbGVjdCAoMik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCW1hcmdpbkhlaWdodC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW1hcmdpbkhlaWdodC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5XaWR0aCIpOwotCQltYXJnaW5XaWR0aCA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luV2lkdGguc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbldpZHRoLnNlbGVjdCAoMik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCW1hcmdpbldpZHRoLnNldExheW91dERhdGEgKGRhdGEpOwotCQltYXJnaW5XaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5XaWR0aC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJob3Jpem9udGFsU3BhY2luZyIpOwotCQlob3Jpem9udGFsU3BhY2luZyA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCWhvcml6b250YWxTcGFjaW5nLnNlbGVjdCAoMik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCWhvcml6b250YWxTcGFjaW5nLnNldExheW91dERhdGEgKGRhdGEpOwotCQlob3Jpem9udGFsU3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlob3Jpem9udGFsU3BhY2luZy5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJ2ZXJ0aWNhbFNwYWNpbmciKTsKLQkJdmVydGljYWxTcGFjaW5nID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQl2ZXJ0aWNhbFNwYWNpbmcuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCXZlcnRpY2FsU3BhY2luZy5zZWxlY3QgKDIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDYwOwotCQl2ZXJ0aWNhbFNwYWNpbmcuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCXZlcnRpY2FsU3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2ZXJ0aWNhbFNwYWNpbmcuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0gICAgICAgIAotICAgICAgICAvKiBDb250cm9scyB0aGUgY29sdW1ucyBpbiB0aGUgR3JpZExheW91dCAqLwotCQlHcm91cCBjb2x1bW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb2x1bW5zIikpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb2x1bW5Hcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb2x1bW5Hcm91cC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJbnVtQ29sdW1ucyA9IG5ldyBUZXh0IChjb2x1bW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW51bUNvbHVtbnMuc2V0VGV4dCAoIjEiKTsKLQkJbnVtQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQludW1Db2x1bW5zLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotICAgICAgIAlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgIAlkYXRhLndpZHRoSGludCA9IDE1OwotICAgICAgIAludW1Db2x1bW5zLnNldExheW91dERhdGEgKGRhdGEpOwotICAgICAgIAluZXcgTGFiZWwgKGNvbHVtbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm51bUNvbHVtbnMiKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gbmV3IEJ1dHRvbiAoY29sdW1uR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5zZXRUZXh0ICgibWFrZUNvbHVtbnNFcXVhbFdpZHRoIik7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTQ7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQljb250cm9sR3JvdXAucGFjaygpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAoZ3JpZExheW91dCk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCXdpZHRoVGV4dC5kaXNwb3NlICgpOwotCQloZWlnaHRUZXh0LmRpc3Bvc2UgKCk7Ci0JCWhBbGlnbi5kaXNwb3NlICgpOwotCQl2QWxpZ24uZGlzcG9zZSAoKTsKLQkJaEluZGVudC5kaXNwb3NlICgpOwotCQloU3Bhbi5kaXNwb3NlICgpOwotCQl2U3Bhbi5kaXNwb3NlICgpOwotCQloR3JhYi5kaXNwb3NlICgpOwotCQl2R3JhYi5kaXNwb3NlICgpOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTtcbiIpOwotCQlpZiAoZ3JpZExheW91dC5udW1Db2x1bW5zICE9IDEpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9ICIgKyBncmlkTGF5b3V0Lm51bUNvbHVtbnMgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQubWFyZ2luV2lkdGggIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5tYXJnaW5XaWR0aCA9ICIgKyBncmlkTGF5b3V0Lm1hcmdpbldpZHRoICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nICE9IDUpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAiICsgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAiICsgZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgKyAiO1xuIik7Ci0JCX0KLQkJY29kZS5hcHBlbmQgKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChncmlkTGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuIFtpXTsKLQkJCWNvZGUuYXBwZW5kIChnZXRDaGlsZENvZGUgKGNvbnRyb2wsIGkpKTsKLQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSAoKTsKLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHQiKTsKLQkJCQlpZiAoZmlyc3QpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJHcmlkRGF0YSAiKTsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJY29kZS5hcHBlbmQgKCJkYXRhID0gbmV3IEdyaWREYXRhICgpO1xuIik7CQotCQkJCWlmIChkYXRhLndpZHRoSGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLndpZHRoSGludCA9ICIgKyBkYXRhLndpZHRoSGludCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEuaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhlaWdodEhpbnQgPSAiICsgZGF0YS5oZWlnaHRIaW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICE9IEdyaWREYXRhLkJFR0lOTklORykgewotCQkJCQlTdHJpbmcgYWxpZ25tZW50OwotCQkJCQlpbnQgaEFsaWdubWVudCA9IGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudDsKLQkJCQkJaWYgKGhBbGlnbm1lbnQgPT0gR3JpZERhdGEuQ0VOVEVSKSBhbGlnbm1lbnQgPSAiR3JpZERhdGEuQ0VOVEVSIjsKLQkJCQkJZWxzZSBpZiAoaEFsaWdubWVudCA9PSBHcmlkRGF0YS5FTkQpIGFsaWdubWVudCA9ICJHcmlkRGF0YS5FTkQiOwotCQkJCQllbHNlIGFsaWdubWVudCA9ICJHcmlkRGF0YS5GSUxMIjsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gIiArIGFsaWdubWVudCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEudmVydGljYWxBbGlnbm1lbnQgIT0gR3JpZERhdGEuQ0VOVEVSKSB7Ci0JCQkJCVN0cmluZyBhbGlnbm1lbnQ7Ci0JCQkJCWludCB2QWxpZ25tZW50ID0gZGF0YS52ZXJ0aWNhbEFsaWdubWVudDsKLQkJCQkJaWYgKHZBbGlnbm1lbnQgPT0gR3JpZERhdGEuQkVHSU5OSU5HKSBhbGlnbm1lbnQgPSAiR3JpZERhdGEuQkVHSU5OSU5HIjsKLQkJCQkJZWxzZSBpZiAodkFsaWdubWVudCA9PSBHcmlkRGF0YS5FTkQpIGFsaWdubWVudCA9ICJHcmlkRGF0YS5FTkQiOwotCQkJCQllbHNlIGFsaWdubWVudCA9ICJHcmlkRGF0YS5GSUxMIjsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9ICIgKyBhbGlnbm1lbnQgKyAiO1xuIik7Ci0JCQkJfQkKLQkJCQlpZiAoZGF0YS5ob3Jpem9udGFsSW5kZW50ICE9IDApIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gIiArIGRhdGEuaG9yaXpvbnRhbEluZGVudCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEuaG9yaXpvbnRhbFNwYW4gIT0gMSkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxTcGFuID0gIiArIGRhdGEuaG9yaXpvbnRhbFNwYW4gKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLnZlcnRpY2FsU3BhbiAhPSAxKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudmVydGljYWxTcGFuID0gIiArIGRhdGEudmVydGljYWxTcGFuICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGNvZGUuc3Vic3RyaW5nIChjb2RlLmxlbmd0aCAoKSAtIDMzKS5lcXVhbHMgKCJHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhICgpO1xuIikpIHsKLQkJCQkJY29kZS5kZWxldGUgKGNvZGUubGVuZ3RoICgpIC0gMzMsIGNvZGUubGVuZ3RoICgpKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29kZS5zdWJzdHJpbmcgKGNvZGUubGVuZ3RoICgpIC0gMjQpLmVxdWFscyAoImRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKSkgeyAKLQkJCQkJY29kZS5kZWxldGUgKGNvZGUubGVuZ3RoICgpIC0gMjQsIGNvZGUubGVuZ3RoICgpKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJIiIsCi0JCQkiQ29udHJvbCIsIAotCQkJIndpZHRoIiwgCi0JCQkiaGVpZ2h0IiwgCi0JCQkiaG9yaXpvbnRhbEFsaWdubWVudCIsIAotCQkJInZlcnRpY2FsQWxpZ25tZW50IiwgCi0JCQkiaG9yaXpvbnRhbEluZGVudCIsIAotCQkJImhvcml6b250YWxTcGFuIiwKLQkJCSJ2ZXJ0aWNhbFNwYW4iLCAKLQkJCSJncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlIiwgCi0JCQkiZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UiCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkdyaWRMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoZWlnaHRUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaEluZGVudC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaEluZGVudC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhJTkRFTlRfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoU3Bhbi5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaFNwYW4uc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChIU1BBTl9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHZTcGFuLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl2U3Bhbi5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFZTUEFOX0NPTCkpOwotCQkJfQotCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10gewotCQkJCVN0cmluZy52YWx1ZU9mIChyb3cpLCBjb21iby5nZXRUZXh0ICgpLCB3aWR0aFRleHQuZ2V0VGV4dCAoKSwgaGVpZ2h0VGV4dC5nZXRUZXh0ICgpLAotCQkJCWhBbGlnbi5nZXRUZXh0ICgpLCB2QWxpZ24uZ2V0VGV4dCAoKSwgaEluZGVudC5nZXRUZXh0ICgpLCAKLQkJCQloU3Bhbi5nZXRUZXh0ICgpLCB2U3Bhbi5nZXRUZXh0ICgpLCBoR3JhYi5nZXRUZXh0ICgpLCB2R3JhYi5nZXRUZXh0ICgpCi0JCQl9OwotCQkJZGF0YS5zZXRFbGVtZW50QXQgKGluc2VydCwgcm93KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsJCQotCQlyZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpOwotCQlzZXRMYXlvdXREYXRhICgpOwotCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dERhdGEgKCkgewotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJR3JpZERhdGEgZGF0YTsKLQkJaW50IGhJbmRlbnQsIGhTcGFuLCB2U3BhbjsKLQkJU3RyaW5nIHZBbGlnbiwgaEFsaWduLCB2R3JhYiwgaEdyYWI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEgKCk7Ci0JCQkvKiBTZXQgd2lkdGhIaW50IGFuZCBoZWlnaHRIaW50ICovCi0JCQlkYXRhLndpZHRoSGludCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoV0lEVEhfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLmhlaWdodEhpbnQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhFSUdIVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCS8qIFNldCB2ZXJ0aWNhbCBhbGlnbm1lbnQgYW5kIGhvcml6b250YWwgYWxpZ25tZW50ICovCi0JCQloQWxpZ24gPSBpdGVtcyBbaV0uZ2V0VGV4dCAoSEFMSUdOX0NPTCk7Ci0JCQlpZiAoaEFsaWduLmVxdWFscyAoIkNFTlRFUiIpKSB7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQkJfSBlbHNlIGlmIChoQWxpZ24uZXF1YWxzICgiRU5EIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5FTkQ7Ci0JCQl9IGVsc2UgaWYgKGhBbGlnbi5lcXVhbHMgKCJGSUxMIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCQl9Ci0JCQl2QWxpZ24gPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVkFMSUdOX0NPTCk7Ci0JCQlpZiAodkFsaWduLmVxdWFscyAoIkJFR0lOTklORyIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCX0gZWxzZSBpZiAodkFsaWduLmVxdWFscyAoIkVORCIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJCX0gZWxzZSBpZiAodkFsaWduLmVxdWFscyAoIkZJTEwiKSkgewotCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQkJfQotCQkJLyogU2V0IGluZGVudHMgYW5kIHNwYW5zICovCi0JCQloSW5kZW50ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChISU5ERU5UX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gaEluZGVudDsKLQkJCWhTcGFuID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChIU1BBTl9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBoU3BhbjsKLQkJCXZTcGFuID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChWU1BBTl9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEudmVydGljYWxTcGFuID0gdlNwYW47Ci0JCQkvKiBTZXQgZ3JhYmJlcnMgKi8KLQkJCWhHcmFiID0gaXRlbXMgW2ldLmdldFRleHQgKEhHUkFCX0NPTCk7Ci0JCQlpZiAoaEdyYWIuZXF1YWxzICgidHJ1ZSIpKSB7Ci0JCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCQl9Ci0JCQl2R3JhYiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChWR1JBQl9DT0wpOwotCQkJaWYgKHZHcmFiLmVxdWFscyAoInRydWUiKSkgewotCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCQl9Ci0JCQljaGlsZHJlbiBbaV0uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dFN0YXRlICgpIHsKLQkJLyogU2V0IHRoZSBjb2x1bW5zIGZvciB0aGUgbGF5b3V0ICovCi0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSBuZXcgSW50ZWdlciAobnVtQ29sdW1ucy5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCX0KLQkJZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBtYWtlQ29sdW1uc0VxdWFsV2lkdGguZ2V0U2VsZWN0aW9uICgpOwotCQkKLQkJLyogU2V0IHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nICovCi0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5IZWlnaHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCQltYXJnaW5IZWlnaHQuc2VsZWN0ICgyKTsKLQkJfQotCQl0cnkgewotCQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5XaWR0aC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQkJbWFyZ2luV2lkdGguc2VsZWN0ICgyKTsKLQkJfQotCQl0cnkgewotCQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IG5ldyBJbnRlZ2VyIChob3Jpem9udGFsU3BhY2luZy5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQkJaG9yaXpvbnRhbFNwYWNpbmcuc2VsZWN0ICgyKTsKLQkJfQotCQl0cnkgewotCQkJZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBuZXcgSW50ZWdlciAodmVydGljYWxTcGFjaW5nLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQkJdmVydGljYWxTcGFjaW5nLnNlbGVjdCAoMik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0xheW91dEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY3MjU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBMYXlvdXRFeGFtcGxlIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfbGF5b3V0Iik7Ci0JcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBMYXlvdXRFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBMYXlvdXRFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVRhYiBbXSB0YWJzID0gbmV3IFRhYiBbXSB7Ci0JCQluZXcgRmlsbExheW91dFRhYiAodGhpcyksCi0JCQluZXcgUm93TGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBHcmlkTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBGb3JtTGF5b3V0VGFiICh0aGlzKSwKLQkJfTsKLQkJZm9yIChpbnQgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJICAgIGl0ZW0uc2V0VGV4dCAodGFicyBbaV0uZ2V0VGFiVGV4dCAoKSk7Ci0JCSAgICBpdGVtLnNldENvbnRyb2wgKHRhYnMgW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcikpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdyYWJzIGlucHV0IGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl0YWJGb2xkZXIuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIExheW91dEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgTGF5b3V0RXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lciAobmV3IFNoZWxsQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCQlTaGVsbCBbXSBzaGVsbHMgPSBkaXNwbGF5LmdldFNoZWxscygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2hlbGxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaGVsbHMgW2ldICE9IHNoZWxsKSBzaGVsbHMgW2ldLmNsb3NlICgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvUm93TGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzczNTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIFJvd0xheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JQnV0dG9uIHdyYXAsIHBhY2ssIGp1c3RpZnk7Ci0JQ29tYm8gbWFyZ2luUmlnaHQsIG1hcmdpbkxlZnQsIG1hcmdpblRvcCwgbWFyZ2luQm90dG9tLCBzcGFjaW5nOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCVJvd0xheW91dCByb3dMYXlvdXQ7Ci0JLyogVGFibGVFZGl0b3JzIGFuZCByZWxhdGVkIGNvbnRyb2xzKi8KLQlUYWJsZUVkaXRvciBjb21ib0VkaXRvciwgd2lkdGhFZGl0b3IsIGhlaWdodEVkaXRvcjsKLQlDQ29tYm8gY29tYm87Ci0JVGV4dCB3aWR0aFRleHQsIGhlaWdodFRleHQ7Ci0JCi0JLyogQ29uc3RhbnRzICovCi0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCQotCWZpbmFsIGludCBUT1RBTF9DT0xTID0gNDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlSb3dMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8JCQkKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIgKG5ldyBNb3VzZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycygpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGUueCwgZS55KTsKLSAgICAgICAgICAgICAgICBuZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAocHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJd2lkdGhUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1dJRFRIX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHdpZHRoVGV4dCwgd2lkdGhFZGl0b3IsIFdJRFRIX0NPTCk7Ci0JCQkJCi0JCQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSEVJR0hUX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhlaWdodFRleHQsIGhlaWdodEVkaXRvciwgSEVJR0hUX0NPTCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAJUmVjdGFuZ2xlIHJlY3QgPSBuZXdJdGVtLmdldEJvdW5kcyAoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zIChwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCXN3aXRjaCAoaSkgewotCQkJCQkJCWNhc2UgQ09NQk9fQ09MIDoKLQkJCQkJCQkJY29tYm8uc2V0Rm9jdXMgKCk7CQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFdJRFRIX0NPTCA6CQotCQkJCQkJCQl3aWR0aFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEVJR0hUX0NPTCA6Ci0JCQkJCQkJCWhlaWdodFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKiBBZGQgbGlzdGVuZXIgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIHRhYmxlICovCi0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10geyAKLQkJCQkJU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmluZGV4T2YgKGl0ZW0pKSwKLQkJCQkJIkJ1dHRvbiIsICItMSIsICItMSJ9OwotCQkJCWl0ZW0uc2V0VGV4dCAoaW5zZXJ0KTsKLQkJCQlkYXRhLmFkZEVsZW1lbnQgKGluc2VydCk7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDb250cm9scyB0aGUgdHlwZSBvZiBSb3dMYXlvdXQgKi8KLQkJR3JvdXAgdHlwZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdHlwZUdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUeXBlIikpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJaG9yaXpvbnRhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbC5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdmVydGljYWwgPSBuZXcgQnV0dG9uICh0eXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJdmVydGljYWwuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgCi0JCXZlcnRpY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgUm93TGF5b3V0ICovCi0JCVN0cmluZyBbXSBtYXJnaW5WYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiMCIsIjMiLCI1IiwiMTAifTsKLQkJR3JvdXAgbWFyZ2luR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5Hcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTWFyZ2luc19TcGFjaW5nIikpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5SaWdodCIpOwotCQltYXJnaW5SaWdodCA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luUmlnaHQuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpblJpZ2h0LnNlbGVjdCAoMSk7Ci0JCW1hcmdpblJpZ2h0LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbWFyZ2luUmlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luUmlnaHQuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luTGVmdCIpOwotCQltYXJnaW5MZWZ0ID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5MZWZ0LnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5MZWZ0LnNlbGVjdCAoMSk7Ci0JCW1hcmdpbkxlZnQuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQltYXJnaW5MZWZ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW1hcmdpbkxlZnQuYWRkVHJhdmVyc2VMaXN0ZW5lcih0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5Ub3AiKTsKLQkJbWFyZ2luVG9wID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5Ub3Auc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpblRvcC5zZWxlY3QgKDEpOwotCQltYXJnaW5Ub3Auc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQltYXJnaW5Ub3AuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luVG9wLmFkZFRyYXZlcnNlTGlzdGVuZXIodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luQm90dG9tIik7Ci0JCW1hcmdpbkJvdHRvbSA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luQm90dG9tLnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5Cb3R0b20uc2VsZWN0ICgxKTsKLQkJbWFyZ2luQm90dG9tLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbWFyZ2luQm90dG9tLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW1hcmdpbkJvdHRvbS5hZGRUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoInNwYWNpbmciKTsKLQkJc3BhY2luZyA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJc3BhY2luZy5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJc3BhY2luZy5zZWxlY3QgKDEpOwotCQlzcGFjaW5nLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzcGFjaW5nLmFkZFRyYXZlcnNlTGlzdGVuZXIodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQotCQkvKiBDb250cm9scyBvdGhlciBwYXJhbWV0ZXJzIG9mIHRoZSBSb3dMYXlvdXQgKi8KLQkJR3JvdXAgc3BlY0dyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3BlY0dyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJQcm9wZXJ0aWVzIikpOwotCQlzcGVjR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3BlY0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl3cmFwID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwLnNldFRleHQgKCJ3cmFwIik7Ci0JCXdyYXAuc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJd3JhcC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJd3JhcC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlwYWNrID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlwYWNrLnNldFRleHQgKCJwYWNrIik7Ci0JCXBhY2suc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgCi0JCXBhY2suc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcGFjay5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlqdXN0aWZ5ID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlqdXN0aWZ5LnNldFRleHQgKCJqdXN0aWZ5Iik7Ci0JCWp1c3RpZnkuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgCi0JCWp1c3RpZnkuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCQotCQkvKiBQb3NpdGlvbiB0aGUgc2FzaCAqLwotCQlzYXNoLnNldFdlaWdodHMgKG5ldyBpbnQgW10gezYsNX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCXJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKHJvd0xheW91dCk7Ci0JfQotCQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCQl3aWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJaGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCAoKTtcbiIpOwotCQlpZiAocm93TGF5b3V0LnR5cGUgPT0gU1dULlZFUlRJQ0FMKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQud3JhcCA9PSBmYWxzZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0LndyYXAgPSBmYWxzZTtcbiIpOwotCQl9IAotCQlpZiAocm93TGF5b3V0LnBhY2sgPT0gZmFsc2UpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5wYWNrID0gZmFsc2U7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lmp1c3RpZnkgPT0gdHJ1ZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lmp1c3RpZnkgPSB0cnVlO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5tYXJnaW5MZWZ0ICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5tYXJnaW5MZWZ0ID0gIiArIHJvd0xheW91dC5tYXJnaW5MZWZ0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQubWFyZ2luUmlnaHQgIT0gMykgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lm1hcmdpblJpZ2h0ID0gIiArIHJvd0xheW91dC5tYXJnaW5SaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpblRvcCAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luVG9wID0gIiArIHJvd0xheW91dC5tYXJnaW5Ub3AgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5tYXJnaW5Cb3R0b20gIT0gMykgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9ICIgKyByb3dMYXlvdXQubWFyZ2luQm90dG9tICsgIjtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQuc3BhY2luZyAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQuc3BhY2luZyA9ICIgKyByb3dMYXlvdXQuc3BhY2luZyArICI7XG4iKTsKLQkJfQotCQljb2RlLmFwcGVuZCAoIlx0XHRzaGVsbC5zZXRMYXlvdXQgKHJvd0xheW91dCk7XG4iKTsKLQkJCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLGkpKTsKLQkJCVJvd0RhdGEgZGF0YSA9IChSb3dEYXRhKSBjb250cm9sLmdldExheW91dERhdGEgKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJaWYgKGRhdGEud2lkdGggIT0gLTEgfHwgZGF0YS5oZWlnaHQgIT0gLTEpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJCWlmIChmaXJzdCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJSb3dEYXRhICIpOwotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoZGF0YS53aWR0aCA9PSAtMSkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJkYXRhID0gbmV3IFJvd0RhdGEgKFNXVC5ERUZBVUxULCAiICsgZGF0YS5oZWlnaHQgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgaWYgKGRhdGEuaGVpZ2h0ID09IC0xKSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoImRhdGEgPSBuZXcgUm93RGF0YSAoIiArIGRhdGEud2lkdGggKyAiLCBTV1QuREVGQVVMVCk7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBSb3dEYXRhICgiICsgZGF0YS53aWR0aCArICIsICIgKyBkYXRhLmhlaWdodCArICIpO1xuIik7CQkJCQotCQkJCQl9Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldExheW91dERhdGEgKGRhdGEpO1xuIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YSBmaWVsZCBuYW1lcy4KLQkgKi8KLQlTdHJpbmcgW10gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsgCi0JCQkiIiwKLQkJCSJDb250cm9sIiwKLQkJCSJ3aWR0aCIsIAotCQkJImhlaWdodCIKLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiUm93TGF5b3V0IjsKLQl9Ci0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoKSB7Ci0JCXJlc2V0RWRpdG9ycyAoZmFsc2UpOwotCX0KLQkKLQl2b2lkIHJlc2V0RWRpdG9ycyAoYm9vbGVhbiB0YWIpIHsKLQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQlpZiAob2xkSXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgcm93ID0gdGFibGUuaW5kZXhPZiAob2xkSXRlbSk7Ci0JCQkvKiBNYWtlIHN1cmUgdXNlciBoYXMgZW50ZXJlZCB2YWxpZCBkYXRhICovCi0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyICh3aWR0aFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFdJRFRIX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaGVpZ2h0VGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCQlTdHJpbmcudmFsdWVPZiAocm93KSwgY29tYm8uZ2V0VGV4dCAoKSwgd2lkdGhUZXh0LmdldFRleHQgKCksIGhlaWdodFRleHQuZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJc2V0TGF5b3V0RGF0YSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dERhdGEgKCkgewotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJUm93RGF0YSBkYXRhOwotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJd2lkdGggPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFdJRFRIX0NPTCkpLmludFZhbHVlICgpOwotCQkJaGVpZ2h0ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChIRUlHSFRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhID0gbmV3IFJvd0RhdGEgKHdpZHRoLCBoZWlnaHQpOwotCQkJY2hpbGRyZW4gW2ldLnNldExheW91dERhdGEgKGRhdGEpOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIHR5cGUgb2YgbGF5b3V0ICovCi0JCWlmICh2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXJvd0xheW91dC50eXBlID0gU1dULlZFUlRJQ0FMOwotCQl9IGVsc2UgewotCQkJcm93TGF5b3V0LnR5cGUgPSBTV1QuSE9SSVpPTlRBTDsKLQkJfQotCQkKLQkJLyogU2V0IHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nICovCi0JCXRyeSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSBuZXcgSW50ZWdlciAobWFyZ2luUmlnaHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSAzOwotCQkJbWFyZ2luUmlnaHQuc2VsZWN0ICgxKTsKLQkJfQotCQl0cnkgewotCQkJcm93TGF5b3V0Lm1hcmdpbkxlZnQgPSBuZXcgSW50ZWdlciAobWFyZ2luTGVmdC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5tYXJnaW5MZWZ0ID0gMzsKLQkJCW1hcmdpbkxlZnQuc2VsZWN0ICgxKTsKLQkJfQotCQl0cnkgewotCQkJcm93TGF5b3V0Lm1hcmdpblRvcCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5Ub3AuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luVG9wID0gMzsKLQkJCW1hcmdpblRvcC5zZWxlY3QgKDEpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gbmV3IEludGVnZXIgKG1hcmdpbkJvdHRvbS5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5tYXJnaW5Cb3R0b20gPSAzOwotCQkJbWFyZ2luQm90dG9tLnNlbGVjdCAoMSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJvd0xheW91dC5zcGFjaW5nID0gbmV3IEludGVnZXIgKHNwYWNpbmcuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyb3dMYXlvdXQuc3BhY2luZyA9IDM7Ci0JCQlzcGFjaW5nLnNlbGVjdCAoMSk7Ci0JCX0KLQkJCi0JCS8qIFNldCB0aGUgb3RoZXIgbGF5b3V0IHByb3BlcnRpZXMgKi8KLQkJcm93TGF5b3V0LndyYXAgPSB3cmFwLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LnBhY2sgPSBwYWNrLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0Lmp1c3RpZnkgPSBqdXN0aWZ5LmdldFNlbGVjdGlvbiAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlZmU3ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotIAotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIDxjb2RlPlRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgZXZlcnkgcGFnZQotICogaW4gdGhlIGV4YW1wbGUncyB0YWIgZm9sZGVyLiAgRWFjaCBwYWdlIGluIHRoZSB0YWIgZm9sZGVyCi0gKiBkaXNwbGF5cyBhIGxheW91dCwgYW5kIGFsbG93cyB0aGUgdXNlciB0byBtYW5pcHVsYXRlIHRoZQotICogbGF5b3V0LgotICoKLSAqIEEgdHlwaWNhbCBwYWdlIGluIGEgVGFiIGNvbnRhaW5zIGEgdHdvIGNvbHVtbiBjb21wb3NpdGUuCi0gKiBUaGUgbGVmdCBjb2x1bW4gY29udGFpbnMgdGhlIGxheW91dCBncm91cCwgd2hpY2ggY29udGFpbnMKLSAqIHRoZSAibGF5b3V0IGNvbXBvc2l0ZSIgKHRoZSBvbmUgdGhhdCBoYXMgdGhlIGV4YW1wbGUgbGF5b3V0KS4KLSAqIFRoZSByaWdodCBjb2x1bW4gY29udGFpbnMgdGhlICJjb250cm9sIiBncm91cC4gVGhlICJjb250cm9sIgotICogZ3JvdXAgYWxsb3dzIHRoZSB1c2VyIHRvIGludGVyYWN0IHdpdGggdGhlIGV4YW1wbGUuIFR5cGljYWwKLSAqIG9wZXJhdGlvbnMgYXJlIG1vZGlmeWluZyBsYXlvdXQgcGFyYW1ldGVycywgYWRkaW5nIGNoaWxkcmVuCi0gKiB0byB0aGUgImxheW91dCBjb21wb3NpdGUiLCBhbmQgbW9kaWZ5aW5nIGNoaWxkIGxheW91dCBkYXRhLgotICogVGhlICJDb2RlIiBidXR0b24gaW4gdGhlICJjb250cm9sIiBncm91cCBvcGVucyBhIG5ldyB3aW5kb3cKLSAqIGNvbnRhaW5pbmcgY29kZSB0aGF0IHdpbGwgcmVnZW5lcmF0ZSB0aGUgbGF5b3V0LiBUaGlzIGNvZGUKLSAqIChvciBwYXJ0cyBvZiBpdCkgY2FuIGJlIHNlbGVjdGVkIGFuZCBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVGFiIHsJCi0JLyogQ29tbW9uIGdyb3VwcyBhbmQgY29tcG9zaXRlcyAqLwotCUNvbXBvc2l0ZSB0YWJGb2xkZXJQYWdlOwotCVNhc2hGb3JtIHNhc2g7Ci0JR3JvdXAgbGF5b3V0R3JvdXAsIGNvbnRyb2xHcm91cCwgY2hpbGRHcm91cDsKLQkvKiBUaGUgY29tcG9zaXRlIHRoYXQgY29udGFpbnMgdGhlIGV4YW1wbGUgbGF5b3V0ICovCi0JQ29tcG9zaXRlIGxheW91dENvbXBvc2l0ZTsKLQkvKiBDb21tb24gY29udHJvbHMgZm9yIG1vZGlmeWluZyB0aGUgZXhhbXBsZSBsYXlvdXQgKi8KLQlTdHJpbmcgW10gbmFtZXM7Ci0JQ29udHJvbCBbXSBjaGlsZHJlbjsKLQlCdXR0b24gc2l6ZSwgYWRkLCBkZWxldGUsIGNsZWFyLCBjb2RlOwotCS8qIENvbW1vbiB2YWx1ZXMgZm9yIHdvcmtpbmcgd2l0aCBUYWJsZUVkaXRvcnMgKi8KLQlUYWJsZSB0YWJsZTsKLQlpbnQgaW5kZXg7Ci0JVGFibGVJdGVtIG5ld0l0ZW0sIGxhc3RTZWxlY3RlZDsKLQlWZWN0b3IgZGF0YSA9IG5ldyBWZWN0b3IgKCk7Ci0JLyogQ29udHJvbGxpbmcgaW5zdGFuY2UgKi8KLQlmaW5hbCBMYXlvdXRFeGFtcGxlIGluc3RhbmNlOwotCi0JLyogTGlzdGVuZXJzICovCi0JU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlyZXNldEVkaXRvcnMgKCk7Ci0JCX0KLQl9OwotCQkKLQlUcmF2ZXJzZUxpc3RlbmVyIHRyYXZlcnNlTGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZCAoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQl0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjaGlsZCIgZ3JvdXAuIFRoaXMgaXMgdGhlIGdyb3VwIHRoYXQgYWxsb3dzCi0JICogeW91IHRvIGFkZCBjaGlsZHJlbiB0byB0aGUgbGF5b3V0LiBJdCBleGlzdHMgd2l0aGluIHRoZQotCSAqIGNvbnRyb2xHcm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkR3JvdXAgKCkgewotCQljaGlsZEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY2hpbGRHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaGlsZHJlbiIpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljaGlsZEdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNoaWxkR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7IAotCQljcmVhdGVDaGlsZFdpZGdldHMgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciBtb2RpZnlpbmcgdGhlICJjaGlsZHJlbiIgCi0JICogdGFibGUsIGFuZCB0aGUgdGFibGUgaXRzZWxmLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYXVnbWVudCB0aGUKLQkgKiBzdGFuZGFyZCB0YWJsZS4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGNoaWxkcmVuICovCi0JCWFkZCA9IG5ldyBCdXR0b24gKGNoaWxkR3JvdXAsIFNXVC5QVVNIKTsKLQkJYWRkLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBZGQiKSk7Ci0JCWFkZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRlbGV0ZSA9IG5ldyBCdXR0b24gKGNoaWxkR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVsZXRlLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJEZWxldGUiKSk7Ci0JCWRlbGV0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRlbGV0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJaW50IFtdIHNlbGVjdGVkID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCQl0YWJsZS5yZW1vdmUgKHNlbGVjdGVkKTsKLQkJCQkvKiBSZWZyZXNoIHRoZSBjb250cm9sIGluZGljZXMgb2YgdGhlIHRhYmxlICovCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQkJCXRhYmxlLmdldEl0ZW0gKGkpLnNldFRleHQgKDAsIFN0cmluZy52YWx1ZU9mIChpKSk7Ci0JCQkJfQotCQkJCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWNsZWFyID0gbmV3IEJ1dHRvbiAoY2hpbGRHcm91cCwgU1dULlBVU0gpOwotCQljbGVhci5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2xlYXIiKSk7Ci0JCWNsZWFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY2xlYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCWNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2hpbGRyZW4gW2ldLmRpc3Bvc2UgKCk7Ci0JCQkJfQotCQkJCXRhYmxlLnJlbW92ZUFsbCAoKTsKLQkJCQlkYXRhLmNsZWFyICgpOwotCQkJCWNoaWxkcmVuID0gbmV3IENvbnRyb2wgWzBdOwotCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkvKiBDcmVhdGUgdGhlICJjaGlsZHJlbiIgdGFibGUgKi8KLQkJdGFibGUgPSBuZXcgVGFibGUgKGNoaWxkR3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSElERV9TRUxFQ1RJT04pOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQl0YWJsZS5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJCi0JCS8qIEFkZCBjb2x1bW5zIHRvIHRoZSB0YWJsZSAqLwotCQlTdHJpbmcgW10gY29sdW1uSGVhZGVycyA9IGdldExheW91dERhdGFGaWVsZE5hbWVzICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQgKGNvbHVtbkhlYWRlcnMgW2ldKTsKLQkJCWlmIChpID09IDApIGNvbHVtbi5zZXRXaWR0aCAoMjApOwotCQkJZWxzZSBpZiAoaSA9PSAxKSBjb2x1bW4uc2V0V2lkdGggKDgwKTsKLQkJCWVsc2UgY29sdW1uLnBhY2sgKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWJsZUVkaXRvciB3aXRoIGEgQ0NvbWJvIGluIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBvZiB0aGUgdGFibGUuIFRoaXMgQ0NvbWJvIGxpc3RzIGFsbCB0aGUgY29udHJvbHMgdGhhdAotCSAqIHRoZSB1c2VyIGNhbiBzZWxlY3QgdG8gcGxhY2Ugb24gdGhlaXIgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlQ29tYm9FZGl0b3IgKENDb21ibyBjb21ibywgVGFibGVFZGl0b3IgY29tYm9FZGl0b3IpIHsKLQkJY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10gewotCQkJIkJ1dHRvbiIsICJDYW52YXMiLCAiQ29tYm8iLCAiQ29tcG9zaXRlIiwKLQkJCSJDb29sQmFyIiwgIkdyb3VwIiwgIkxhYmVsIiwgIkxpc3QiLAotCQkJIlByb2dyZXNzQmFyIiwgIlNjYWxlIiwgIlNsaWRlciIsICJTdHlsZWRUZXh0IiwKLQkJCSJUYWJsZSIsICJUZXh0IiwgIlRvb2xCYXIiLCAiVHJlZSJ9KTsKLQkJY29tYm8uc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0ICgxKSk7Ci0JCQotCQkvKiBTZXQgdXAgZWRpdG9yICovCi0JCWNvbWJvRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJY29tYm9FZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQljb21ib0VkaXRvci5taW5pbXVtV2lkdGggPSA1MDsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChjb21ibywgbmV3SXRlbSwgMSk7Ci0JCQotCQkvKiBBZGQgbGlzdGVuZXIgKi8KLQkJY29tYm8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIAlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgewotICAgICAgICAgICAgICAgIAlkaXNwb3NlRWRpdG9ycyAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiY29udHJvbCIgZ3JvdXAuIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gSXQgY29udGFpbnMgY29udHJvbHMKLQkgKiBmb3IgYWRkaW5nIG5ldyBjaGlsZHJlbiB0byB0aGUgbGF5b3V0Q29tcG9zaXRlLCBhbmQKLQkgKiBmb3IgbW9kaWZ5aW5nIHRoZSBjaGlsZHJlbidzIGxheW91dCBkYXRhLgotCSAqLwkKLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAoc2FzaCwgU1dULk5PTkUpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQlzaXplID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaXplLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJQcmVmZXJyZWRfU2l6ZSIpKTsKLQkJc2l6ZS5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJc2l6ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJaWYgKHNpemUuZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKCkpOwotCQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzaXplLnNldExheW91dERhdGEgKGRhdGEpOwotCQljcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQl9Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50Ci0JICogdGhlIHN0YW5kYXJkIGNvbnRyb2xzIGNyZWF0ZWQuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCWNyZWF0ZUNoaWxkR3JvdXAgKCk7Ci0JCWNvZGUgPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5QVVNIKTsKLQkJY29kZS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ29kZSIpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb2RlLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkJY29kZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoKTsJCi0JCQkJc2hlbGwuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkdlbmVyYXRlZF9Db2RlIikpOwotCQkJCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQkJCWZpbmFsIFN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQkJU3RyaW5nIGxheW91dENvZGUgPSBnZW5lcmF0ZUNvZGUgKCkudG9TdHJpbmcgKCk7Ci0JCQkJaWYgKGxheW91dENvZGUubGVuZ3RoICgpID09IDApIHJldHVybjsKLQkJCQl0ZXh0LnNldFRleHQgKGxheW91dENvZGUpOwotCQkJCQotCQkJCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQkJCQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCQkJCU1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQkJCQllZGl0SXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRWRpdCIpKTsKLQkJCQlNZW51IG1lbnUgPSBuZXcgTWVudSAoYmFyKTsKLQkJCQlNZW51SXRlbSBzZWxlY3QgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQlzZWxlY3Quc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9BbGwiKSk7Ci0JCQkJc2VsZWN0LnNldEFjY2VsZXJhdG9yIChTV1QuTU9EMSArICdBJyk7Ci0JCQkJc2VsZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCU1lbnVJdGVtIGNvcHkgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQljb3B5LnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb3B5IikpOwotCQkJCWNvcHkuc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0MnKTsKLQkJCQljb3B5LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQl0ZXh0LmNvcHkgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlNZW51SXRlbSBleGl0ID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQkJZXhpdC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRXhpdCIpKTsKLQkJCQlleGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlzaGVsbC5jbG9zZSAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWVkaXRJdGVtLnNldE1lbnUgKG1lbnUpOwotCQkJCQotCQkJCXNoZWxsLnBhY2sgKCk7Ci0JCQkJc2hlbGwuc2V0U2l6ZSAoNDAwLCA1MDApOwotCQkJCXNoZWxsLm9wZW4gKCk7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpCi0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29tcG9zaXRlIHRoYXQgY29udGFpbnMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0Q29tcG9zaXRlICgpIHsKLQkJbGF5b3V0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAobGF5b3V0R3JvdXAsIFNXVC5CT1JERVIpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlTGF5b3V0ICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsYXlvdXQgZ3JvdXAuIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCSAqIGxlZnQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0R3JvdXAgKCkgewotCQlsYXlvdXRHcm91cCA9IG5ldyBHcm91cCAoc2FzaCwgU1dULk5PTkUpOwotCQlsYXlvdXRHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMYXlvdXQiKSk7Ci0JCWxheW91dEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljcmVhdGVMYXlvdXRDb21wb3NpdGUgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJLyogQ3JlYXRlIGEgdHdvIGNvbHVtbiBwYWdlIHdpdGggYSBTYXNoRm9ybSovCi0JCXRhYkZvbGRlclBhZ2UgPSBuZXcgQ29tcG9zaXRlICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJc2FzaCA9IG5ldyBTYXNoRm9ybSAodGFiRm9sZGVyUGFnZSwgU1dULkhPUklaT05UQUwpOwotCQotCQkvKiBDcmVhdGUgdGhlICJsYXlvdXQiIGFuZCAiY29udHJvbCIgY29sdW1ucyAqLwotCQljcmVhdGVMYXlvdXRHcm91cCAoKTsKLQkJY3JlYXRlQ29udHJvbEdyb3VwICgpOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYmxlRWRpdG9yIHdpdGggYSBUZXh0IGluIHRoZSBnaXZlbiBjb2x1bW4KLQkgKiBvZiB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBjcmVhdGVUZXh0RWRpdG9yIChUZXh0IHRleHQsIFRhYmxlRWRpdG9yIHRleHRFZGl0b3IsIGludCBjb2x1bW4pIHsKLQkJdGV4dC5zZXRGb250ICh0YWJsZS5nZXRGb250ICgpKTsKLQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCXRleHRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQl0ZXh0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJdGV4dEVkaXRvci5zZXRFZGl0b3IgKHRleHQsIG5ld0l0ZW0sIGNvbHVtbik7Ci0JCQotCQl0ZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgewotICAgICAgICAgICAgICAgICAgICByZXNldEVkaXRvcnMgKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgewotICAgICAgICAgICAgICAgIAlkaXNwb3NlRWRpdG9ycyAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBjb2RlIG5lZWRlZCB0byBwcm9kdWNlIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8JCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlQ29kZSAoKSB7Ci0JCS8qIE1ha2Ugc3VyZSBhbGwgaW5mb3JtYXRpb24gYmVpbmcgZW50ZXJlZCBpcyBzdG9yZWQgaW4gdGhlIHRhYmxlICovCi0JCXJlc2V0RWRpdG9ycyAoKTsKLQkJCi0JCS8qIEdldCBuYW1lcyBmb3IgY29udHJvbHMgaW4gdGhlIGxheW91dCAqLwotCQluYW1lcyA9IG5ldyBTdHJpbmcgW2NoaWxkcmVuLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuIFtpXTsKLQkJCVN0cmluZyBjb250cm9sQ2xhc3MgPSBjb250cm9sLmdldENsYXNzICgpLnRvU3RyaW5nICgpOwotCQkJU3RyaW5nIGNvbnRyb2xUeXBlID0gY29udHJvbENsYXNzLnN1YnN0cmluZyAoY29udHJvbENsYXNzLmxhc3RJbmRleE9mICgnLicpICsgMSk7Ci0JCQluYW1lcyBbaV0gPSBjb250cm9sVHlwZS50b0xvd2VyQ2FzZSAoKSArIGk7Ci0JCX0KLQkKLQkJLyogQ3JlYXRlIFN0cmluZ0J1ZmZlciBjb250YWluaW5nIHRoZSBjb2RlICovCi0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjtcbiIpOwotCQljb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qO1xuXG4iKTsKLQkJY29kZS5hcHBlbmQgKCJwdWJsaWMgY2xhc3MgTXlMYXlvdXQge1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHREaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7XG4iKTsKLQkJCi0JCS8qIEdldCBsYXlvdXQgc3BlY2lmaWMgY29kZSAqLwotCQljb2RlLmFwcGVuZCAoZ2VuZXJhdGVMYXlvdXRDb2RlICgpKTsKLQkJCi0JCWNvZGUuYXBwZW5kICgiXG5cdFx0c2hlbGwucGFjayAoKTtcblx0XHRzaGVsbC5vcGVuICgpO1xuXG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0d2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0XHRpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKVxuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFx0XHRkaXNwbGF5LnNsZWVwICgpO1xuXHRcdH1cblx0XHRkaXNwbGF5LmRpc3Bvc2UgKCk7XG5cdH1cbn0iKTsKLQkJCi0JCXJldHVybiBjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgbGF5b3V0IHNwZWNpZmljIGNvZGUgZm9yIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nQnVmZmVyIGZvciB0aGUgY29kZSB3aGljaCB3aWxsIAotCSAqIGNyZWF0ZSBhIGNoaWxkIGNvbnRyb2wuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdldENoaWxkQ29kZSAoQ29udHJvbCBjb250cm9sLCBpbnQgaSkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCS8qIEZpbmQgdGhlIHR5cGUgb2YgY29udHJvbCAqLwotCQlTdHJpbmcgY29udHJvbENsYXNzID0gY29udHJvbC5nZXRDbGFzcygpLnRvU3RyaW5nICgpOwotCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJLyogRmluZCB0aGUgc3R5bGUgb2YgdGhlIGNvbnRyb2wgKi8KLQkJU3RyaW5nIHN0eWxlU3RyaW5nOwotCQlpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQnV0dG9uIikpIHsKLQkJCXN0eWxlU3RyaW5nID0gIlNXVC5QVVNIIjsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUZXh0IikpIHsKLQkJCXN0eWxlU3RyaW5nID0gIlNXVC5CT1JERVIiOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlN0eWxlZFRleHQiKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCI7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQ2FudmFzIikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiQ29tcG9zaXRlIikgfHwgCi0JCQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIlRhYmxlIikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpIHx8Ci0JCQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIlRvb2xCYXIiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJUcmVlIikgfHwKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiTGlzdCIpKSB7Ci0JCQlzdHlsZVN0cmluZyA9ICJTV1QuQk9SREVSIjsKLQkJfSBlbHNlIHN0eWxlU3RyaW5nID0gIlNXVC5OT05FIjsKLQkJLyogV3JpdGUgb3V0IHRoZSBjb250cm9sIGJlaW5nIGRlY2xhcmVkICovCi0JCWNvZGUuYXBwZW5kICgiXG5cdFx0IiArIGNvbnRyb2xUeXBlICsgIiAiICsgbmFtZXMgW2ldICsgCi0JCQkJCSAiID0gbmV3ICIgKyBjb250cm9sVHlwZSArICIgKHNoZWxsLCAiICsgc3R5bGVTdHJpbmcgKyAiKTtcbiIpOwotCQkvKiBBZGQgaXRlbXMgdG8gdGhvc2UgY29udHJvbHMgdGhhdCBuZWVkIGl0ZW1zICovCi0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDb21ibyIpIHx8IGNvbnRyb2xUeXBlLmVxdWFscyAoIkxpc3QiKSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10ge1wiSXRlbSAxXCIsIFwiSXRlbSAyXCIsIFwiSXRlbSAyXCJ9KTtcbiIpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlRhYmxlIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7XG4iKTsKLQkJCWZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0VGFibGVJdGVtIHRhYmxlSXRlbSIgKyBqICsgIiA9IG5ldyBUYWJsZUl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHR0YWJsZUl0ZW0iICsgaiArICIuc2V0VGV4dCAoXCJJdGVtIiArIGogKyAiXCIpO1xuIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVHJlZSIpKSB7Ci0JCQlmb3IgKGludCBqID0gMTsgaiA8IDM7IGorKykgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdFRyZWVJdGVtIHRyZWVJdGVtIiArIGogKyAiID0gbmV3IFRyZWVJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0dHJlZUl0ZW0iICsgaiArICIuc2V0VGV4dCAoXCJJdGVtIiArIGogKyAiXCIpO1xuIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVG9vbEJhciIpKSB7Ci0JCQlmb3IgKGludCBqID0gMTsgaiA8IDM7IGorKykgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdFRvb2xJdGVtIHRvb2xJdGVtIiArIGogKyAiID0gbmV3IFRvb2xJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0dG9vbEl0ZW0iICsgaiArICIuc2V0VGV4dCAoXCJJdGVtIiArIGogKyAiXCIpO1xuIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQ29vbEJhciIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRUb29sQmFyIGNvb2xUb29sQmFyID0gbmV3IFRvb2xCYXIgKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuQk9SREVSKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0VG9vbEl0ZW0gY29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDFcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbSA9IG5ldyBUb29sSXRlbSAoY29vbFRvb2xCYXIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtLnNldFRleHQgKFwiSXRlbSAyXCIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRDb29sSXRlbSBjb29sSXRlbTEgPSBuZXcgQ29vbEl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xJdGVtMS5zZXRDb250cm9sIChjb29sVG9vbEJhcik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdFBvaW50IHNpemUgPSBjb29sVG9vbEJhci5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0xLnNldFNpemUgKGNvb2xJdGVtMS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xCYXIgPSBuZXcgVG9vbEJhciAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5CT1JERVIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gM1wiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDRcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdENvb2xJdGVtIGNvb2xJdGVtMiA9IG5ldyBDb29sSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0yLnNldENvbnRyb2wgKGNvb2xUb29sQmFyKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0c2l6ZSA9IGNvb2xUb29sQmFyLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTIuc2V0U2l6ZSAoY29vbEl0ZW0yLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRTaXplICgiICsgbmFtZXMgW2ldICsgIi5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7XG4iKTsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJQcm9ncmVzc0JhciIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRTZWxlY3Rpb24gKDUwKTtcbiIpOwotCQl9IAotCQkvKiBTZXQgdGV4dCBmb3IgdGhvc2UgY29udHJvbHMgdGhhdCBzdXBwb3J0IGl0ICovCQkJIAotCQlpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQnV0dG9uIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkNvbWJvIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkdyb3VwIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkxhYmVsIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIlN0eWxlZFRleHQiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVGV4dCIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRUZXh0IChcIiIgKyBuYW1lcyBbaV0gKyAiXCIpO1xuIik7Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YSBmaWVsZCBuYW1lcy4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcyAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHt9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgY29tcG9zaXRlIGFuZCBkcmF3cyBhbGwgY29udHJvbHMKLQkgKiBpbiB0aGUgbGF5b3V0IGV4YW1wbGUuCi0JICovCi0Jdm9pZCByZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpIHsKLQkJLyogUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIGFscmVhZHkgbGFpZCBvdXQgKi8KLQkJY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNoaWxkcmVuIFtpXS5kaXNwb3NlICgpOwotCQl9Ci0JCS8qIEFkZCBhbGwgY2hpbGRyZW4gbGlzdGVkIGluIHRoZSB0YWJsZSAqLwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJY2hpbGRyZW4gPSBuZXcgQ29udHJvbCBbaXRlbXMubGVuZ3RoXTsKLQkJU3RyaW5nIFtdIGl0ZW1WYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCUxheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSwKLQkJCUxheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSwKLQkJCUxheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMyJ9KX07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjb250cm9sID0gaXRlbXMgW2ldLmdldFRleHQgKDEpOwotCQkJaWYgKGNvbnRyb2wuZXF1YWxzICgiQnV0dG9uIikpIHsKLQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAobGF5b3V0Q29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQkJYnV0dG9uLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCdXR0b25fSW5kZXgiLCBuZXcgU3RyaW5nIFtdIHtuZXcgSW50ZWdlciAoaSkudG9TdHJpbmcgKCl9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gYnV0dG9uOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNhbnZhcyIpKSB7Ci0JCQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJY2hpbGRyZW4gW2ldID0gY2FudmFzOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNvbWJvIikpIHsKLQkJCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJY29tYm8uc2V0SXRlbXMgKGl0ZW1WYWx1ZXMpOwotCQkJCWNvbWJvLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb21ib19JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjb21ibzsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJDb21wb3NpdGUiKSkgeyAKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjb21wb3NpdGU7Ci0JCSAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ29vbEJhciIpKSB7IAotCQkgICAgCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJICAgIAlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgU1dULkJPUkRFUik7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjEifSkpOwotCQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJICAgIAlDb29sSXRlbSBjb29sSXRlbTEgPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIDApOwotCQkgICAgCWNvb2xJdGVtMS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIFNXVC5CT1JERVIpOwotCQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIzIn0pKTsKLQkJCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiNCJ9KSk7Ci0JCSAgICAJQ29vbEl0ZW0gY29vbEl0ZW0yID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCAwKTsKLQkJICAgIAljb29sSXRlbTIuc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCSAgICAJUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgCQljb29sSXRlbTEuc2V0U2l6ZShjb29sSXRlbTEuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0gICAgICAgIAkJY29vbEl0ZW0yLnNldFNpemUoY29vbEl0ZW0yLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpOwotICAgICAgIAkJCWNvb2xCYXIuc2V0U2l6ZShjb29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNvb2xCYXI7Ci0JCSAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiR3JvdXAiKSkgewotCQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiR3JvdXBfSW5kZXgiLCBuZXcgU3RyaW5nIFtdIHtuZXcgSW50ZWdlciAoaSkudG9TdHJpbmcgKCl9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gZ3JvdXA7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiTGFiZWwiKSkgewotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGFiZWxfSW5kZXgiLCBuZXcgU3RyaW5nIFtdIHtuZXcgSW50ZWdlciAoaSkudG9TdHJpbmcgKCl9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gbGFiZWw7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiTGlzdCIpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IExpc3QgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJbGlzdC5zZXRJdGVtcyAoaXRlbVZhbHVlcyk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gbGlzdDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJQcm9ncmVzc0JhciIpKSB7Ci0JCQkJUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCXByb2dyZXNzLnNldFNlbGVjdGlvbiAoNTApOwotCQkJCWNoaWxkcmVuIFtpXSA9IHByb2dyZXNzOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlNjYWxlIikpIHsKLQkJCQlTY2FsZSBzY2FsZSA9IG5ldyBTY2FsZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gc2NhbGU7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiU2xpZGVyIikpIHsKLQkJCQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gc2xpZGVyOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlN0eWxlZFRleHQiKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0IChsYXlvdXRDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJCXN0eWxlZFRleHQuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlN0eWxlZFRleHRfSW5kZXgiLCBuZXcgU3RyaW5nIFtdIHtuZXcgSW50ZWdlciAoaSkudG9TdHJpbmcgKCl9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gc3R5bGVkVGV4dDsJCQkKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJUYWJsZSIpKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTEgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0YWJsZTsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJUZXh0IikpIHsKLQkJCQlUZXh0IHRleHQgPSBuZXcgVGV4dCAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQl0ZXh0LnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUZXh0X0luZGV4IiwgbmV3IFN0cmluZyBbXSB7bmV3IEludGVnZXIgKGkpLnRvU3RyaW5nICgpfSkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHRleHQ7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiVG9vbEJhciIpKSB7Ci0JCQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJVG9vbEl0ZW0gaXRlbTEgPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0xLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJVG9vbEl0ZW0gaXRlbTIgPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0yLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdG9vbEJhcjsKLQkJCX0gZWxzZSB7Ci0JCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQkJCWl0ZW0xLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQkJCWl0ZW0yLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdHJlZTsKLQkJCX0gCi0JCX0KLQl9CQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoKSB7Ci0JCXJlc2V0RWRpdG9ycyAoZmFsc2UpOwotCX0KLQkKLQl2b2lkIHJlc2V0RWRpdG9ycyAoYm9vbGVhbiB0YWIpIHsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LiAKLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIHNldExheW91dFN0YXRlICgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9BaXJicnVzaFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJjNmY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBbiBhaXJicnVzaCB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgQWlyYnJ1c2hUb29sIGV4dGVuZHMgQ29udGludW91c1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JcHJpdmF0ZSBSYW5kb20gcmFuZG9tOwotCXByaXZhdGUgaW50IGNhY2hlZFJhZGl1c1NxdWFyZWQ7Ci0JcHJpdmF0ZSBpbnQgY2FjaGVkTnVtUG9pbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBBaXJicnVzaFRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlyYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JCXNldFJldHJpZ2dlclRpbWVyKDEwKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCS8vIGNvbXB1dGUgdGhpbmdzIHdlIG5lZWQgdG8ga25vdyBmb3IgZHJhd2luZwotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQkJY2FjaGVkUmFkaXVzU3F1YXJlZCA9IHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXM7Ci0JCWNhY2hlZE51bVBvaW50cyA9IDMxNCAqIHNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5ICogY2FjaGVkUmFkaXVzU3F1YXJlZCAvIDI1MDAwMDsKLQkJaWYgKGNhY2hlZE51bVBvaW50cyA9PSAwICYmIHNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5ICE9IDApCi0JCQljYWNoZWROdW1Qb2ludHMgPSAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLkFpcmJydXNoLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXIoUG9pbnQgcG9pbnQpIHsKLQkJLy8gRHJhd3MgYSBidW5jaCAoY2FjaGVkTnVtUG9pbnRzKSBvZiByYW5kb20gcGl4ZWxzIHdpdGhpbiBhIHNwZWNpZmllZCBjaXJjbGUgKGNhY2hlZFJhZGl1c1NxdWFyZWQpLgotCQlDb250YWluZXJGaWd1cmUgY2ZpZyA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZE51bVBvaW50czsgKytpKSB7Ci0JCQlpbnQgcmFuZFgsIHJhbmRZOwotCQkJZG8gewotCQkJCXJhbmRYID0gKGludCkgKChyYW5kb20ubmV4dERvdWJsZSgpIC0gMC41KSAqIHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogMi4wKTsKLQkJCQlyYW5kWSA9IChpbnQpICgocmFuZG9tLm5leHREb3VibGUoKSAtIDAuNSkgKiBzZXR0aW5ncy5haXJicnVzaFJhZGl1cyAqIDIuMCk7Ci0JCQl9IHdoaWxlIChyYW5kWCAqIHJhbmRYICsgcmFuZFkgKiByYW5kWSA+IGNhY2hlZFJhZGl1c1NxdWFyZWQpOwotCQkJY2ZpZy5hZGQobmV3IFBvaW50RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgcG9pbnQueCArIHJhbmRYLCBwb2ludC55ICsgcmFuZFkpKTsKLQkJfQotCQlnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKGNmaWcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9CYXNpY1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJmZGY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNpY1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogVGhlIHBhaW50IHN1cmZhY2UKLQkgKi8KLQlwcml2YXRlIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnRTZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQl0aGlzLnBhaW50U3VyZmFjZSA9IHBhaW50U3VyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWludCBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhaW50IHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBQYWludFN1cmZhY2UKLQkgKi8KLQlwdWJsaWMgUGFpbnRTdXJmYWNlIGdldFBhaW50U3VyZmFjZSgpIHsKLQkJcmV0dXJuIHBhaW50U3VyZmFjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Db250YWluZXJGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3NTNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQ29udGFpbmVyIGZvciBGaWd1cmUgb2JqZWN0cyB3aXRoIHN0YWNraW5nIHByZXZpZXcgbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9BUlJBWV9TSVpFID0gMTY7Ci0JCi0JRmlndXJlW10gICBvYmplY3RTdGFjayA9IG51bGw7Ci0JaW50ICAgICAgbmV4dEluZGV4ID0gMDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gZW1wdHkgQ29udGFpbmVyCi0JICovCi0JcHVibGljIENvbnRhaW5lckZpZ3VyZSgpIHsKLQl9Ci0JLyoqCi0JICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbnRhaW5lciBmb3IgbGF0ZXIgZHJhd2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBkcmF3aW5nIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoRmlndXJlIG9iamVjdCkgewotCQlpZiAob2JqZWN0U3RhY2sgPT0gbnVsbCkgewotCQkJb2JqZWN0U3RhY2sgPSBuZXcgRmlndXJlW0lOSVRJQUxfQVJSQVlfU0laRV07Ci0JCX0gZWxzZSBpZiAob2JqZWN0U3RhY2subGVuZ3RoIDw9IG5leHRJbmRleCkgewotCQkJRmlndXJlW10gbmV3T2JqZWN0U3RhY2sgPSBuZXcgRmlndXJlW29iamVjdFN0YWNrLmxlbmd0aCAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weShvYmplY3RTdGFjaywgMCwgbmV3T2JqZWN0U3RhY2ssIDAsIG9iamVjdFN0YWNrLmxlbmd0aCk7Ci0JCQlvYmplY3RTdGFjayA9IG5ld09iamVjdFN0YWNrOwotCQl9Ci0JCW9iamVjdFN0YWNrW25leHRJbmRleF0gPSBvYmplY3Q7Ci0JCSsrbmV4dEluZGV4OwotCX0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gbmV4dEluZGV4ID09IDA7Ci0JfQotCS8qKgotCSAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBjb250YWluZXIgYW5kIGRyYXdzIGl0cyBwcmV2aWV3IHRoZW4gdXBkYXRlcyB0aGUgc3VwcGxpZWQgcHJldmlldyBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBkcmF3aW5nIGxpc3QKLQkgKiBAcGFyYW0gZ2MgdGhlIEdDIHRvIGRyYXcgb24KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gYWRkIHRvIHZpcnR1YWwgY29vcmRpbmF0ZXMgdG8gZ2V0IGRpc3BsYXkgY29vcmRpbmF0ZXMKLQkgKiBAcGFyYW0gcmVtZW1iZXJlZFN0YXRlIHRoZSBzdGF0ZSByZXR1cm5lZCBieSBhIHByZXZpb3VzIGRyYXdQcmV2aWV3KCkgb3IgYWRkQW5kUHJldmlldygpCi0JICogICAgICAgIHVzaW5nIHRoaXMgQ29udGFpbmVyLCBtYXkgYmUgbnVsbCBpZiB0aGVyZSB3YXMgbm8gc3VjaCBwcmV2aW91cyBjYWxsCi0JICogQHJldHVybiBvYmplY3Qgc3RhdGUgdGhhdCBtdXN0IGJlIHBhc3NlZCB0byBlcmFzZVByZXZpZXcoKSBsYXRlciB0byBlcmFzZSB0aGlzIG9iamVjdAotCSAqLwotLy8JcHVibGljIE9iamVjdCBhZGRBbmRQcmV2aWV3KEZpZ3VyZSBvYmplY3QsIEdDIGdjLCBQb2ludCBvZmZzZXQsIE9iamVjdCByZW1lbWJlcmVkU3RhdGUpIHsKLS8vCQlPYmplY3RbXSBzdGF0ZVN0YWNrID0gKE9iamVjdFtdKSByZW1lbWJlcmVkU3RhdGU7Ci0vLwkJaWYgKHN0YXRlU3RhY2sgPT0gbnVsbCkgewotLy8JCQlzdGF0ZVN0YWNrID0gbmV3IE9iamVjdFtJTklUSUFMX0FSUkFZX1NJWkVdOwotLy8JCX0gZWxzZSBpZiAoc3RhdGVTdGFjay5sZW5ndGggPD0gbmV4dEluZGV4KSB7Ci0vLwkJCU9iamVjdFtdIG5ld1N0YXRlU3RhY2sgPSBuZXcgT2JqZWN0W3N0YXRlU3RhY2subGVuZ3RoICogMl07Ci0vLwkJCVN5c3RlbS5hcnJheWNvcHkoc3RhdGVTdGFjaywgMCwgbmV3U3RhdGVTdGFjaywgMCwgc3RhdGVTdGFjay5sZW5ndGgpOwotLy8JCQlzdGF0ZVN0YWNrID0gbmV3U3RhdGVTdGFjazsKLS8vCQl9Ci0vLwkJYWRkKG9iamVjdCk7Ci0vLwkJc3RhdGVTdGFja1tuZXh0SW5kZXggLSAxXSA9IG9iamVjdC5kcmF3UHJldmlldyhnYywgb2Zmc2V0KTsKLS8vCQlyZXR1cm4gc3RhdGVTdGFjazsKLS8vCX0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNvbnRhaW5lci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgZXJhc2VQcmV2aWV3KCkgY2Fubm90IGJlIGNhbGxlZCBhZnRlciB0aGlzIHBvaW50IHRvIGVyYXNlIGFueSBwcmV2aW91cwotCSAqIGRyYXdQcmV2aWV3KCkncy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXdoaWxlICgtLW5leHRJbmRleCA+IDApIG9iamVjdFN0YWNrW25leHRJbmRleF0gPSBudWxsOwotCQluZXh0SW5kZXggPSAwOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRJbmRleDsgKytpKSBvYmplY3RTdGFja1tpXS5kcmF3KGZkYyk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dEluZGV4OyArK2kpIG9iamVjdFN0YWNrW2ldLmFkZERhbWFnZWRSZWdpb24oZmRjLCByZWdpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNTM1MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Db250aW51b3VzUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgZHJhdyBjb250aW51b3VzbHkgYWxvbmcgdGhlIHBhdGgKLSAqIHRyYWNlZCBieSB0aGUgbW91c2UncyBtb3ZlbWVudCB3aGlsZSB0aGUgYnV0dG9uIGlzIGRlcHJlc3NlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGludW91c1BhaW50U2Vzc2lvbiBleHRlbmRzIEJhc2ljUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUcnVlIGlmIGEgY2xpY2stZHJhZyBpcyBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBBIGNhY2hlZCBQb2ludCBhcnJheSBmb3IgZHJhd2luZy4KLQkgKi8KLQlwcml2YXRlIFBvaW50W10gcG9pbnRzID0gbmV3IFBvaW50W10geyBuZXcgUG9pbnQoLTEsIC0xKSwgbmV3IFBvaW50KC0xLCAtMSkgfTsKLQotCS8qKgotCSAqIFRoZSB0aW1lIHRvIHdhaXQgYmV0d2VlbiByZXRyaWdnZXJzIGluIG1pbGxpc2Vjb25kcy4KLQkgKi8KLQlwcml2YXRlIGludCByZXRyaWdnZXJJbnRlcnZhbCA9IDA7Ci0JCi0JLyoqCi0JICogVGhlIGN1cnJlbnRseSB2YWxpZCBSZXRyaWdnZXJIYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIFJ1bm5hYmxlIHJldHJpZ2dlckhhbmRsZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIENvbnRpbnVvdXNQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBDb250aW51b3VzUGFpbnRTZXNzaW9uKFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXRyaWdnZXIgdGltZXIuCi0JICogPHA+Ci0JICogQWZ0ZXIgdGhlIHRpbWVyIGVsYXBzZXMsIGlmIHRoZSBtb3VzZSBpcyBzdGlsbCBob3ZlcmluZyBvdmVyIHRoZSBzYW1lIHBvaW50IHdpdGggdGhlCi0JICogZHJhZyBidXR0b24gcHJlc3NlZCwgYSBuZXcgcmVuZGVyIG9yZGVyIGlzIGlzc3VlZCBhbmQgdGhlIHRpbWVyIGlzIHJlc3RhcnRlZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGludGVydmFsIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJldHdlZW4gcmV0cmlnZ2VycywgMCB0byBkaXNhYmxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0cmlnZ2VyVGltZXIoaW50IGludGVydmFsKSB7Ci0JCXJldHJpZ2dlckludGVydmFsID0gaW50ZXJ2YWw7Ci0JfQotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuCi0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5Db250aW51b3VzUGFpbnQubWVzc2FnZSIpKTsKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHRvb2wuCi0gICAgICovCi0JcHVibGljIHZvaWQgZW5kU2Vzc2lvbigpIHsKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQWJvcnRzIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWFib3J0UmV0cmlnZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlOwotCi0JCXBvaW50c1swXS54ID0gZXZlbnQueDsKLQkJcG9pbnRzWzBdLnkgPSBldmVudC55OwotCQlyZW5kZXIocG9pbnRzWzBdKTsKLQkJcHJlcGFyZVJldHJpZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmICghIGRyYWdJblByb2dyZXNzKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWFib3J0UmV0cmlnZ2VyKCk7Ci0JCW1vdXNlU2VnbWVudEZpbmlzaGVkKGV2ZW50KTsKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlwcy5zZXRTdGF0dXNDb29yZChwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCWlmICghIGRyYWdJblByb2dyZXNzKSByZXR1cm47Ci0JCW1vdXNlU2VnbWVudEZpbmlzaGVkKGV2ZW50KTsKLQkJcHJlcGFyZVJldHJpZ2dlcigpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYSByZW5kZXJpbmcgc2VnbWVudAotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIG1vdXNlU2VnbWVudEZpbmlzaGVkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHBvaW50c1swXS54ID09IC0xKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWlmIChwb2ludHNbMF0ueCAhPSBldmVudC54IHx8IHBvaW50c1swXS55ICE9IGV2ZW50LnkpIHsKLQkJCS8vIGRyYXcgbmV3IHNlZ21lbnQKLQkJCXBvaW50c1sxXS54ID0gZXZlbnQueDsKLQkJCXBvaW50c1sxXS55ID0gZXZlbnQueTsKLQkJCXJlbmRlckNvbnRpbnVvdXNTZWdtZW50KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyBhIGNvbnRpbnVvdXMgc2VnbWVudCBmcm9tIHBvaW50c1swXSB0byBwb2ludHNbMV0uCi0JICogQXNzdW1lcyBwb2ludHNbMF0gaGFzIGJlZW4gZHJhd24gYWxyZWFkeS4KLQkgKiAKLQkgKiBAcG9zdCBwb2ludHNbMF0gd2lsbCByZWZlciB0byB0aGUgc2FtZSBwb2ludCBhcyBwb2ludHNbMV0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb250aW51b3VzU2VnbWVudCgpIHsKLQkJLyogQSBsYXp5IGJ1dCBlZmZlY3RpdmUgbGluZSBkcmF3aW5nIGFsZ29yaXRobSAqLwotCQlmaW5hbCBpbnQgZFggPSBwb2ludHNbMV0ueCAtIHBvaW50c1swXS54OwotCQlmaW5hbCBpbnQgZFkgPSBwb2ludHNbMV0ueSAtIHBvaW50c1swXS55OwotCQlpbnQgYWJzZFggPSBNYXRoLmFicyhkWCk7Ci0JCWludCBhYnNkWSA9IE1hdGguYWJzKGRZKTsKLQotCQlpZiAoKGRYID09IDApICYmIChkWSA9PSAwKSkgcmV0dXJuOwotCQkKLQkJaWYgKGFic2RZID4gYWJzZFgpIHsKLQkJCWZpbmFsIGludCBpbmNmcFggPSAoZFggPDwgMTYpIC8gYWJzZFk7Ci0JCQlmaW5hbCBpbnQgaW5jWSA9IChkWSA+IDApID8gMSA6IC0xOwotCQkJaW50IGZwWCA9IHBvaW50c1swXS54IDw8IDE2OyAvLyBYIGluIGZpeGVkcG9pbnQgZm9ybWF0Ci0KLQkJCXdoaWxlICgtLWFic2RZID49IDApIHsKLQkJCQlwb2ludHNbMF0ueSArPSBpbmNZOwotCQkJCXBvaW50c1swXS54ID0gKGZwWCArPSBpbmNmcFgpID4+IDE2OwotCQkJCXJlbmRlcihwb2ludHNbMF0pOwotCQkJfQotCQkJaWYgKHBvaW50c1swXS54ID09IHBvaW50c1sxXS54KSByZXR1cm47Ci0JCQlwb2ludHNbMF0ueCA9IHBvaW50c1sxXS54OwotCQl9IGVsc2UgewotCQkJZmluYWwgaW50IGluY2ZwWSA9IChkWSA8PCAxNikgLyBhYnNkWDsKLQkJCWZpbmFsIGludCBpbmNYID0gKGRYID4gMCkgPyAxIDogLTE7Ci0JCQlpbnQgZnBZID0gcG9pbnRzWzBdLnkgPDwgMTY7IC8vIFkgaW4gZml4ZWRwb2ludCBmb3JtYXQKLQotCQkJd2hpbGUgKC0tYWJzZFggPj0gMCkgewotCQkJCXBvaW50c1swXS54ICs9IGluY1g7Ci0JCQkJcG9pbnRzWzBdLnkgPSAoZnBZICs9IGluY2ZwWSkgPj4gMTY7Ci0JCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQl9Ci0JCQlpZiAocG9pbnRzWzBdLnkgPT0gcG9pbnRzWzFdLnkpIHJldHVybjsKLQkJCXBvaW50c1swXS55ID0gcG9pbnRzWzFdLnk7Ci0JCX0KLQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JfQkJCi0KLQkvKioKLQkgKiBQcmVwYXJlIHRoZSByZXRyaWdnZXIgdGltZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgcHJlcGFyZVJldHJpZ2dlcigpIHsKLQkJaWYgKHJldHJpZ2dlckludGVydmFsID4gMCkgewotCQkJLyoKLQkJCSAqIHRpbWVyRXhlYygpIHByb3ZpZGVzIGEgbGlnaHR3ZWlnaHQgbWVjaGFuaXNtIGZvciBydW5uaW5nIGNvZGUgYXQgaW50ZXJ2YWxzIGZyb20gd2l0aGluCi0JCQkgKiB0aGUgZXZlbnQgbG9vcCB3aGVuIHRpbWluZyBhY2N1cmFjeSBpcyBub3QgaW1wb3J0YW50LgotCQkJICoKLQkJCSAqIFNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgYSB0aW1lckV4ZWMoKSwgd2UgcmVtZW1iZXIgdGhlIFJ1bm5hYmxlIHRoYXQgaXMKLQkJCSAqIGFjdGl2ZSBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCB0aGUgdmFsaWQgb25lIGZyb20gdGhlIHN0YWxlIG9uZXMuICBJbiBwcmFjdGljZSwKLQkJCSAqIGlmIHRoZSBpbnRlcnZhbCBpcyAxLzEwMHRoIG9mIGEgc2Vjb25kLCB0aGVuIGNyZWF0aW5nIGEgZmV3IGh1bmRyZWQgbmV3IFJldHJpZ2dlckhhbmRsZXJzCi0JCQkgKiBlYWNoIHNlY29uZCB3aWxsIG5vdCBjYXVzZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGhpdC4KLQkJCSAqLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0UGFpbnRTdXJmYWNlKCkuZ2V0RGlzcGxheSgpOwotCQkJcmV0cmlnZ2VySGFuZGxlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChyZXRyaWdnZXJIYW5kbGVyID09IHRoaXMpIHsKLQkJCQkJCXJlbmRlcihwb2ludHNbMF0pOwotCQkJCQkJcHJlcGFyZVJldHJpZ2dlcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsJCQkKLQkJCWRpc3BsYXkudGltZXJFeGVjKHJldHJpZ2dlckludGVydmFsLCByZXRyaWdnZXJIYW5kbGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFib3J0cyB0aGUgcmV0cmlnZ2VyIHRpbWVyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFib3J0UmV0cmlnZ2VyKCkgewotCQlyZXRyaWdnZXJIYW5kbGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGVtcGxhdGUgbWV0aG9kOiBSZW5kZXJzIGEgcG9pbnQuCi0JICogQHBhcmFtIHBvaW50LCB0aGUgcG9pbnQgdG8gcmVuZGVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVuZGVyKFBvaW50IHBvaW50KTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMWNhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9EcmFnUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoZSBzdXBlcmNsYXNzIGZvciBwYWludCB0b29scyB0aGF0IHVzZSBjbGljay1kcmFnLXJlbGVhc2UgbW90aW9ucyB0bwotICogZHJhdyBvYmplY3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRHJhZ1BhaW50U2Vzc2lvbiBleHRlbmRzIEJhc2ljUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUcnVlIGlmIGEgY2xpY2stZHJhZyBpcyBpbiBwcm9ncmVzcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQotCS8qKgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2xpY2sgaW4gYSBjbGljay1kcmFnCi0JICovCi0JcHJpdmF0ZSBQb2ludCBhbmNob3JQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JLyoqCi0JICogQSB0ZW1wb3JhcnkgcG9pbnQKLQkgKi8KLQlwcml2YXRlIFBvaW50IHRlbXBQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGdldFBhaW50U3VyZmFjZSgpIHRoZSBkcmF3aW5nIHN1cmZhY2UgdG8gdXNlCi0JICovCi0JcHJvdGVjdGVkIERyYWdQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLgotCQkJc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInNlc3Npb24uRHJhZ0ludGVyYWN0aXZlUGFpbnQubWVzc2FnZSIpKTsKLQkJYW5jaG9yUG9zaXRpb24ueCA9IC0xOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCX0KLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHRvb2wuCi0JICogQWJvcnRzIGFueSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRTZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJYW5jaG9yUG9zaXRpb24ueCA9IC0xOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvd24gZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJaWYgKGRyYWdJblByb2dyZXNzKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWRyYWdJblByb2dyZXNzID0gdHJ1ZTsKLQkJCi0JCWFuY2hvclBvc2l0aW9uLnggPSBldmVudC54OwotCQlhbmNob3JQb3NpdGlvbi55ID0gZXZlbnQueTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3VibGVDbGljayBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJcmVzZXRTZXNzaW9uKCk7IC8vIGFib3J0IGlmIHJpZ2h0IG9yIG1pZGRsZSBtb3VzZSBidXR0b24gcHJlc3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghIGRyYWdJblByb2dyZXNzKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JCWlmIChhbmNob3JQb3NpdGlvbi54ID09IC0xKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCQotCQlnZXRQYWludFN1cmZhY2UoKS5jb21taXRSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHsKLQkJCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJCXJldHVybjsKLQkJfQotCQlwcy5zZXRTdGF0dXNDb29yZFJhbmdlKGFuY2hvclBvc2l0aW9uLCBwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCXBzLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQl0ZW1wUG9zaXRpb24ueCA9IGV2ZW50Lng7Ci0JCXRlbXBQb3NpdGlvbi55ID0gZXZlbnQueTsKLQkJcHMuYWRkUnViYmVyYmFuZFNlbGVjdGlvbihjcmVhdGVGaWd1cmUoYW5jaG9yUG9zaXRpb24sIHRlbXBQb3NpdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wbGF0ZSBNZXRob2Q6IENyZWF0ZXMgYSBGaWd1cmUgZm9yIGRyYXdpbmcgcnViYmVyYmFuZCBlbnRpdGllcyBhbmQgdGhlIGZpbmFsIHByb2R1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gYW5jaG9yIHRoZSBhbmNob3IgcG9pbnQKLQkgKiBAcGFyYW0gY3Vyc29yIHRoZSBwb2ludCBtYXJraW5nIHRoZSBjdXJyZW50IHBvaW50ZXIgbG9jYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludCBhbmNob3IsIFBvaW50IGN1cnNvcik7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDdlZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRWxsaXBzZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgRWxsaXBzZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JcHJpdmF0ZSBpbnQgbGluZVN0eWxlLCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIEVsbGlwc2UKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzIG9mIGEgYm94Ci0JICogYm91bmRpbmcgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gbGluZVN0eWxlIHRoZSBsaW5lIHN0eWxlIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIEVsbGlwc2VGaWd1cmUoQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGludCBsaW5lU3R5bGUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQl0aGlzLmZvcmVncm91bmRDb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCXRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotCQl0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd092YWwoci54LCByLnksIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDEpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRWxsaXBzZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMWM3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIEVsbGlwc2VUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBFbGxpcHNlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuRWxsaXBzZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJQ29udGFpbmVyRmlndXJlIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUpCi0JCQljb250YWluZXIuYWRkKG5ldyBTb2xpZEVsbGlwc2VGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkKQotCQkJY29udGFpbmVyLmFkZChuZXcgRWxsaXBzZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmY2U3ZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBTdXBlcmludGVyZmFjZSBmb3IgYWxsIGRyYXdpbmcgb2JqZWN0cy4KLSAqIEFsbCBkcmF3aW5nIG9iamVjdHMga25vdyBob3cgdG8gcmVuZGVyIHRoZW1zZWx2ZWQgdG8gdGhlIHNjcmVlbiBhbmQgY2FuIGRyYXcgYQotICogdGVtcG9yYXJ5IHZlcnNpb24gb2YgdGhlbXNlbHZlcyBmb3IgcHJldmlld2luZyB0aGUgZ2VuZXJhbCBhcHBlYXJhbmNlIG9mIHRoZQotICogb2JqZWN0IG9uc2NyZWVuIGJlZm9yZSBpdCBnZXRzIGNvbW1pdHRlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpZ3VyZSB7Ci0JLyoqCi0JICogRHJhd3MgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGZkYyBhIHBhcmFtZXRlciBibG9jayBzcGVjaWZ5aW5nIGRyYXdpbmctcmVsYXRlZCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKTsKLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBkYW1hZ2VkIHNjcmVlbiByZWdpb24gY2F1c2VkIGJ5IGRyYXdpbmcgdGhpcyBvYmplY3QgKGltcHJlY2lzZSksIHRoZW4KLQkgKiBhcHBlbmRzIGl0IHRvIHRoZSBzdXBwbGllZCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGZkYyBhIHBhcmFtZXRlciBibG9jayBzcGVjaWZ5aW5nIGRyYXdpbmctcmVsYXRlZCBpbmZvcm1hdGlvbgotCSAqIEBwYXJhbSByZWdpb24gYSByZWdpb24gdG8gd2hpY2ggYWRkaXRpb25hbCBkYW1hZ2UgYXJlYXMgd2lsbCBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmVEcmF3Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGFiMThkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEZpZ3VyZURyYXdDb250ZXh0IHsKLQkvKgotCSAqIDxwPgotCSAqIFRoZSBHQyBtdXN0IGJlIHNldCB1cCBhcyBmb2xsb3dzCi0JICogKGl0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhpcyBzdGF0ZSB1cG9uIGNvbXBsZXRpb24gb2YgZHJhd2luZyBvcGVyYXRpb25zKQotCSAqIDx1bD4KLQkgKiAgIDxsaT5zZXRYT1JNb2RlKGZhbHNlKQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBHQyBnYyA9IG51bGw7Ci0JcHVibGljIGludCB4T2Zmc2V0ID0gMCwgeU9mZnNldCA9IDA7IC8vIHN1YnN0cmFjdCB0byBnZXQgR0MgY29vcmRzCi0JcHVibGljIGludCB4U2NhbGUgPSAxLCB5U2NhbGUgPSAxOwotCQotCXB1YmxpYyBSZWN0YW5nbGUgdG9DbGllbnRSZWN0YW5nbGUoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKAotCQkJTWF0aC5taW4oeDEsIHgyKSAqIHhTY2FsZSAtIHhPZmZzZXQsCi0JCQlNYXRoLm1pbih5MSwgeTIpICogeVNjYWxlIC0geU9mZnNldCwKLQkJCShNYXRoLmFicyh4MiAtIHgxKSArIDEpICogeFNjYWxlLAotCQkJKE1hdGguYWJzKHkyIC0geTEpICsgMSkgKiB5U2NhbGUpOwotCX0KLQlwdWJsaWMgUG9pbnQgdG9DbGllbnRQb2ludChpbnQgeCwgaW50IHkpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCh4ICogeFNjYWxlIC0geE9mZnNldCwgeSAqIHlTY2FsZSAtIHlPZmZzZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzZmQxOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBMaW5lIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgTGluZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBMaW5lCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSB0aGVpciB0d28gZW5kLXBvaW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGVuZC1wb2ludAotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBlbmQtcG9pbnQKLQkgKi8KLQlwdWJsaWMgTGluZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUG9pbnQgcDEgPSBmZGMudG9DbGllbnRQb2ludCh4MSwgeTEpOwotCQlQb2ludCBwMiA9IGZkYy50b0NsaWVudFBvaW50KHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdMaW5lKHAxLngsIHAxLnksIHAyLngsIHAyLnkpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhNjRhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBsaW5lIGRyYXdpbmcgdG9vbAotICovCi1wdWJsaWMgY2xhc3MgTGluZVRvb2wgZXh0ZW5kcyBEcmFnUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBMaW5lVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgTGluZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuTGluZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJcmV0dXJuIG5ldyBMaW5lRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQlhLngsIGEueSwgYi54LCBiLnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50RXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTEwYTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBQYWludEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19wYWludCIpOwotCXByaXZhdGUgQ29tcG9zaXRlIG1haW5Db21wb3NpdGU7Ci0JcHJpdmF0ZSBDYW52YXMgYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzOwotCXByaXZhdGUgQ2FudmFzIGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhczsKLQlwcml2YXRlIENvbG9yIHBhaW50Q29sb3JCbGFjaywgcGFpbnRDb2xvcldoaXRlOyAvLyBhbGlhcyBmb3IgcGFpbnRDb2xvcnNbMF0gYW5kIFsxXQotCXByaXZhdGUgQ29sb3JbXSBwYWludENvbG9yczsKLQlwcml2YXRlIEZvbnQgcGFpbnREZWZhdWx0Rm9udDsgLy8gZG8gbm90IGZyZWUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbnVtUGFsZXR0ZVJvd3MgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1QYWxldHRlQ29scyA9IDUwOwotCXByaXZhdGUgVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5nczsgLy8gY3VycmVudCBhY3RpdmUgc2V0dGluZ3MKLQlwcml2YXRlIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2U7IC8vIHBhaW50IHN1cmZhY2UgZm9yIGRyYXdpbmcKLQotCXN0YXRpYyBmaW5hbCBpbnQgUGVuY2lsX3Rvb2wgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQWlyYnJ1c2hfdG9vbCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBMaW5lX3Rvb2wgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgUG9seUxpbmVfdG9vbCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBSZWN0YW5nbGVfdG9vbCA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBSb3VuZGVkUmVjdGFuZ2xlX3Rvb2wgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgRWxsaXBzZV90b29sID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IFRleHRfdG9vbCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBOb25lX2ZpbGwgPSA4OwotCXN0YXRpYyBmaW5hbCBpbnQgT3V0bGluZV9maWxsID0gOTsKLQlzdGF0aWMgZmluYWwgaW50IFNvbGlkX2ZpbGwgPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IFNvbGlkX2xpbmVzdHlsZSA9IDExOwotCXN0YXRpYyBmaW5hbCBpbnQgRGFzaF9saW5lc3R5bGUgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IERvdF9saW5lc3R5bGUgPSAxMzsKLQlzdGF0aWMgZmluYWwgaW50IERhc2hEb3RfbGluZXN0eWxlID0gMTQ7Ci0Jc3RhdGljIGZpbmFsIGludCBGb250X29wdGlvbnMgPSAxNTsKLQkKLQlzdGF0aWMgZmluYWwgaW50IERlZmF1bHRfdG9vbCA9IFBlbmNpbF90b29sOwotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF9maWxsID0gTm9uZV9maWxsOwotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF9saW5lc3R5bGUgPSBTb2xpZF9saW5lc3R5bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUb29sW10gdG9vbHMgPSB7Ci0JCW5ldyBUb29sKFBlbmNpbF90b29sLCAiUGVuY2lsIiwgInRvb2wiLCBTV1QuUkFESU8pLAotCQluZXcgVG9vbChBaXJicnVzaF90b29sLCAiQWlyYnJ1c2giLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKExpbmVfdG9vbCwgIkxpbmUiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKFBvbHlMaW5lX3Rvb2wsICJQb2x5TGluZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUmVjdGFuZ2xlX3Rvb2wsICJSZWN0YW5nbGUiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKFJvdW5kZWRSZWN0YW5nbGVfdG9vbCwgIlJvdW5kZWRSZWN0YW5nbGUiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKEVsbGlwc2VfdG9vbCwgIkVsbGlwc2UiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKFRleHRfdG9vbCwgIlRleHQiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKE5vbmVfZmlsbCwgIk5vbmUiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0Tm9uZSkpLAotCQluZXcgVG9vbChPdXRsaW5lX2ZpbGwsICJPdXRsaW5lIiwgImZpbGwiLCBTV1QuUkFESU8sIG5ldyBJbnRlZ2VyKFRvb2xTZXR0aW5ncy5mdE91dGxpbmUpKSwKLQkJbmV3IFRvb2woU29saWRfZmlsbCwgIlNvbGlkIiwgImZpbGwiLCBTV1QuUkFESU8sIG5ldyBJbnRlZ2VyKFRvb2xTZXR0aW5ncy5mdFNvbGlkKSksCi0JCW5ldyBUb29sKFNvbGlkX2xpbmVzdHlsZSwgIlNvbGlkIiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfU09MSUQpKSwKLQkJbmV3IFRvb2woRGFzaF9saW5lc3R5bGUsICJEYXNoIiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfREFTSCkpLAotCQluZXcgVG9vbChEb3RfbGluZXN0eWxlLCAiRG90IiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfRE9UKSksCi0JCW5ldyBUb29sKERhc2hEb3RfbGluZXN0eWxlLCAiRGFzaERvdCIsICJsaW5lc3R5bGUiLCBTV1QuUkFESU8sIG5ldyBJbnRlZ2VyKFNXVC5MSU5FX0RBU0hET1QpKSwKLQkJbmV3IFRvb2woRm9udF9vcHRpb25zLCAiRm9udCIsICJvcHRpb25zIiwgU1dULlBVU0gpCi0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBQYWludEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIFBhaW50RXhhbXBsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW1haW5Db21wb3NpdGUgPSBwYXJlbnQ7Ci0JCWluaXRSZXNvdXJjZXMoKTsKLQkJaW5pdEFjdGlvbnMoKTsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCVBhaW50RXhhbXBsZSBpbnN0YW5jZSA9IG5ldyBQYWludEV4YW1wbGUoc2hlbGwpOwotCQlpbnN0YW5jZS5jcmVhdGVUb29sQmFyKHNoZWxsKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbnN0YW5jZS5jcmVhdGVHVUkoY29tcG9zaXRlKTsKLQkJaW5zdGFuY2Uuc2V0RGVmYXVsdHMoKTsKLQkJc2V0U2hlbGxTaXplKGRpc3BsYXksIHNoZWxsKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvb2xiYXIuCi0JICogTm90ZTogT25seSBjYWxsZWQgYnkgc3RhbmRhbG9uZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJU3RyaW5nIGdyb3VwID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7IGkrKykgewotCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlpZiAoZ3JvdXAgIT0gbnVsbCAmJiAhdG9vbC5ncm91cC5lcXVhbHMoZ3JvdXApKSB7Ci0JCQkJbmV3IFRvb2xJdGVtICh0b29sYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWdyb3VwID0gdG9vbC5ncm91cDsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBhZGRUb29sSXRlbSh0b29sYmFyLCB0b29sKTsKLQkJCWlmIChpID09IERlZmF1bHRfdG9vbCB8fCBpID09IERlZmF1bHRfZmlsbCB8fCBpID09IERlZmF1bHRfbGluZXN0eWxlKSBpdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0b29sIGl0ZW0gdG8gdGhlIHRvb2xiYXIuCi0JICogTm90ZTogT25seSBjYWxsZWQgYnkgc3RhbmRhbG9uZS4KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIGFkZFRvb2xJdGVtKGZpbmFsIFRvb2xCYXIgdG9vbGJhciwgZmluYWwgVG9vbCB0b29sKSB7Ci0JCWZpbmFsIFN0cmluZyBpZCA9IHRvb2wuZ3JvdXAgKyAnLicgKyB0b29sLm5hbWU7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xiYXIsIHRvb2wudHlwZSk7Ci0JCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmxhYmVsIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKGlkICsgIi50b29sdGlwIikpOwotCQlpdGVtLnNldEltYWdlKHRvb2wuaW1hZ2UpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvb2wuYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgaW50IGNoaWxkSUQgPSB0b29sYmFyLmluZGV4T2YoaXRlbSk7Ci0JCXRvb2xiYXIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBjaGlsZElEKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmRlc2NyaXB0aW9uIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB0b29sIGl0ZW0gc3RhdGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotCQlzZXRQYWludFRvb2woRGVmYXVsdF90b29sKTsKLQkJc2V0RmlsbFR5cGUoRGVmYXVsdF9maWxsKTsKLQkJc2V0TGluZVN0eWxlKERlZmF1bHRfbGluZXN0eWxlKTsKLQkJc2V0Rm9yZWdyb3VuZENvbG9yKHBhaW50Q29sb3JCbGFjayk7Ci0JCXNldEJhY2tncm91bmRDb2xvcihwYWludENvbG9yV2hpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdVSS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVHVUkoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQ7Ci0JCUdyaWREYXRhIGdyaWREYXRhOwotCi0JCS8qKiogQ3JlYXRlIHByaW5jaXBhbCBHVUkgbGF5b3V0IGVsZW1lbnRzICoqKi8JCQotCQlDb21wb3NpdGUgZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZGlzcGxheUFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCS8vIENyZWF0aW5nIHRoZXNlIGVsZW1lbnRzIGhlcmUgYXZvaWRzIHRoZSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZSBHVUkgZWxlbWVudHMKLQkJLy8gaW4gc3RyaWN0IGxheW91dCBvcmRlci4gIFRoZSBuYXR1cmFsIGxheW91dCBvcmRlcmluZyBpcyBhbiBhcnRpZmFjdCBvZiB1c2luZwotCQkvLyBTV1QgbGF5b3V0cywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgaXMgbm90IHRoZSBzYW1lIG9yZGVyIGFzIHRoYXQgcmVxdWlyZWQgdG8KLQkJLy8gaW5zdGFudGlhdGUgYWxsIG9mIHRoZSBub24tR1VJIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHRvIHNhdGlzZnkgcmVmZXJlbnRpYWwKLQkJLy8gZGVwZW5kZW5jaWVzLiAgSXQgaXMgcG9zc2libGUgdG8gcmVvcmRlciB0aGUgaW5pdGlhbGl6YXRpb24gdG8gc29tZSBleHRlbnQsIGJ1dAotCQkvLyB0aGlzIGNhbiBiZSB2ZXJ5IHRlZGlvdXMuCi0JCQotCQkvLyBwYWludCBjYW52YXMKLQkJZmluYWwgQ2FudmFzIHBhaW50Q2FudmFzID0gbmV3IENhbnZhcyhkaXNwbGF5QXJlYSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8Ci0JCQlTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5OT19CQUNLR1JPVU5EKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCXBhaW50Q2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwYWludENhbnZhcy5zZXRCYWNrZ3JvdW5kKHBhaW50Q29sb3JXaGl0ZSk7Ci0JCQotCQkvLyBjb2xvciBzZWxlY3RvciBmcmFtZQotCQlmaW5hbCBDb21wb3NpdGUgY29sb3JGcmFtZSA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbG9yRnJhbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gdG9vbCBzZXR0aW5ncyBmcmFtZQotCQlmaW5hbCBDb21wb3NpdGUgdG9vbFNldHRpbmdzRnJhbWUgPSBuZXcgQ29tcG9zaXRlKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQl0b29sU2V0dGluZ3NGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBzdGF0dXMgdGV4dAotCQlmaW5hbCBUZXh0IHN0YXR1c1RleHQgPSBuZXcgVGV4dChkaXNwbGF5QXJlYSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXN0YXR1c1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLyoqKiBDcmVhdGUgdGhlIHJlbWFpbmluZyBhcHBsaWNhdGlvbiBlbGVtZW50cyBpbnNpZGUgdGhlIHByaW5jaXBhbCBHVUkgbGF5b3V0IGVsZW1lbnRzICoqKi8JCi0JCS8vIHBhaW50U3VyZmFjZQotCQlwYWludFN1cmZhY2UgPSBuZXcgUGFpbnRTdXJmYWNlKHBhaW50Q2FudmFzLCBzdGF0dXNUZXh0LCBwYWludENvbG9yV2hpdGUpOwotCi0JCS8vIGZpbmlzaCBpbml0aWFsaXppbmcgdGhlIHRvb2wgZGF0YQotCQl0b29sc1tQZW5jaWxfdG9vbF0uZGF0YSA9IG5ldyBQZW5jaWxUb29sKHRvb2xTZXR0aW5ncywgcGFpbnRTdXJmYWNlKTsKLQkJdG9vbHNbQWlyYnJ1c2hfdG9vbF0uZGF0YSA9IG5ldyBBaXJicnVzaFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tMaW5lX3Rvb2xdLmRhdGEgPSBuZXcgTGluZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tQb2x5TGluZV90b29sXS5kYXRhID0gbmV3IFBvbHlMaW5lVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1JlY3RhbmdsZV90b29sXS5kYXRhID0gbmV3IFJlY3RhbmdsZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tSb3VuZGVkUmVjdGFuZ2xlX3Rvb2xdLmRhdGEgPSBuZXcgUm91bmRlZFJlY3RhbmdsZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tFbGxpcHNlX3Rvb2xdLmRhdGEgPSBuZXcgRWxsaXBzZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tUZXh0X3Rvb2xdLmRhdGEgPSBuZXcgVGV4dFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCi0JCS8vIGNvbG9yRnJhbWUJCQotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29sb3JGcmFtZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzLCBhY3RpdmVCYWNrZ3JvdW5kQ29sb3JDYW52YXMKLQkJYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNDsKLQkJYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcyA9IG5ldyBDYW52YXMoY29sb3JGcmFtZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjQ7Ci0JCWFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBwYWxldHRlQ2FudmFzCi0JCWZpbmFsIENhbnZhcyBwYWxldHRlQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCXBhbGV0dGVDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbGV0dGVDYW52YXMuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQlDb2xvciBjb2xvciA9IGdldENvbG9yQXQoYm91bmRzLCBlLngsIGUueSk7CQkJCQotCQkJCQkKLQkJCQlpZiAoZS5idXR0b24gPT0gMSkgc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJCQllbHNlIHNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0JCQl9Ci0JCQlwcml2YXRlIENvbG9yIGdldENvbG9yQXQoUmVjdGFuZ2xlIGJvdW5kcywgaW50IHgsIGludCB5KSB7Ci0JCQkJaWYgKGJvdW5kcy5oZWlnaHQgPD0gMSAmJiBib3VuZHMud2lkdGggPD0gMSkgcmV0dXJuIHBhaW50Q29sb3JXaGl0ZTsKLQkJCQlmaW5hbCBpbnQgcm93ID0gKHkgLSBib3VuZHMueSkgKiBudW1QYWxldHRlUm93cyAvIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJZmluYWwgaW50IGNvbCA9ICh4IC0gYm91bmRzLngpICogbnVtUGFsZXR0ZUNvbHMgLyBib3VuZHMud2lkdGg7Ci0JCQkJcmV0dXJuIHBhaW50Q29sb3JzW01hdGgubWluKE1hdGgubWF4KHJvdyAqIG51bVBhbGV0dGVDb2xzICsgY29sLCAwKSwgcGFpbnRDb2xvcnMubGVuZ3RoIC0gMSldOwotCQkJfQotCQl9KTsKLQkJTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmdjID09IG51bGwpIHJldHVybjsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUGFsZXR0ZVJvd3M7ICsrcm93KSB7Ci0JCQkJCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG51bVBhbGV0dGVDb2xzOyArK2NvbCkgewotCQkJCQkJZmluYWwgaW50IHggPSBib3VuZHMud2lkdGggKiBjb2wgLyBudW1QYWxldHRlQ29sczsKLQkJCQkJCWZpbmFsIGludCB5ID0gYm91bmRzLmhlaWdodCAqIHJvdyAvIG51bVBhbGV0dGVSb3dzOwotCQkJCQkJZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgoYm91bmRzLndpZHRoICogKGNvbCArIDEpIC8gbnVtUGFsZXR0ZUNvbHMgLSB4LCAxKTsKLQkJCQkJCWZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heChib3VuZHMuaGVpZ2h0ICogKHJvdyArIDEpIC8gbnVtUGFsZXR0ZVJvd3MgLSB5LCAxKTsKLQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChwYWludENvbG9yc1tyb3cgKiBudW1QYWxldHRlQ29scyArIGNvbF0pOwotCQkJCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGJvdW5kcy54ICsgeCwgYm91bmRzLnkgKyB5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCByZWZyZXNoTGlzdGVuZXIpOwotCQlwYWxldHRlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5QYWludCwgcmVmcmVzaExpc3RlbmVyKTsKLQkJLy9wYWxldHRlQ2FudmFzLnJlZHJhdygpOwotCQkKLQkJLy8gdG9vbFNldHRpbmdzRnJhbWUKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRvb2xTZXR0aW5nc0ZyYW1lLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0b29sU2V0dGluZ3NGcmFtZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJzZXR0aW5ncy5BaXJicnVzaFJhZGl1cy50ZXh0IikpOwotCi0JCWZpbmFsIFNjYWxlIGFpcmJydXNoUmFkaXVzU2NhbGUgPSBuZXcgU2NhbGUodG9vbFNldHRpbmdzRnJhbWUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJYWlyYnJ1c2hSYWRpdXNTY2FsZS5zZXRNaW5pbXVtKDUpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldE1heGltdW0oNTApOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldFNlbGVjdGlvbih0b29sU2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJYWlyYnJ1c2hSYWRpdXNTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b29sU2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgPSBhaXJicnVzaFJhZGl1c1NjYWxlLmdldFNlbGVjdGlvbigpOwotCQkJCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0b29sU2V0dGluZ3NGcmFtZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJzZXR0aW5ncy5BaXJicnVzaEludGVuc2l0eS50ZXh0IikpOwotCi0JCWZpbmFsIFNjYWxlIGFpcmJydXNoSW50ZW5zaXR5U2NhbGUgPSBuZXcgU2NhbGUodG9vbFNldHRpbmdzRnJhbWUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5zZXRNaW5pbXVtKDEpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldE1heGltdW0oMTAwKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5zZXRTZWxlY3Rpb24odG9vbFNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5KTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWFpcmJydXNoSW50ZW5zaXR5U2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9vbFNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5ID0gYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKLQkgKiBpbnN0YW5jZSBvZiB0aGUgUGFpbnRFeGFtcGxlLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocGFpbnRTdXJmYWNlICE9IG51bGwpIHBhaW50U3VyZmFjZS5kaXNwb3NlKCk7CQkKLQkJaWYgKHBhaW50Q29sb3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFpbnRDb2xvcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBDb2xvciBjb2xvciA9IHBhaW50Q29sb3JzW2ldOwotCQkJCWlmIChjb2xvciAhPSBudWxsKSBjb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcGFpbnREZWZhdWx0Rm9udCA9IG51bGw7Ci0JCXBhaW50Q29sb3JzID0gbnVsbDsKLQkJcGFpbnRTdXJmYWNlID0gbnVsbDsKLQkJZnJlZVJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZSBidW5kbGUgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyArK2kpIHsKLQkJCVRvb2wgdG9vbCA9IHRvb2xzW2ldOwotCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSB0b29sLmltYWdlOwotCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCXRvb2wuaW1hZ2UgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIERpc3BsYXkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzcGxheSB3ZSdyZSB1c2luZwotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBtYWluQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb2xvcnMsIGZvbnRzLCBhbmQgdG9vbCBzZXR0aW5ncy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbWFpbkNvbXBvc2l0ZS5nZXREaXNwbGF5KCk7Ci0JCQotCQlwYWludENvbG9yV2hpdGUgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JCXBhaW50Q29sb3JCbGFjayA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQkJCi0JCXBhaW50RGVmYXVsdEZvbnQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKTsKLQotCQlwYWludENvbG9ycyA9IG5ldyBDb2xvcltudW1QYWxldHRlQ29scyAqIG51bVBhbGV0dGVSb3dzXTsKLQkJcGFpbnRDb2xvcnNbMF0gPSBwYWludENvbG9yQmxhY2s7Ci0JCXBhaW50Q29sb3JzWzFdID0gcGFpbnRDb2xvcldoaXRlOwotCQlmb3IgKGludCBpID0gMjsgaSA8IHBhaW50Q29sb3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYWludENvbG9yc1tpXSA9IG5ldyBDb2xvcihkaXNwbGF5LAotCQkJCSgoaSo3KSUyNTUpLCgoaSoyMyklMjU1KSwgKChpKjUxKSUyNTUpKTsKLQkJfQotCi0JCXRvb2xTZXR0aW5ncyA9IG5ldyBUb29sU2V0dGluZ3MoKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciA9IHBhaW50Q29sb3JCbGFjazsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciA9IHBhaW50Q29sb3JXaGl0ZTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQgPSBwYWludERlZmF1bHRGb250OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbiBmaWVsZCBvZiB0aGUgdG9vbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdEFjdGlvbnMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIFRvb2wgdG9vbCA9IHRvb2xzW2ldOwotCQkJU3RyaW5nIGdyb3VwID0gdG9vbC5ncm91cDsKLQkJCWlmIChncm91cC5lcXVhbHMoInRvb2wiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRQYWludFRvb2wodG9vbC5pZCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmIChncm91cC5lcXVhbHMoImZpbGwiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRGaWxsVHlwZSh0b29sLmlkKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgaWYgKGdyb3VwLmVxdWFscygibGluZXN0eWxlIikpIHsKLQkJCQl0b29sLmFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2V0TGluZVN0eWxlKHRvb2wuaWQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gZWxzZSBpZiAoZ3JvdXAuZXF1YWxzKCJvcHRpb25zIikpIHsKLQkJCQl0b29sLmFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2cocGFpbnRTdXJmYWNlLmdldFNoZWxsKCksIFNXVC5QUklNQVJZX01PREFMKTsKLQkJCQkJCUZvbnREYXRhW10gZm9udERhdHVtID0gdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJCQkJCWlmIChmb250RGF0dW0gIT0gbnVsbCAmJiBmb250RGF0dW0ubGVuZ3RoID4gMCkgewotCQkJCQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3QoZm9udERhdHVtKTsKLQkJCQkJCX0KLQkJCQkJCWZvbnREaWFsb2cuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygib3B0aW9ucy5Gb250LmRpYWxvZy50aXRsZSIpKTsKLQotCQkJCQkJcGFpbnRTdXJmYWNlLmhpZGVSdWJiZXJiYW5kKCk7Ci0JCQkJCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotCQkJCQkJcGFpbnRTdXJmYWNlLnNob3dSdWJiZXJiYW5kKCk7Ci0JCQkJCQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUZvbnQgZm9udCA9IG5ldyBGb250KG1haW5Db21wb3NpdGUuZ2V0RGlzcGxheSgpLCBmb250RGF0YSk7Ci0JCQkJCQkJCXRvb2xTZXR0aW5ncy5jb21tb25Gb250ID0gZm9udDsKLQkJCQkJCQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JCQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBpbWFnZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJZmluYWwgQ2xhc3MgY2xhenogPSBQYWludEV4YW1wbGUuY2xhc3M7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQkJCVN0cmluZyBpZCA9IHRvb2wuZ3JvdXAgKyAnLicgKyB0b29sLm5hbWU7Ci0JCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmltYWdlIikpOwotCQkJCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzb3VyY2VTdHJlYW0pOwotCQkJCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQkJCXRvb2wuaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8KLQkJCWdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6Ci0JCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIjsKLQkJZnJlZVJlc291cmNlcygpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0JfQotCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCW1haW5Db21wb3NpdGUuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgbmV3IGNvbG9yIHRvIHVzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgewotCQlpZiAoYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzICE9IG51bGwpCi0JCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCXRvb2xTZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IgPSBjb2xvcjsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0b29sIGJhY2tncm91bmQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWlmIChhY3RpdmVCYWNrZ3JvdW5kQ29sb3JDYW52YXMgIT0gbnVsbCkKLQkJCWFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIGEgdG9vbCBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFpbnRUb29sKGludCBpZCkgewotCQlQYWludFRvb2wgcGFpbnRUb29sID0gKFBhaW50VG9vbCkgdG9vbHNbaWRdLmRhdGE7Ci0JCXBhaW50U3VyZmFjZS5zZXRQYWludFNlc3Npb24ocGFpbnRUb29sKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbGVjdHMgYSBmaWxsdHlwZSBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsbFR5cGUoaW50IGlkKSB7Ci0JCUludGVnZXIgZmlsbFR5cGUgPSAoSW50ZWdlcikgdG9vbHNbaWRdLmRhdGE7Ci0JCXRvb2xTZXR0aW5ncy5jb21tb25GaWxsVHlwZSA9IGZpbGxUeXBlLmludFZhbHVlKCk7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwkJCi0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBsaW5lIHR5cGUgZ2l2ZW4gaXRzIElELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVTdHlsZShpbnQgaWQpIHsKLQkJSW50ZWdlciBsaW5lVHlwZSA9IChJbnRlZ2VyKSB0b29sc1tpZF0uZGF0YTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSA9IGxpbmVUeXBlLmludFZhbHVlKCk7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwkJCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgc2hlbGwgdG8gaXQncyAicGFja2VkIiBzaXplLAotCSAqIHVubGVzcyB0aGF0IG1ha2VzIGl0IGJpZ2dlciB0aGFuIHRoZSBkaXNwbGF5LAotCSAqIGluIHdoaWNoIGNhc2Ugc2V0IGl0IHRvIDkvMTAgb2YgZGlzcGxheSBzaXplLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0U2hlbGxTaXplIChEaXNwbGF5IGRpc3BsYXksIFNoZWxsIHNoZWxsKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmIChzaXplLnggPiBib3VuZHMud2lkdGgpIHNpemUueCA9IGJvdW5kcy53aWR0aCAqIDkgLyAxMDsKLQkJaWYgKHNpemUueSA+IGJvdW5kcy5oZWlnaHQpIHNpemUueSA9IGJvdW5kcy5oZWlnaHQgKiA5IC8gMTA7Ci0JCXNoZWxsLnNldFNpemUgKHNpemUpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSB0b29sIHRoYXQgaXRzIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVG9vbFNldHRpbmdzKCkgewotCQlmaW5hbCBQYWludFRvb2wgYWN0aXZlUGFpbnRUb29sID0gcGFpbnRTdXJmYWNlLmdldFBhaW50VG9vbCgpOwotCQlpZiAoYWN0aXZlUGFpbnRUb29sID09IG51bGwpIHJldHVybjsKLQkJCi0JCWFjdGl2ZVBhaW50VG9vbC5lbmRTZXNzaW9uKCk7Ci0JCWFjdGl2ZVBhaW50VG9vbC5zZXQodG9vbFNldHRpbmdzKTsKLQkJYWN0aXZlUGFpbnRUb29sLmJlZ2luU2Vzc2lvbigpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhODZmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIGFuIGludGVyYWN0aXZlIHBhaW50IHNlc3Npb24uCi0gKiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGVzIHJlY2VpdmVkIHZpYSB0aGUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhcmUgdmlydHVhbGl6ZWQgdG8gemVyby1vcmlnaW4KLSAqIHJlbGF0aXZlIHRvIHRoZSBwYWludGluZyBzdXJmYWNlLgotICovIAotcHVibGljIGludGVyZmFjZSBQYWludFNlc3Npb24gZXh0ZW5kcyBNb3VzZUxpc3RlbmVyLCBNb3VzZU1vdmVMaXN0ZW5lciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFpbnQgc3VyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWludCBzZXNzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBQYWludFN1cmZhY2UKLQkgKi8KLQlwdWJsaWMgUGFpbnRTdXJmYWNlIGdldFBhaW50U3VyZmFjZSgpOwotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSBzZXNzaW9uLgotCSAqIAotCSAqIE5vdGU6IFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgY2FsbCBzdXBlci5iZWdpblNlc3Npb24oKSBhdCBtZXRob2Qgc3RhcnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYmVnaW5TZXNzaW9uKCk7Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHNlc3Npb24uCi0gICAgICoKLQkgKiBOb3RlOiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGNhbGwgc3VwZXIuZW5kU2Vzc2lvbigpIGF0IG1ldGhvZCBleGl0LgotICAgICAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZFNlc3Npb24oKTsKLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHNlc3Npb24uCi0JICogQWJvcnRzIGFueSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCi0JICogCi0JICogTm90ZTogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBjYWxsIHN1cGVyLnJlc2V0U2Vzc2lvbigpIGF0IG1ldGhvZCBleGl0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0U2Vzc2lvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFN1cmZhY2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY2NDA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgc2ltcGxlIGRyYXdpbmcgc3VyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFBhaW50U3VyZmFjZSB7Ci0JcHJpdmF0ZSBQb2ludCBjdXJyZW50UG9zaXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7Ci0JcHJpdmF0ZSBDYW52YXMgcGFpbnRDYW52YXM7Ci0KLQlwcml2YXRlIFBhaW50U2Vzc2lvbiBwYWludFNlc3Npb247Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIEltYWdlIHBhaW50SW1hZ2U7IC8vIGJ1ZmZlciBmb3IgcmVmcmVzaCBibGl0cwotCXByaXZhdGUgaW50ICAgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQ7Ci0JcHJpdmF0ZSBpbnQgICB2aXNpYmxlV2lkdGgsIHZpc2libGVIZWlnaHQ7Ci0KLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IGRpc3BsYXlGREMgPSBuZXcgRmlndXJlRHJhd0NvbnRleHQoKTsKLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IGltYWdlRkRDID0gbmV3IEZpZ3VyZURyYXdDb250ZXh0KCk7Ci0JcHJpdmF0ZSBGaWd1cmVEcmF3Q29udGV4dCBwYWludEZEQyA9IG5ldyBGaWd1cmVEcmF3Q29udGV4dCgpOwotCi0JLyogUnViYmVyYmFuZCAqLwotCXByaXZhdGUgQ29udGFpbmVyRmlndXJlIHJ1YmJlcmJhbmQgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0JCS8vIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24KLQlwcml2YXRlIGludCBydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID0gMDsKLQkJLy8gYWx3YXlzID49IDAsIGlmID4gMCBydWJiZXJiYW5kIGhhcyBiZWVuIGhpZGRlbgotCi0JLyogU3RhdHVzICovCi0JcHJpdmF0ZSBUZXh0IHN0YXR1c1RleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RhdHVzQWN0aW9uSW5mbywgc3RhdHVzTWVzc2FnZUluZm8sIHN0YXR1c0Nvb3JkSW5mbzsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFN1cmZhY2UuCi0JICogPHA+Ci0JICogcGFpbnRDYW52YXMgbXVzdCBoYXZlIFNXVC5OT19SRURSQVdfUkVTSVpFIGFuZCBTV1QuTk9fQkFDS0dST1VORCBzdHlsZXMsCi0JICogICAgIGFuZCBtYXkgaGF2ZSBTV1QuVl9TQ1JPTEwgYW5kL29yIFNXVC5IX1NDUk9MTC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhaW50Q2FudmFzIHRoZSBDYW52YXMgb2JqZWN0IGluIHdoaWNoIHRvIHJlbmRlcgotCSAqIEBwYXJhbSBwYWludFN0YXR1cyB0aGUgUGFpbnRTdGF0dXMgb2JqZWN0IHRvIHVzZSBmb3IgcHJvdmlkaW5nIHVzZXIgZmVlZGJhY2sKLQkgKiBAcGFyYW0gZmlsbENvbG9yIHRoZSBjb2xvciB0byBmaWxsIHRoZSBjYW52YXMgd2l0aCBpbml0aWFsbHkKLQkgKi8KLQlwdWJsaWMgUGFpbnRTdXJmYWNlKENhbnZhcyBwYWludENhbnZhcywgVGV4dCBzdGF0dXNUZXh0LCBDb2xvciBmaWxsQ29sb3IpIHsKLQkJdGhpcy5wYWludENhbnZhcyA9IHBhaW50Q2FudmFzOwotCQl0aGlzLnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0OwotCQljbGVhclN0YXR1cygpOwotCi0JCS8qIFNldCB1cCB0aGUgZHJhd2luZyBzdXJmYWNlICovCi0JCVJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IHBhaW50Q2FudmFzLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCWltYWdlV2lkdGggPSBkaXNwbGF5UmVjdC53aWR0aDsKLQkJaW1hZ2VIZWlnaHQgPSBkaXNwbGF5UmVjdC5oZWlnaHQ7Ci0JCWltYWdlID0gbmV3IEltYWdlKHBhaW50Q2FudmFzLmdldERpc3BsYXkoKSwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOwotCi0JCWltYWdlRkRDLmdjID0gbmV3IEdDKGltYWdlKTsKLQkJaW1hZ2VGREMuZ2Muc2V0QmFja2dyb3VuZChmaWxsQ29sb3IpOwotCQlpbWFnZUZEQy5nYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKLQkJZGlzcGxheUZEQy5nYyA9IG5ldyBHQyhwYWludENhbnZhcyk7Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgc2Vzc2lvbiAqLwotCQlzZXRQYWludFNlc3Npb24obnVsbCk7Ci0KLQkJLyogQWRkIG91ciBsaXN0ZW5lcnMgKi8KLQkJcGFpbnRDYW52YXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWRpc3BsYXlGREMuZ2MuZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZURvd24oZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcHJvY2Vzc01vdXNlRXZlbnRDb29yZGluYXRlcyhldmVudCk7Ci0JCQkJaWYgKHBhaW50U2Vzc2lvbiAhPSBudWxsKSBwYWludFNlc3Npb24ubW91c2VVcChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXBhaW50Q2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcHJvY2Vzc01vdXNlRXZlbnRDb29yZGluYXRlcyhldmVudCk7Ci0JCQkJaWYgKHBhaW50U2Vzc2lvbiAhPSBudWxsKSBwYWludFNlc3Npb24ubW91c2VNb3ZlKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXBhaW50Q2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCWlmIChydWJiZXJiYW5kLmlzRW1wdHkoKSkgewotCQkJCQkvLyBOb3RoaW5nIHRvIG1lcmdlLCBzbyB3ZSBqdXN0IHJlZnJlc2gKLQkJCQkJZXZlbnQuZ2MuZHJhd0ltYWdlKGltYWdlLAotCQkJCQkJZGlzcGxheUZEQy54T2Zmc2V0ICsgZXZlbnQueCwgZGlzcGxheUZEQy55T2Zmc2V0ICsgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEF2b2lkIGZsaWNrZXIgd2hlbiBtZXJnaW5nIG92ZXJsYXllZCBvYmplY3RzIGJ5IGNvbnN0cnVjdGluZyB0aGUgaW1hZ2Ugb24KLQkJCQkJICogYSBiYWNrYnVmZmVyIGZpcnN0LCB0aGVuIGJsaXR0aW5nIGl0IHRvIHRoZSBzY3JlZW4uCi0JCQkJCSAqLwotCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBiYWNrYnVmZmVyIGlzIGxhcmdlIGVub3VnaAotCQkJCQlpZiAocGFpbnRJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhaW50SW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlpZiAoKGV2ZW50LndpZHRoICsgZXZlbnQueCA+IHJlY3Qud2lkdGgpIHx8Ci0JCQkJCQkJKGV2ZW50LmhlaWdodCArIGV2ZW50LnkgPiByZWN0LmhlaWdodCkpIHsKLQkJCQkJCQlwYWludEZEQy5nYy5kaXNwb3NlKCk7Ci0JCQkJCQkJcGFpbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJcGFpbnRJbWFnZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHBhaW50SW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5LmdldENsaWVudEFyZWEoKTsKLQkJCQkJCXBhaW50SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwKLQkJCQkJCQlNYXRoLm1heChyZWN0LndpZHRoLCBldmVudC53aWR0aCArIGV2ZW50LngpLAotCQkJCQkJCU1hdGgubWF4KHJlY3QuaGVpZ2h0LCBldmVudC5oZWlnaHQgKyBldmVudC55KSk7Ci0JCQkJCQlwYWludEZEQy5nYyA9IG5ldyBHQyhwYWludEltYWdlKTsKLQkJCQkJfQotCQkJCQkvLyBTZXR1cCBjbGlwcGluZyBhbmQgdGhlIEZEQwotCQkJCQlSZWdpb24gY2xpcFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJZXZlbnQuZ2MuZ2V0Q2xpcHBpbmcoY2xpcFJlZ2lvbik7CQkJCQkKLQkJCQkJcGFpbnRGREMuZ2Muc2V0Q2xpcHBpbmcoY2xpcFJlZ2lvbik7Ci0JCQkJCWNsaXBSZWdpb24uZGlzcG9zZSgpOwotCi0JCQkJCXBhaW50RkRDLnhPZmZzZXQgPSBkaXNwbGF5RkRDLnhPZmZzZXQ7Ci0JCQkJCXBhaW50RkRDLnlPZmZzZXQgPSBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JCQkJCXBhaW50RkRDLnhTY2FsZSA9IGRpc3BsYXlGREMueFNjYWxlOwotCQkJCQlwYWludEZEQy55U2NhbGUgPSBkaXNwbGF5RkRDLnlTY2FsZTsKLQkJCQkJCi0JCQkJCS8vIE1lcmdlIHRoZSBvdmVybGF5ZWQgb2JqZWN0cyBpbnRvIHRoZSBpbWFnZSwgdGhlbiBibGl0Ci0JCQkJCXBhaW50RkRDLmdjLmRyYXdJbWFnZShpbWFnZSwKLQkJCQkJCWRpc3BsYXlGREMueE9mZnNldCArIGV2ZW50LngsIGRpc3BsYXlGREMueU9mZnNldCArIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQkJcnViYmVyYmFuZC5kcmF3KHBhaW50RkRDKTsKLQkJCQkJZXZlbnQuZ2MuZHJhd0ltYWdlKHBhaW50SW1hZ2UsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0LAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlc2l6ZSgpOwotCQkJfQkJCQotCQl9KTsKLQotCQkvKiBTZXQgdXAgdGhlIHBhaW50IGNhbnZhcyBzY3JvbGwgYmFycyAqLwotCQlTY3JvbGxCYXIgaG9yaXpvbnRhbCA9IHBhaW50Q2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJaG9yaXpvbnRhbC5zZXRWaXNpYmxlKHRydWUpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxIb3Jpem9udGFsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gcGFpbnRDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJdmVydGljYWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbFZlcnRpY2FsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQkJaGFuZGxlUmVzaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBQYWludFN1cmZhY2UncyByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW1hZ2VGREMuZ2MuZGlzcG9zZSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWlmIChwYWludEltYWdlICE9IG51bGwpIHsKLQkJCXBhaW50SW1hZ2UuZGlzcG9zZSgpOwotCQkJcGFpbnRGREMuZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJY3VycmVudFBvc2l0aW9uID0gbnVsbDsKLQkJcGFpbnRDYW52YXMgPSBudWxsOwotCQlwYWludFNlc3Npb24gPSBudWxsOwotCQlpbWFnZSA9IG51bGw7Ci0JCXBhaW50SW1hZ2UgPSBudWxsOwotCQlkaXNwbGF5RkRDID0gbnVsbDsKLQkJaW1hZ2VGREMgPSBudWxsOwotCQlwYWludEZEQyA9IG51bGw7Ci0JCXJ1YmJlcmJhbmQgPSBudWxsOwotCQlzdGF0dXNUZXh0ID0gbnVsbDsKLQkJc3RhdHVzQWN0aW9uSW5mbyA9IG51bGw7Ci0JCXN0YXR1c01lc3NhZ2VJbmZvID0gbnVsbDsKLQkJc3RhdHVzQ29vcmRJbmZvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSAgewotCQlwYWludENhbnZhcy5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERpc3BsYXkgb24gd2hpY2ggdGhlIFBhaW50U3VyZmFjZSByZXNpZGVzLgotCSAqIEByZXR1cm4gdGhlIERpc3BsYXkKLQkgKi8KLQlwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gcGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNoZWxsIGluIHdoaWNoIHRoZSBQYWludFN1cmZhY2UgcmVzaWRlcy4KLQkgKiBAcmV0dXJuIHRoZSBTaGVsbAotCSAqLwotCXB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHBhaW50Q2FudmFzLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBwYWludCBzZXNzaW9uLgotCSAqIDxwPgotCSAqIElmIG9sZFBhaW50U2Vzc2lvbiAhPSBwYWludFNlc3Npb24gY2FsbHMgb2xkUGFpbnRTZXNzaW9uLmVuZCgpCi0JICogYW5kIHBhaW50U2Vzc2lvbi5iZWdpbigpCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYWludFNlc3Npb24gdGhlIHBhaW50IHNlc3Npb24gdG8gYWN0aXZhdGU7IG51bGwgdG8gZGlzYWJsZSBhbGwgc2Vzc2lvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWludFNlc3Npb24oUGFpbnRTZXNzaW9uIHBhaW50U2Vzc2lvbikgewotCQlpZiAodGhpcy5wYWludFNlc3Npb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMucGFpbnRTZXNzaW9uID09IHBhaW50U2Vzc2lvbikgcmV0dXJuOwotCQkJdGhpcy5wYWludFNlc3Npb24uZW5kU2Vzc2lvbigpOwotCQl9Ci0JCXRoaXMucGFpbnRTZXNzaW9uID0gcGFpbnRTZXNzaW9uOwotCQljbGVhclN0YXR1cygpOwotCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHsKLQkJCXNldFN0YXR1c0FjdGlvbihwYWludFNlc3Npb24uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQlwYWludFNlc3Npb24uYmVnaW5TZXNzaW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRTdGF0dXNBY3Rpb24oUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLk51bGwubGFiZWwiKSk7Ci0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5OdWxsLm1lc3NhZ2UiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBwYWludCBzZXNzaW9uLCBudWxsIGlmIG5vbmUgaXMgYWN0aXZlCi0JICovCi0JcHVibGljIFBhaW50U2Vzc2lvbiBnZXRQYWludFNlc3Npb24oKSB7Ci0JCXJldHVybiBwYWludFNlc3Npb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwYWludCB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcGFpbnQgdG9vbCwgbnVsbCBpZiBub25lIGlzIGFjdGl2ZSAodGhvdWdoIHNvbWUgb3RoZXIgc2Vzc2lvbgotCSAqICAgICAgICAgbWlnaHQgYmUpCi0JICovCi0JcHVibGljIFBhaW50VG9vbCBnZXRQYWludFRvb2woKSB7Ci0JCXJldHVybiAocGFpbnRTZXNzaW9uICE9IG51bGwgJiYgcGFpbnRTZXNzaW9uIGluc3RhbmNlb2YgUGFpbnRUb29sKSA/Ci0JCQkoUGFpbnRUb29sKXBhaW50U2Vzc2lvbiA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBhbiBpbnRlcmFjdGl2ZSBvcGVyYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsYXN0IGtub3duIHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyCi0JICovCi0JcHVibGljIFBvaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyBhIEZpZ3VyZSBvYmplY3QgdG8gdGhlIHNjcmVlbiBhbmQgdG8gdGhlIGJhY2tpbmcgc3RvcmUgcGVybWFuZW50bHkuCi0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGRyYXcgb25zY3JlZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmF3RmlndXJlKEZpZ3VyZSBvYmplY3QpIHsKLQkJb2JqZWN0LmRyYXcoaW1hZ2VGREMpOwotCQlvYmplY3QuZHJhdyhkaXNwbGF5RkRDKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgRmlndXJlIG9iamVjdCB0byB0aGUgYWN0aXZlIHJ1YmJlcmJhbmQgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgYmUgZHJhd24gdG8gdGhlIHNjcmVlbiBhcyBhIHByZXZpZXcgYW5kIHJlZnJlc2hlZCBhcHByb3ByaWF0ZWx5Ci0JICogdW50aWwgdGhlIHNlbGVjdGlvbiBpcyBlaXRoZXIgY2xlYXJlZCBvciBjb21taXR0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJ1YmJlcmJhbmRTZWxlY3Rpb24oRmlndXJlIG9iamVjdCkgewotCQlydWJiZXJiYW5kLmFkZChvYmplY3QpOwotCQlpZiAoISBpc1J1YmJlcmJhbmRIaWRkZW4oKSkgb2JqZWN0LmRyYXcoZGlzcGxheUZEQyk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogRXJhc2VzIGFueSBydWJiZXJiYW5kIG9iamVjdHMgb24gdGhlIHNjcmVlbiB0aGVuIGNsZWFycyB0aGUgc2VsZWN0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKSB7Ci0JCWlmICghIGlzUnViYmVyYmFuZEhpZGRlbigpKSB7Ci0JCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJcnViYmVyYmFuZC5hZGREYW1hZ2VkUmVnaW9uKGRpc3BsYXlGREMsIHJlZ2lvbik7Ci0JCQlSZWN0YW5nbGUgciA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQkJCXBhaW50Q2FudmFzLnJlZHJhdyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIHRydWUpOwotCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJfQotCQlydWJiZXJiYW5kLmNsZWFyKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogUmVkcmF3cyBhbnkgcnViYmVyYmFuZCBvYmplY3RzIG9uIHRoZSBzY3JlZW4gYXMgcGVybWFuZW50IG9iamVjdHMgdGhlbiBjbGVhcnMgdGhlIHNlbGVjdGlvbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgY29tbWl0UnViYmVyYmFuZFNlbGVjdGlvbigpIHsKLQkJcnViYmVyYmFuZC5kcmF3KGltYWdlRkRDKTsKLQkJaWYgKGlzUnViYmVyYmFuZEhpZGRlbigpKSBydWJiZXJiYW5kLmRyYXcoZGlzcGxheUZEQyk7Ci0JCXJ1YmJlcmJhbmQuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogSGlkZXMgdGhlIHJ1YmJlcmJhbmQgKGJ1dCBkb2VzIG5vdCBlbGltaW5hdGUgaXQpLgotCSAqIDxwPgotCSAqIEluY3JlbWVudHMgYnkgb25lIHRoZSBydWJiZXJiYW5kICJoaWRlIiBuZXN0aW5nIGNvdW50LiAgVGhlIHJ1YmJlcmJhbmQKLQkgKiBpcyBoaWRkZW4gZnJvbSB2aWV3IChidXQgcmVtYWlucyBhY3RpdmUpIGlmIGl0IHdhc24ndCBhbHJlYWR5IGhpZGRlbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgaGlkZVJ1YmJlcmJhbmQoKSB7Ci0JCWlmIChydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50KysgPD0gMCkgewotCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCXJ1YmJlcmJhbmQuYWRkRGFtYWdlZFJlZ2lvbihkaXNwbGF5RkRDLCByZWdpb24pOwotCQkJUmVjdGFuZ2xlIHIgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0JCQlwYWludENhbnZhcy5yZWRyYXcoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0LCB0cnVlKTsKLQkJCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JCX0KLQl9CQkKLQotCS8qKgotCSAqIFNob3dzICh1bi1oaWRlcykgdGhlIHJ1YmJlcmJhbmQuCi0JICogPHA+Ci0JICogRGVjcmVtZW50cyBieSBvbmUgdGhlIHJ1YmJlcmJhbmQgImhpZGUiIG5lc3RpbmcgY291bnQuICBUaGUgcnViYmVyYmFuZAotCSAqIGlzIG9ubHkgbWFkZSB2aXNpYmxlIHdoZW4gc2hvd1J1YmJlcmJhbmQoKSBoYXMgYmVlbiBjYWxsZWQgb25jZSBmb3IgZWFjaAotCSAqIHByZXZpb3VzIGhpZGVSdWJiZXJiYW5kKCkuICBJdCBpcyBub3QgcGVybWl0dGVkIHRvIGNhbGwgc2hvd1J1YmJlcmJhbmQoKSBpZgotCSAqIHRoZSBydWJiZXIgYmFuZCBpcyBub3QgcHJlc2VudGx5IGhpZGRlbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2hvd1J1YmJlcmJhbmQoKSB7Ci0JCWlmIChydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50IDw9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID4gMCIpOwotCQlpZiAoLS1ydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID09IDApIHsKLQkJCXJ1YmJlcmJhbmQuZHJhdyhkaXNwbGF5RkRDKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBydWJiZXJiYW5kIGlzIGhpZGRlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBydWJiZXIgaXMgaGlkZGVuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdWJiZXJiYW5kSGlkZGVuKCkgewotCQlyZXR1cm4gcnViYmVyYmFuZEhpZGRlbk5lc3RpbmdDb3VudCA+IDA7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIGhvcml6b250YWwgc2Nyb2xsIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIHNjcm9sbGJhciB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIHRoYXQgcG9zdGVkIHRoaXMgZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzY3JvbGxIb3Jpem9udGFsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoaW1hZ2VXaWR0aCA+IHZpc2libGVXaWR0aCkgewotCQkJZmluYWwgaW50IG9sZE9mZnNldCA9IGRpc3BsYXlGREMueE9mZnNldDsKLQkJCWZpbmFsIGludCBuZXdPZmZzZXQgPSBNYXRoLm1pbihzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCksIGltYWdlV2lkdGggLSB2aXNpYmxlV2lkdGgpOwotCQkJaWYgKG9sZE9mZnNldCAhPSBuZXdPZmZzZXQpIHsKLQkJCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQkJCQlkaXNwbGF5RkRDLnhPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQkJcGFpbnRDYW52YXMuc2Nyb2xsKE1hdGgubWF4KG9sZE9mZnNldCAtIG5ld09mZnNldCwgMCksIDAsIE1hdGgubWF4KG5ld09mZnNldCAtIG9sZE9mZnNldCwgMCksIDAsCi0JCQkJCXZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIHZlcnRpY2FsIHNjcm9sbCBldmVudAotCSAqIAotCSAqIEBwYXJhbSBzY3JvbGxiYXIgdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIgdGhhdCBwb3N0ZWQgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNjcm9sbFZlcnRpY2FsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoaW1hZ2VIZWlnaHQgPiB2aXNpYmxlSGVpZ2h0KSB7Ci0JCQlmaW5hbCBpbnQgb2xkT2Zmc2V0ID0gZGlzcGxheUZEQy55T2Zmc2V0OwotCQkJZmluYWwgaW50IG5ld09mZnNldCA9IE1hdGgubWluKHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VIZWlnaHQgLSB2aXNpYmxlSGVpZ2h0KTsKLQkJCWlmIChvbGRPZmZzZXQgIT0gbmV3T2Zmc2V0KSB7Ci0JCQkJcGFpbnRDYW52YXMudXBkYXRlKCk7Ci0JCQkJZGlzcGxheUZEQy55T2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQkJCXBhaW50Q2FudmFzLnNjcm9sbCgwLCBNYXRoLm1heChvbGRPZmZzZXQgLSBuZXdPZmZzZXQsIDApLCAwLCBNYXRoLm1heChuZXdPZmZzZXQgLSBvbGRPZmZzZXQsIDApLAotCQkJCQl2aXNpYmxlV2lkdGgsIHZpc2libGVIZWlnaHQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIHJlc2l6ZSBldmVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVzaXplKCkgewotCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQotCQlSZWN0YW5nbGUgdmlzaWJsZVJlY3QgPSBwYWludENhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCXZpc2libGVXaWR0aCA9IHZpc2libGVSZWN0LndpZHRoOwotCQl2aXNpYmxlSGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0OwotCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gcGFpbnRDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoaG9yaXpvbnRhbCAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5RkRDLnhPZmZzZXQgPSBNYXRoLm1pbihob3Jpem9udGFsLmdldFNlbGVjdGlvbigpLCBpbWFnZVdpZHRoIC0gdmlzaWJsZVdpZHRoKTsKLQkJCWlmIChpbWFnZVdpZHRoIDw9IHZpc2libGVXaWR0aCkgewotCQkJCWhvcml6b250YWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9IGVsc2UgewotCQkJCWhvcml6b250YWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlob3Jpem9udGFsLnNldFZhbHVlcyhkaXNwbGF5RkRDLnhPZmZzZXQsIDAsIGltYWdlV2lkdGgsIHZpc2libGVXaWR0aCwKLQkJCQkJOCwgdmlzaWJsZVdpZHRoKTsKLQkJCX0KLQkJfQotCi0JCVNjcm9sbEJhciB2ZXJ0aWNhbCA9IHBhaW50Q2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmICh2ZXJ0aWNhbCAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5RkRDLnlPZmZzZXQgPSBNYXRoLm1pbih2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VIZWlnaHQgLSB2aXNpYmxlSGVpZ2h0KTsKLQkJCWlmIChpbWFnZUhlaWdodCA8PSB2aXNpYmxlSGVpZ2h0KSB7Ci0JCQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJdmVydGljYWwuc2V0U2VsZWN0aW9uKDApOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCXZlcnRpY2FsLnNldFZhbHVlcyhkaXNwbGF5RkRDLnlPZmZzZXQsIDAsIGltYWdlSGVpZ2h0LCB2aXNpYmxlSGVpZ2h0LAotCQkJCQk4LCB2aXNpYmxlSGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZpcnR1YWxpemVzIE1vdXNlRXZlbnQgY29vcmRpbmF0ZXMgYW5kIHN0b3JlcyB0aGUgY3VycmVudCBwb3NpdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc01vdXNlRXZlbnRDb29yZGluYXRlcyhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWN1cnJlbnRQb3NpdGlvbi54ID0gZXZlbnQueCA9Ci0JCQlNYXRoLm1pbihNYXRoLm1heChldmVudC54LCAwKSwgdmlzaWJsZVdpZHRoIC0gMSkgKyBkaXNwbGF5RkRDLnhPZmZzZXQ7Ci0JCWN1cnJlbnRQb3NpdGlvbi55ID0gZXZlbnQueSA9Ci0JCQlNYXRoLm1pbihNYXRoLm1heChldmVudC55LCAwKSwgdmlzaWJsZUhlaWdodCAtIDEpICsgZGlzcGxheUZEQy55T2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHN0YXR1cyBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJTdGF0dXMoKSB7Ci0JCXN0YXR1c0FjdGlvbkluZm8gPSAiIjsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSAiIjsKLQkJc3RhdHVzQ29vcmRJbmZvID0gIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyBiYXIgYWN0aW9uIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gaW4gcHJvZ3Jlc3MsIG51bGwgdG8gY2xlYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotCQlzdGF0dXNBY3Rpb25JbmZvID0gKGFjdGlvbiAhPSBudWxsKSA/IGFjdGlvbiA6ICIiOwotCQl1cGRhdGVTdGF0dXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIGJhciBtZXNzYWdlIHRleHQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSwgbnVsbCB0byBjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHN0YXR1cyBiYXIuCi0JICogCi0JICogQHBhcmFtIGNvb3JkIHRoZSBjb29yZGluYXRlcyB0byBkaXNwbGF5LCBudWxsIHRvIGNsZWFyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzQ29vcmQoUG9pbnQgY29vcmQpIHsKLQkJc3RhdHVzQ29vcmRJbmZvID0gKGNvb3JkICE9IG51bGwpID8gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzdGF0dXMuQ29vcmQuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IG5ldyBJbnRlZ2VyKGNvb3JkLngpLCBuZXcgSW50ZWdlcihjb29yZC55KX0pIDogIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvb3JkaW5hdGUgcmFuZ2UgaW4gdGhlIHN0YXR1cyBiYXIuCi0JICogCi0JICogQHBhcmFtIGEgdGhlICJmcm9tIiBjb29yZGluYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0JICogQHBhcmFtIGIgdGhlICJ0byIgY29vcmRpbmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0Nvb3JkUmFuZ2UoUG9pbnQgYSwgUG9pbnQgYikgewotCQlzdGF0dXNDb29yZEluZm8gPSBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5Db29yZFJhbmdlLmZvcm1hdCIsIG5ldyBPYmplY3RbXQotCQkJeyBuZXcgSW50ZWdlcihhLngpLCBuZXcgSW50ZWdlcihhLnkpLCBuZXcgSW50ZWdlcihiLngpLCBuZXcgSW50ZWdlcihiLnkpfSk7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cygpIHsKLQkJc3RhdHVzVGV4dC5zZXRUZXh0KAotCQkJUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzdGF0dXMuQmFyLmZvcm1hdCIsIG5ldyBPYmplY3RbXQotCQkJeyBzdGF0dXNBY3Rpb25JbmZvLCBzdGF0dXNNZXNzYWdlSW5mbywgc3RhdHVzQ29vcmRJbmZvIH0pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU2MTRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotcHVibGljIGludGVyZmFjZSBQYWludFRvb2wgZXh0ZW5kcyBQYWludFNlc3Npb24gewotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3ZTUwMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QZW5jaWxUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIHBlbmNpbCB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUGVuY2lsVG9vbCBleHRlbmRzIENvbnRpbnVvdXNQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBwZW5jaWwgdG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBnZXRQYWludFN1cmZhY2UoKSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBQZW5jaWxUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlBlbmNpbC5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kIGZvciBkcmF3aW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyKGZpbmFsIFBvaW50IHBvaW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlwcy5kcmF3RmlndXJlKG5ldyBQb2ludEZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHBvaW50LngsIHBvaW50LnkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9pbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyODMxNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUG9pbnQgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBQb2ludEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4LCB5OwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQb2ludAotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHggdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGVuZC1wb2ludAotCSAqLwotCXB1YmxpYyBQb2ludEZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgsIGludCB5KSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54ID0geDsgdGhpcy55ID0geTsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUG9pbnQgcCA9IGZkYy50b0NsaWVudFBvaW50KHgsIHkpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUmVjdGFuZ2xlKHAueCwgcC55LCAxLCAxKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeCwgeSwgeCwgeSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvbHlMaW5lVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTgxNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIHBvbHlsaW5lIGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIFBvbHlMaW5lVG9vbCBleHRlbmRzIFNlZ21lbnRlZFBhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUG9seUxpbmVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBQb2x5TGluZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUG9seUxpbmUubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRyYXdpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludFtdIHBvaW50cywgaW50IG51bVBvaW50cywgYm9vbGVhbiBjbG9zZWQpIHsKLQkJQ29udGFpbmVyRmlndXJlIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJaWYgKGNsb3NlZCAmJiBzZXR0aW5ncy5jb21tb25GaWxsVHlwZSAhPSBUb29sU2V0dGluZ3MuZnROb25lICYmIG51bVBvaW50cyA+PSAzKSB7Ci0JCQljb250YWluZXIuYWRkKG5ldyBTb2xpZFBvbHlnb25GaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBwb2ludHMsIG51bVBvaW50cykpOwotCQl9Ci0JCWlmICghIGNsb3NlZCB8fCBzZXR0aW5ncy5jb21tb25GaWxsVHlwZSAhPSBUb29sU2V0dGluZ3MuZnRTb2xpZCB8fCBudW1Qb2ludHMgPCAzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50cyAtIDE7ICsraSkgewotCQkJCWZpbmFsIFBvaW50IGEgPSBwb2ludHNbaV07Ci0JCQkJZmluYWwgUG9pbnQgYiA9IHBvaW50c1tpICsgMV07Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgTGluZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCX0KLQkJCWlmIChjbG9zZWQpIHsKLQkJCQlmaW5hbCBQb2ludCBhID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTsKLQkJCQlmaW5hbCBQb2ludCBiID0gcG9pbnRzWzBdOwotCQkJCWNvbnRhaW5lci5hZGQobmV3IExpbmVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgwZTYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJlY3RhbmdsZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gbGluZVN0eWxlIHRoZSBsaW5lIHN0eWxlIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIFJlY3RhbmdsZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0JCWZkYy5nYy5kcmF3UmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAxKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDczYmJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUmVjdGFuZ2xlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJlY3RhbmdsZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFJlY3RhbmdsZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUmVjdGFuZ2xlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludCBhLCBQb2ludCBiKSB7Ci0JCXN3aXRjaCAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUpIHsKLQkJCWRlZmF1bHQ6Ci0JCQljYXNlIFRvb2xTZXR0aW5ncy5mdE5vbmU6Ci0JCQkJcmV0dXJuIG5ldyBSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KTsKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0U29saWQ6Ci0JCQkJcmV0dXJuIG5ldyBTb2xpZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIGEueCwgYS55LCBiLngsIGIueSk7Ci0JCQljYXNlIFRvb2xTZXR0aW5ncy5mdE91dGxpbmU6IHsKLQkJCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzFkNjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyLCBkaWFtZXRlcjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0gZGlhbWV0ZXIgdGhlIGRpYW1ldGVyIG9mIGN1cnZhdHVyZSBvZiBhbGwgZm91ciBjb3JuZXJzCi0JICovCi0JcHVibGljIFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGludCBsaW5lU3R5bGUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGRpYW1ldGVyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQkJdGhpcy5kaWFtZXRlciA9IGRpYW1ldGVyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdSb3VuZFJlY3RhbmdsZShyLngsIHIueSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMSwgZGlhbWV0ZXIsIGRpYW1ldGVyKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWMwNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUm91bmRlZFJlY3RhbmdsZVRvb2wgZXh0ZW5kcyBEcmFnUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSb3VuZGVkUmVjdGFuZ2xlVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgUm91bmRlZFJlY3RhbmdsZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUm91bmRlZFJlY3RhbmdsZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJQ29udGFpbmVyRmlndXJlIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUpCi0JCQljb250YWluZXIuYWRkKG5ldyBTb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLAotCQkJCWEueCwgYS55LCBiLngsIGIueSwgc2V0dGluZ3Mucm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyKSk7Ci0JCWlmIChzZXR0aW5ncy5jb21tb25GaWxsVHlwZSAhPSBUb29sU2V0dGluZ3MuZnRTb2xpZCkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsCi0JCQkJc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLCBhLngsIGEueSwgYi54LCBiLnksIHNldHRpbmdzLnJvdW5kZWRSZWN0YW5nbGVDb3JuZXJEaWFtZXRlcikpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NlZ21lbnRlZFBhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGFkYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgY29udHJ1Y3Qgb2JqZWN0cyBmcm9tIGluZGl2aWR1YWxseQotICogcGlja2VkIHNlZ21lbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VnbWVudGVkUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRoZSBzZXQgb2YgY29udHJvbCBwb2ludHMgbWFraW5nIHVwIHRoZSBzZWdtZW50ZWQgc2VsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSBWZWN0b3IgLyogb2YgUG9pbnQgKi8gY29udHJvbFBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIFRoZSBwcmV2aW91cyBmaWd1cmUgKHNvIHRoYXQgd2UgY2FuIGFib3J0IHdpdGggcmlnaHQtYnV0dG9uKQotCSAqLwotCXByaXZhdGUgRmlndXJlIHByZXZpb3VzRmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGZpZ3VyZSAoc28gdGhhdCB3ZSBjYW4gYWJvcnQgd2l0aCByaWdodC1idXR0b24pCi0JICovCi0JcHJpdmF0ZSBGaWd1cmUgY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnRTZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgU2VnbWVudGVkUGFpbnRTZXNzaW9uKFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHRvb2wuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5zZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygKLQkJCSJzZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5hbmNob3JNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IG51bGw7Ci0JCWN1cnJlbnRGaWd1cmUgPSBudWxsOwotCQljb250cm9sUG9pbnRzLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlpZiAocHJldmlvdXNGaWd1cmUgIT0gbnVsbCkgZ2V0UGFpbnRTdXJmYWNlKCkuZHJhd0ZpZ3VyZShwcmV2aW91c0ZpZ3VyZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgdG9vbC4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlpZiAocHJldmlvdXNGaWd1cmUgIT0gbnVsbCkgZ2V0UGFpbnRTdXJmYWNlKCkuZHJhd0ZpZ3VyZShwcmV2aW91c0ZpZ3VyZSk7Ci0JCQotCQlnZXRQYWludFN1cmZhY2UoKS5zZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygKLQkJCSJzZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5hbmNob3JNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IG51bGw7Ci0JCWN1cnJlbnRGaWd1cmUgPSBudWxsOwotCQljb250cm9sUG9pbnRzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCi0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmludGVyYWN0aXZlTW9kZSIpKTsKLQkJcHJldmlvdXNGaWd1cmUgPSBjdXJyZW50RmlndXJlOwotCi0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsIFBvaW50IGxhc3RQb2ludCA9IChQb2ludCkgY29udHJvbFBvaW50cy5lbGVtZW50QXQoY29udHJvbFBvaW50cy5zaXplKCkgLSAxKTsKLQkJCWlmIChsYXN0UG9pbnQueCA9PSBldmVudC54IHx8IGxhc3RQb2ludC55ID09IGV2ZW50LnkpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJfQotCQljb250cm9sUG9pbnRzLmFkZChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoY29udHJvbFBvaW50cy5zaXplKCkgPj0gMikgewotCQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCQlwcmV2aW91c0ZpZ3VyZSA9IGNyZWF0ZUZpZ3VyZSgKLQkJCQkoUG9pbnRbXSkgY29udHJvbFBvaW50cy50b0FycmF5KG5ldyBQb2ludFtjb250cm9sUG9pbnRzLnNpemUoKV0pLAotCQkJCWNvbnRyb2xQb2ludHMuc2l6ZSgpLCB0cnVlKTsKLQkJfQotCQlyZXNldFNlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VVcCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHsKLQkJCXJlc2V0U2Vzc2lvbigpOyAvLyBhYm9ydCBpZiByaWdodCBvciBtaWRkbGUgbW91c2UgYnV0dG9uIHByZXNzZWQKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VNb3ZlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA9PSAwKSB7Ci0JCQlwcy5zZXRTdGF0dXNDb29yZChwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCQlyZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCX0gZWxzZSB7Ci0JCQlwcy5zZXRTdGF0dXNDb29yZFJhbmdlKChQb2ludCkgY29udHJvbFBvaW50cy5lbGVtZW50QXQoY29udHJvbFBvaW50cy5zaXplKCkgLSAxKSwKLQkJCQlwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCX0KLQotCQlwcy5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJUG9pbnRbXSBwb2ludHMgPSAoUG9pbnRbXSkgY29udHJvbFBvaW50cy50b0FycmF5KG5ldyBQb2ludFtjb250cm9sUG9pbnRzLnNpemUoKSArIDFdKTsKLQkJcG9pbnRzW2NvbnRyb2xQb2ludHMuc2l6ZSgpXSA9IHBzLmdldEN1cnJlbnRQb3NpdGlvbigpOwotCQljdXJyZW50RmlndXJlID0gY3JlYXRlRmlndXJlKHBvaW50cywgcG9pbnRzLmxlbmd0aCwgZmFsc2UpOwotCQlwcy5hZGRSdWJiZXJiYW5kU2VsZWN0aW9uKGN1cnJlbnRGaWd1cmUpOwotCX0JCi0KLQkvKioKLQkgKiBUZW1wbGF0ZSBNZXRob2Q6IENyZWF0ZXMgYSBGaWd1cmUgZm9yIGRyYXdpbmcgcnViYmVyYmFuZCBlbnRpdGllcyBhbmQgdGhlIGZpbmFsIHByb2R1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gcG9pbnRzIHRoZSBhcnJheSBvZiBjb250cm9sIHBvaW50cwotCSAqIEBwYXJhbSBudW1Qb2ludHMgdGhlIG51bWJlciBvZiB2YWxpZCBwb2ludHMgaW4gdGhlIGFycmF5IChuID49IDIpCi0JICogQHBhcmFtIGNsb3NlZCB0cnVlIGlmIHRoZSB1c2VyIGRvdWJsZS1jbGlja2VkIG9uIHRoZSBmaW5hbCBjb250cm9sIHBvaW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnRbXSBwb2ludHMsIGludCBudW1Qb2ludHMsIGJvb2xlYW4gY2xvc2VkKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkRWxsaXBzZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRFbGxpcHNlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTlhZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRFbGxpcHNlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBTb2xpZCBFbGxpcHNlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU29saWRFbGxpcHNlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTb2xpZEVsbGlwc2UKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzIG9mIGEgYm94Ci0JICogYm91bmRpbmcgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqLwotCXB1YmxpYyBTb2xpZEVsbGlwc2VGaWd1cmUoQ29sb3IgY29sb3IsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQl0aGlzLmNvbG9yID0gY29sb3I7IHRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsT3ZhbChyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUG9seWdvbkZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRQb2x5Z29uRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTE0MDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRQb2x5Z29uRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBMaW5lIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU29saWRQb2x5Z29uRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50W10gcG9pbnRzOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTb2xpZFBvbHlnb24KLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGEgc2VxdWVuY2Ugb2YgdmVydGljZXMuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gdmVydGljZXMgdGhlIGFycmF5IG9mIHZlcnRpY2VzIG1ha2luZyB1cCB0aGUgcG9seWdvbgotCSAqIEBwYXJhbSBudW1Qb2ludCB0aGUgbnVtYmVyIG9mIHZhbGlkIHBvaW50cyBpbiB0aGUgYXJyYXkgKG4gPj0gMykKLQkgKi8KLQlwdWJsaWMgU29saWRQb2x5Z29uRmlndXJlKENvbG9yIGNvbG9yLCBQb2ludFtdIHZlcnRpY2VzLCBpbnQgbnVtUG9pbnRzKSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJdGhpcy5wb2ludHMgPSBuZXcgaW50W251bVBvaW50cyAqIDJdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7Ci0JCQlwb2ludHNbaSAqIDJdID0gdmVydGljZXNbaV0ueDsKLQkJCXBvaW50c1tpICogMiArIDFdID0gdmVydGljZXNbaV0ueTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlpbnRbXSBkcmF3UG9pbnRzID0gbmV3IGludFtwb2ludHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDIpIHsKLQkJCWRyYXdQb2ludHNbaV0gPSBwb2ludHNbaV0gKiBmZGMueFNjYWxlIC0gZmRjLnhPZmZzZXQ7Ci0JCQlkcmF3UG9pbnRzW2kgKyAxXSA9IHBvaW50c1tpICsgMV0gKiBmZGMueVNjYWxlIC0gZmRjLnlPZmZzZXQ7Ci0JCX0KLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbFBvbHlnb24oZHJhd1BvaW50cyk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCWludCB4bWluID0gSW50ZWdlci5NQVhfVkFMVUUsIHltaW4gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaW50IHhtYXggPSBJbnRlZ2VyLk1JTl9WQUxVRSwgeW1heCA9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlpZiAocG9pbnRzW2ldIDwgeG1pbikgeG1pbiA9IHBvaW50c1tpXTsKLQkJCWlmIChwb2ludHNbaV0gPiB4bWF4KSB4bWF4ID0gcG9pbnRzW2ldOwotCQkJaWYgKHBvaW50c1tpKzFdIDwgeW1pbikgeW1pbiA9IHBvaW50c1tpKzFdOwotCQkJaWYgKHBvaW50c1tpKzFdID4geW1heCkgeW1heCA9IHBvaW50c1tpKzFdOwotCQl9CQkKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeG1pbiwgeW1pbiwgeG1heCwgeW1heCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUmVjdGFuZ2xlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YyZmI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBTb2xpZFJlY3RhbmdsZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTb2xpZFJlY3RhbmdsZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqLwotCXB1YmxpYyBTb2xpZFJlY3RhbmdsZUZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxSZWN0YW5nbGUoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0KTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzBkMmVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgU29saWRSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnQgeDEsIHkxLCB4MiwgeTIsIGRpYW1ldGVyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTb2xpZFJlY3RhbmdsZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSBkaWFtZXRlciB0aGUgZGlhbWV0ZXIgb2YgY3VydmF0dXJlIG9mIGFsbCBmb3VyIGNvcm5lcnMKLQkgKi8KLQlwdWJsaWMgU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBkaWFtZXRlcikgewotCQl0aGlzLmNvbG9yID0gY29sb3I7IHRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQkJdGhpcy5kaWFtZXRlciA9IGRpYW1ldGVyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxSb3VuZFJlY3RhbmdsZShyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIGRpYW1ldGVyLCBkaWFtZXRlcik7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dEZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJkMGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFJlY3RhbmdsZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgIGNvbG9yOwotCXByaXZhdGUgRm9udCAgIGZvbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIGludCB4LCB5OwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBUZXh0RmlndXJlCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gZm9udCAgdGhlIGZvbnQgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHRleHQgIHRoZSB0ZXh0IHRvIGRyYXcsIHRhYiBhbmQgbmV3LWxpbmUgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZAotCSAqIEBwYXJhbSB4ICAgICB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgdGV4dCBib3VuZGluZyBib3gKLQkgKiBAcGFyYW0geSAgICAgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHRleHQgYm91bmRpbmcgYm94Ci0JICovCi0JcHVibGljIFRleHRGaWd1cmUoQ29sb3IgY29sb3IsIEZvbnQgZm9udCwgU3RyaW5nIHRleHQsIGludCB4LCBpbnQgeSkgewotCQl0aGlzLmNvbG9yID0gY29sb3I7IHRoaXMuZm9udCA9IGZvbnQ7IHRoaXMudGV4dCA9IHRleHQ7IHRoaXMueCA9IHg7IHRoaXMueSA9IHk7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVBvaW50IHAgPSBmZGMudG9DbGllbnRQb2ludCh4LCB5KTsKLQkJZmRjLmdjLnNldEZvbnQoZm9udCk7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmRyYXdUZXh0KHRleHQsIHAueCwgcC55LCB0cnVlKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJRm9udCBvbGRGb250ID0gZmRjLmdjLmdldEZvbnQoKTsKLQkJZmRjLmdjLnNldEZvbnQoZm9udCk7Ci0JCVBvaW50IHRleHRFeHRlbnQgPSBmZGMuZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJZmRjLmdjLnNldEZvbnQob2xkRm9udCk7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgsIHksIHggKyB0ZXh0RXh0ZW50LngsIHkgKyB0ZXh0RXh0ZW50LnkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0VG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2Nzg3ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotLyoqCi0gKiBBIHRleHQgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dFRvb2wgZXh0ZW5kcyBCYXNpY1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhd1RleHQgPSBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuVGV4dC5zZXR0aW5ncy5kZWZhdWx0dGV4dCIpOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50VG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgVGV4dFRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuVGV4dC5sYWJlbCIpOwotCX0KLQkKLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHRvb2wuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5zZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygKLQkJCSJzZXNzaW9uLlRleHQubWVzc2FnZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHRvb2wuCi0gICAgICovCi0JcHVibGljIHZvaWQgZW5kU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEFib3J0cyB0aGUgY3VycmVudCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRTZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gPT0gMSkgewotCQkJLy8gZHJhdyB3aXRoIGxlZnQgbW91c2UgYnV0dG9uCi0JCQlnZXRQYWludFN1cmZhY2UoKS5jb21taXRSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZXQgdGV4dCB3aXRoIHJpZ2h0IG1vdXNlIGJ1dHRvbgotCQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFBhaW50U3VyZmFjZSgpLmdldFNoZWxsKCk7Ci0JCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQlkaWFsb2cuc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuVGV4dC5kaWFsb2cudGl0bGUiKSk7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LmRpYWxvZy5tZXNzYWdlIikpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJZmluYWwgVGV4dCBmaWVsZCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJZmllbGQuc2V0VGV4dChkcmF3VGV4dCk7Ci0JCQlmaWVsZC5zZWxlY3RBbGwoKTsKLQkJCWZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZywgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlidXR0b25zLnNldExheW91dChsYXlvdXQpOwotCQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9LIikpOwotCQkJb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkcmF3VGV4dCA9IGZpZWxkLmdldFRleHQoKTsKLQkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCWNhbmNlbC5zZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2FuY2VsIikpOwotCQkJY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uKG9rKTsKLQkJCWRpYWxvZy5wYWNrKCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gZGlhbG9nLmdldERpc3BsYXkoKTsKLQkJCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSAmJiAhIGRpYWxvZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VVcCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VNb3ZlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJcHMuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCXBzLmFkZFJ1YmJlcmJhbmRTZWxlY3Rpb24oCi0JCQluZXcgVGV4dEZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkZvbnQsCi0JCQkJZHJhd1RleHQsIGV2ZW50LngsIGV2ZW50LnkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTFjZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgVG9vbCB7Ci0JcHVibGljIGludCBpZDsKLQlwdWJsaWMgU3RyaW5nIG5hbWU7Ci0JcHVibGljIFN0cmluZyBncm91cDsKLQlwdWJsaWMgaW50IHR5cGU7Ci0JcHVibGljIFJ1bm5hYmxlIGFjdGlvbjsKLQlwdWJsaWMgSW1hZ2UgaW1hZ2UgPSBudWxsOwotCXB1YmxpYyBPYmplY3QgZGF0YTsKLQkKLQlwdWJsaWMgVG9vbChpbnQgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JvdXAsIGludCB0eXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5ncm91cCA9IGdyb3VwOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBUb29sKGludCBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBncm91cCwgaW50IHR5cGUsIE9iamVjdCBkYXRhKSB7Ci0JCXRoaXMoaWQsIG5hbWUsIGdyb3VwLCB0eXBlKTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sU2V0dGluZ3MuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2xTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjliZWRjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2xTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRvb2wgU2V0dGluZ3Mgb2JqZWN0cyBncm91cCB0b29sLXJlbGF0ZWQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvb2xTZXR0aW5ncyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnROb25lID0gMCwgZnRPdXRsaW5lID0gMSwgZnRTb2xpZCA9IDI7Ci0KLQkvKioKLQkgKiBjb21tb25Gb3JlZ3JvdW5kQ29sb3I6IGN1cnJlbnQgdG9vbCBmb3JlZ3JvdW5kIGNvbG91cgotCSAqLwotCXB1YmxpYyBDb2xvciBjb21tb25Gb3JlZ3JvdW5kQ29sb3I7Ci0KLQkvKioKLQkgKiBjb21tb25CYWNrZ3JvdW5kQ29sb3I6IGN1cnJlbnQgdG9vbCBiYWNrZ3JvdW5kIGNvbG91cgotCSAqLwotCXB1YmxpYyBDb2xvciBjb21tb25CYWNrZ3JvdW5kQ29sb3I7Ci0KLQkvKioKLQkgKiBjb21tb25Gb250OiBjdXJyZW50IGZvbnQKLQkgKi8KLQlwdWJsaWMgRm9udCBjb21tb25Gb250OwotCi0JLyoqCi0JICogY29tbW9uRmlsbFR5cGU6IGN1cnJlbnQgZmlsbCB0eXBlCi0JICogPHA+T25lIG9mIGZ0Tm9uZSwgZnRPdXRsaW5lLCBmdFNvbGlkLjwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbW1vbkZpbGxUeXBlID0gZnROb25lOwotCi0JLyoqCi0JICogY29tbW9uTGluZVN0eWxlOiBjdXJyZW50IGxpbmUgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgY29tbW9uTGluZVN0eWxlID0gU1dULkxJTkVfU09MSUQ7Ci0JCi0JLyoqCi0JICogYWlyYnJ1c2hSYWRpdXM6IGNvdmVyYWdlIHJhZGl1cyBpbiBwaXhlbHMKLQkgKi8KLQlwdWJsaWMgaW50IGFpcmJydXNoUmFkaXVzID0gMTA7Ci0JCi0JLyoqCi0JICogYWlyYnJ1c2hJbnRlbnNpdHk6IGF2ZXJhZ2Ugc3VyZmFjZSBhcmVhIGNvdmVyYWdlIGluIHJlZ2lvbiBkZWZpbmVkIGJ5IHJhZGl1cyBwZXIgImpvdCIKLQkgKi8KLQlwdWJsaWMgaW50IGFpcmJydXNoSW50ZW5zaXR5ID0gMzA7Ci0JCi0JLyoqCi0JICogcm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyOiB0aGUgZGlhbWV0ZXIgb2YgY3VydmF0dXJlIG9mIGNvcm5lcnMgaW4gYSByb3VuZGVkIHJlY3RhbmdsZQotCSAqLwotCXB1YmxpYyBpbnQgcm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyID0gMTY7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX25vbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9ub25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZGQ1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX25vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9vdXRsaW5lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfb3V0bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2NmZWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9vdXRsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfc29saWQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9zb2xpZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzRlNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9zb2xpZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTdiYjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2hkb3QuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2hkb3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjI5NjhjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoZG90LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kb3QuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2RvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MzdjY2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2RvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfc29saWQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX3NvbGlkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNTdjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfc29saWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvb3B0aW9uc19mb250LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L29wdGlvbnNfZm9udC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWZlMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvb3B0aW9uc19mb250LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfYWlyYnJ1c2guZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9haXJicnVzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTBlZGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9haXJicnVzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2VsbGlwc2UuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9lbGxpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyMTQyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2VsbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9saW5lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjgxOWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9saW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcGVuY2lsLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcGVuY2lsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2YTIzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BlbmNpbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BvbHlsaW5lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcG9seWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM4NGU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcG9seWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yZWN0YW5nbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yZWN0YW5nbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZkZDU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcmVjdGFuZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcm91bmRlZHJlY3RhbmdsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjg0NWQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcm91bmRlZHJlY3RhbmdsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3RleHQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3NDU3Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3RleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9JbWFnZXMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3OTE5Y2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvcjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZXMgewotCi0JLy8gQml0bWFwIEltYWdlcwotCXB1YmxpYyBJbWFnZSBCb2xkOwotCXB1YmxpYyBJbWFnZSBJdGFsaWM7Ci0JcHVibGljIEltYWdlIFVuZGVybGluZTsKLQlwdWJsaWMgSW1hZ2UgU3RyaWtlb3V0OwotCXB1YmxpYyBJbWFnZSBSZWQ7Ci0JcHVibGljIEltYWdlIEdyZWVuOwotCXB1YmxpYyBJbWFnZSBCbHVlOwotCXB1YmxpYyBJbWFnZSBFcmFzZTsKLQkKLQlJbWFnZSAgW10gQWxsQml0bWFwczsKLQotSW1hZ2VzICgpIHsKLX0KLQotcHVibGljIHZvaWQgZnJlZUFsbCAoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPEFsbEJpdG1hcHMubGVuZ3RoOyBpKyspIEFsbEJpdG1hcHMgW2ldLmRpc3Bvc2UgKCk7Ci0JQWxsQml0bWFwcyA9IG51bGw7Ci19Ci0KLUltYWdlIGNyZWF0ZUJpdG1hcEltYWdlKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gSW1hZ2VzLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKGZpbGVOYW1lICsgIi5ibXAiKTsKLQlJbnB1dFN0cmVhbSBtYXNrU3RyZWFtID0gSW1hZ2VzLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKGZpbGVOYW1lICsgIl9tYXNrLmJtcCIpOwotCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhIChzb3VyY2VTdHJlYW0pOwotCUltYWdlRGF0YSBtYXNrID0gbmV3IEltYWdlRGF0YSAobWFza1N0cmVhbSk7Ci0JSW1hZ2UgcmVzdWx0ID0gbmV3IEltYWdlIChkaXNwbGF5LCBzb3VyY2UsIG1hc2spOwotCXRyeSB7Ci0JCXNvdXJjZVN0cmVhbS5jbG9zZSAoKTsKLQkJbWFza1N0cmVhbS5jbG9zZSAoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlICgpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1wdWJsaWMgdm9pZCBsb2FkQWxsIChEaXNwbGF5IGRpc3BsYXkpIHsKLQkvLyBCaXRtYXAgSW1hZ2VzCi0JQm9sZCA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiYm9sZCIpOwotCUl0YWxpYyA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiaXRhbGljIik7Ci0JVW5kZXJsaW5lID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJ1bmRlcmxpbmUiKTsKLQlTdHJpa2VvdXQgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInN0cmlrZW91dCIpOwotCVJlZCA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAicmVkIik7Ci0JR3JlZW4gPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImdyZWVuIik7Ci0JQmx1ZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiYmx1ZSIpOwotCUVyYXNlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJlcmFzZSIpOwotCQotCUFsbEJpdG1hcHMgPSBuZXcgSW1hZ2UgW10gewotCQlCb2xkLAotCQlJdGFsaWMsCi0JCVVuZGVybGluZSwKLQkJU3RyaWtlb3V0LAotCQlSZWQsCi0JCUdyZWVuLAotCQlCbHVlLAotCQlFcmFzZSwKLQl9OwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL1RleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzMzZWRjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL1RleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEVkaXRvciB7ICAKLQlTaGVsbCBzaGVsbDsKLQlUb29sQmFyIHRvb2xCYXI7Ci0JU3R5bGVkVGV4dCB0ZXh0OwotCi0JSW1hZ2VzIGltYWdlcyA9IG5ldyBJbWFnZXMoKTsKLQlWZWN0b3IgY2FjaGVkU3R5bGVzID0gbmV3IFZlY3RvcigpOwotCUNvbG9yIFJFRCA9IG51bGw7IAotCUNvbG9yIEJMVUUgPSBudWxsOyAKLQlDb2xvciBHUkVFTiA9IG51bGw7IAotCUZvbnQgZm9udCA9IG51bGw7Ci0JVG9vbEl0ZW0gYm9sZEJ1dHRvbiwgaXRhbGljQnV0dG9uLCB1bmRlcmxpbmVCdXR0b24sIHN0cmlrZW91dEJ1dHRvbjsKLQkKLQlzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VzID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc190ZXh0ZWRpdG9yIik7Ci0KLU1lbnUgY3JlYXRlRWRpdE1lbnUoKSB7Ci0JTWVudSBiYXIgPSBzaGVsbC5nZXRNZW51QmFyICgpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChiYXIpOwotCQotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkN1dF9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1gnKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJaGFuZGxlQ3V0Q29weSgpOwotCQkJdGV4dC5jdXQoKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkNvcHlfbWVudWl0ZW0iKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdDJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZUN1dENvcHkoKTsKLQkJCXRleHQuY29weSgpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiUGFzdGVfbWVudWl0ZW0iKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdWJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCXRleHQucGFzdGUoKTsKLQkJfQotCX0pOwotCW5ldyBNZW51SXRlbSAobWVudSwgU1dULlNFUEFSQVRPUik7CQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkZvbnRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCXNldEZvbnQoKTsKLQkJfQotCX0pOwotCXJldHVybiBtZW51OwotfQotCi1NZW51IGNyZWF0ZUZpbGVNZW51KCkgewotCU1lbnUgYmFyID0gc2hlbGwuZ2V0TWVudUJhciAoKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoYmFyKTsKLQkKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFeGl0X21lbnVpdGVtIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzaGVsbC5jbG9zZSAoKTsKLQkJfQotCX0pOwotCi0JcmV0dXJuIG1lbnU7Ci19Ci0KLS8qCi0gKiBTZXQgYSBzdHlsZQotICovCi12b2lkIHNldFN0eWxlKFdpZGdldCB3aWRnZXQpIHsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaWYgKChzZWwgPT0gbnVsbCkgfHwgKHNlbC55ID09IDApKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZTsKLQlmb3IgKGludCBpID0gc2VsLng7IGk8c2VsLngrc2VsLnk7IGkrKykgewotCQlTdHlsZVJhbmdlIHJhbmdlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWlmIChyYW5nZSAhPSBudWxsKSB7Ci0JCQlzdHlsZSA9IChTdHlsZVJhbmdlKXJhbmdlLmNsb25lKCk7Ci0JCQlzdHlsZS5zdGFydCA9IGk7Ci0JCQlzdHlsZS5sZW5ndGggPSAxOwotCQl9IGVsc2UgewotCQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShpLCAxLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJfQotCQlpZiAod2lkZ2V0ID09IGJvbGRCdXR0b24pIHsKLQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuQk9MRDsKLQkJfSBlbHNlIGlmICh3aWRnZXQgPT0gaXRhbGljQnV0dG9uKSB7Ci0JCQlzdHlsZS5mb250U3R5bGUgXj0gU1dULklUQUxJQzsJCQkJCQkKLQkJfSBlbHNlIGlmICh3aWRnZXQgPT0gdW5kZXJsaW5lQnV0dG9uKSB7Ci0JCQlzdHlsZS51bmRlcmxpbmUgPSAhc3R5bGUudW5kZXJsaW5lOwotCQl9IGVsc2UgaWYgKHdpZGdldCA9PSBzdHJpa2VvdXRCdXR0b24pIHsKLQkJCXN0eWxlLnN0cmlrZW91dCA9ICFzdHlsZS5zdHJpa2VvdXQ7Ci0JCX0KLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsJCQkKLX0KLQotLyoKLSAqIENsZWFyIGFsbCBzdHlsZSBkYXRhIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLSAqLwotdm9pZCBjbGVhcigpIHsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaWYgKChzZWwgIT0gbnVsbCkgJiYgKHNlbC55ICE9IDApKSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2VsLngsIHNlbC55LCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLX0KLS8qCi0gKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotICovCi12b2lkIGZnQ29sb3IoQ29sb3IgZmcpIHsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaWYgKChzZWwgPT0gbnVsbCkgfHwgKHNlbC55ID09IDApKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZSwgcmFuZ2U7Ci0JZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJcmFuZ2UgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQlzdHlsZS5mb3JlZ3JvdW5kID0gZmc7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlIChpLCAxLCBmZywgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCX0KLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLX0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRWRpdF9tZW51aXRlbSIpKTsKLQllZGl0SXRlbS5zZXRNZW51IChjcmVhdGVFZGl0TWVudSAoKSk7Ci19Ci0KLXZvaWQgY3JlYXRlU2hlbGwgKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJXaW5kb3dfdGl0bGUiKSk7CQotCWltYWdlcy5sb2FkQWxsIChkaXNwbGF5KTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lciAobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkIChEaXNwb3NlRXZlbnQgZSkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlpbWFnZXMuZnJlZUFsbCAoKTsKLQkJCVJFRC5kaXNwb3NlKCk7Ci0JCQlHUkVFTi5kaXNwb3NlKCk7Ci0JCQlCTFVFLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVTdHlsZWRUZXh0KCkgewotCWluaXRpYWxpemVDb2xvcnMoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0Jc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCXRleHQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBlKSB7Ci0JCQloYW5kbGVFeHRlbmRlZE1vZGlmeShlKTsKLQkJfQotCX0pOwotfQotCi12b2lkIGNyZWF0ZVRvb2xCYXIoKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JU2VsZWN0aW9uQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc2V0U3R5bGUgKGV2ZW50LndpZGdldCk7Ci0JCX0KLQl9OwotCWJvbGRCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQlib2xkQnV0dG9uLnNldEltYWdlKGltYWdlcy5Cb2xkKTsKLQlib2xkQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIkJvbGQiKSk7Ci0JYm9sZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JaXRhbGljQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JaXRhbGljQnV0dG9uLnNldEltYWdlKGltYWdlcy5JdGFsaWMpOwotCWl0YWxpY0J1dHRvbi5zZXRUb29sVGlwVGV4dChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJJdGFsaWMiKSk7Ci0JaXRhbGljQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl1bmRlcmxpbmVCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQl1bmRlcmxpbmVCdXR0b24uc2V0SW1hZ2UoaW1hZ2VzLlVuZGVybGluZSk7Ci0JdW5kZXJsaW5lQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIlVuZGVybGluZSIpKTsKLQl1bmRlcmxpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXN0cmlrZW91dEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCXN0cmlrZW91dEJ1dHRvbi5zZXRJbWFnZShpbWFnZXMuU3RyaWtlb3V0KTsKLQlzdHJpa2VvdXRCdXR0b24uc2V0VG9vbFRpcFRleHQocmVzb3VyY2VzLmdldFN0cmluZygiU3RyaWtlb3V0IikpOwotCXN0cmlrZW91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuUmVkKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJZmdDb2xvcihSRUQpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuR3JlZW4pOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKEdSRUVOKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWl0ZW0uc2V0SW1hZ2UoaW1hZ2VzLkJsdWUpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKEJMVUUpOwotCQl9Ci0JfSk7CQotCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuRXJhc2UpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQljbGVhcigpOwotCQl9Ci0JfSk7Ci19Ci0vKgotICogQ2FjaGUgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZvciB0ZXh0IHRoYXQgaGFzIGJlZW4gY3V0IG9yIGNvcGllZC4KLSAqLwotdm9pZCBoYW5kbGVDdXRDb3B5KCkgewotCS8vIFNhdmUgdGhlIGN1dC9jb3BpZWQgc3R5bGUgaW5mbyBzbyB0aGF0IGR1cmluZyBwYXN0ZSB3ZSB3aWxsIG1haW50YWluCi0JLy8gdGhlIHN0eWxlIGluZm9ybWF0aW9uLiAgQ3V0L2NvcGllZCB0ZXh0IGlzIHB1dCBpbiB0aGUgY2xpcGJvYXJkIGluCi0JLy8gUlRGIGZvcm1hdCwgYnV0IGlzIG5vdCBwYXN0ZWQgaW4gUlRGIGZvcm1hdC4gIFRoZSBvdGhlciB3YXkgdG8gCi0JLy8gaGFuZGxlIHRoZSBwYXN0aW5nIG9mIHN0eWxlcyB3b3VsZCBiZSB0byBhY2Nlc3MgdGhlIENsaXBib2FyZCBkaXJlY3RseSBhbmQgCi0JLy8gcGFyc2UgdGhlIFJURiB0ZXh0LgotCWNhY2hlZFN0eWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaW50IHN0YXJ0WCA9IHNlbC54OwotCWZvciAoaW50IGk9c2VsLng7IGk8PXNlbC54K3NlbC55LTE7IGkrKykgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlzdHlsZS5zdGFydCA9IHN0eWxlLnN0YXJ0IC0gc3RhcnRYOwotCQkJaWYgKCFjYWNoZWRTdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3R5bGVSYW5nZSBsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSljYWNoZWRTdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCQlpZiAobGFzdFN0eWxlLnNpbWlsYXJUbyhzdHlsZSkgJiYgbGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkgewotCQkJCQlsYXN0U3R5bGUubGVuZ3RoKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FjaGVkU3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY2FjaGVkU3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOwotCQkJfQotCQl9Ci0JfQotfQotdm9pZCBoYW5kbGVFeHRlbmRlZE1vZGlmeShFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JaWYgKGV2ZW50Lmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZTsKLQlpZiAoZXZlbnQubGVuZ3RoID09IDEgfHwgdGV4dC5nZXRUZXh0UmFuZ2UoZXZlbnQuc3RhcnQsIGV2ZW50Lmxlbmd0aCkuZXF1YWxzKHRleHQuZ2V0TGluZURlbGltaXRlcigpKSkgewotCQkvLyBIYXZlIHRoZSBuZXcgdGV4dCB0YWtlIG9uIHRoZSBzdHlsZSBvZiB0aGUgdGV4dCB0byBpdHMgcmlnaHQgKGR1cmluZwotCQkvLyB0eXBpbmcpIGlmIG5vIHN0eWxlIGluZm9ybWF0aW9uIGlzIGFjdGl2ZS4KLQkJaW50IGNhcmV0T2Zmc2V0ID0gdGV4dC5nZXRDYXJldE9mZnNldCgpOwotCQlzdHlsZSA9IG51bGw7Ci0JCWlmIChjYXJldE9mZnNldCA8IHRleHQuZ2V0Q2hhckNvdW50KCkpIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoY2FyZXRPZmZzZXQpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSkgc3R5bGUuY2xvbmUgKCk7Ci0JCQlzdHlsZS5zdGFydCA9IGV2ZW50LnN0YXJ0OwotCQkJc3R5bGUubGVuZ3RoID0gZXZlbnQubGVuZ3RoOwotCQl9IGVsc2UgewotCQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShldmVudC5zdGFydCwgZXZlbnQubGVuZ3RoLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJfQkJCi0JCWlmIChib2xkQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZS5mb250U3R5bGUgfD0gU1dULkJPTEQ7Ci0JCWlmIChpdGFsaWNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlLmZvbnRTdHlsZSB8PSBTV1QuSVRBTElDOwotCQlzdHlsZS51bmRlcmxpbmUgPSB1bmRlcmxpbmVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCXN0eWxlLnN0cmlrZW91dCA9IHN0cmlrZW91dEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzdHlsZS5pc1Vuc3R5bGVkKCkpIHRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfSBlbHNlIHsKLQkJLy8gcGFzdGUgb2NjdXJyaW5nLCBoYXZlIHRleHQgdGFrZSBvbiB0aGUgc3R5bGVzIGl0IGhhZCB3aGVuIGl0IHdhcwotCQkvLyBjdXQvY29waWVkCi0JCWZvciAoaW50IGk9MDsgaTxjYWNoZWRTdHlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpY2FjaGVkU3R5bGVzLmVsZW1lbnRBdChpKTsKLQkJCVN0eWxlUmFuZ2UgbmV3U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZS5jbG9uZSgpOwotCQkJbmV3U3R5bGUuc3RhcnQgPSBzdHlsZS5zdGFydCArIGV2ZW50LnN0YXJ0OwotCQkJdGV4dC5zZXRTdHlsZVJhbmdlKG5ld1N0eWxlKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JVGV4dEVkaXRvciBleGFtcGxlID0gbmV3IFRleHRFZGl0b3IgKCk7Ci0JU2hlbGwgc2hlbGwgPSBleGFtcGxlLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQljcmVhdGVTaGVsbCAoZGlzcGxheSk7Ci0JY3JlYXRlTWVudUJhciAoKTsKLQljcmVhdGVUb29sQmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgc2V0Rm9udCgpIHsKLQlGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhzaGVsbCk7Ci0JZm9udERpYWxvZy5zZXRGb250TGlzdCgodGV4dC5nZXRGb250KCkpLmdldEZvbnREYXRhKCkpOwotCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JaWYgKGZvbnREYXRhICE9IG51bGwpIHsKLQkJaWYgKGZvbnQgIT0gbnVsbCkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJZm9udCA9IG5ldyBGb250KHNoZWxsLmdldERpc3BsYXkoKSwgZm9udERhdGEpOwotCQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JfQotfQotCi12b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JUkVEID0gbmV3IENvbG9yIChkaXNwbGF5LCBuZXcgUkdCKDI1NSwwLDApKTsKLQlCTFVFID0gbmV3IENvbG9yIChkaXNwbGF5LCBuZXcgUkdCKDAsMCwyNTUpKTsKLQlHUkVFTiA9IG5ldyBDb2xvciAoZGlzcGxheSwgbmV3IFJHQigwLDI1NSwwKSk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ibHVlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRjN2FjOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ibHVlX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ibHVlX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2U5MjY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZV9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzE4NGJiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4Mjc1MWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2VyYXNlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQyYWNlNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2VyYXNlLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2VfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2VyYXNlX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmFiMjFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2VfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZ3JlZW4uYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjY2EwMjNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZ3JlZW4uYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbl9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZ3JlZW5fbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZTkyNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbl9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNjcyMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2l0YWxpYy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2l0YWxpY19tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ3NjJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGM2M2JlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcmVkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcmVkX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZTkyNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDI5ODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9zdHJpa2VvdXQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9zdHJpa2VvdXRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5YWIzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYWNmZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3VuZGVybGluZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3VuZGVybGluZV9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjlkZTk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzMTZiNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OThkMTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBnbGV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5nbGV4YW1wbGVzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1M2NlNjZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLk9wZW5HTEV4YW1wbGVTZXQubmFtZSA9IFNXVCBPcGVuR0wgRXhhbXBsZXMgUGx1Z2luCi0KLWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5uYW1lID0gT3BlbkdMIEV4YW1wbGUKLWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgT3BlbkdMIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBtYW55IE9wZW5HTCBmZWF0dXJlcyBpbiBcCi0JYW4gU1dUIGFwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTg3MjVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcyIKLSAgIG5hbWU9IiVwbHVnaW4uT3BlbkdMRXhhbXBsZVNldC5uYW1lIgotICAgdmVyc2lvbj0iMC41LjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9IiI+Ci0KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLTxyZXF1aXJlcz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vcGVuZ2wiIHZlcnNpb249IjAuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0iZ2xleGFtcGxlcy5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICA8L2xpYnJhcnk+Ci08L3J1bnRpbWU+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLk9wZW5HTEV4YW1wbGUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy5PcGVuR0xFeGFtcGxlLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMuT3BlbkdMRXhhbXBsZSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfb3BlbmdsLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkyNzEzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gU1dUIE9wZW5HTCBFeGFtcGxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9BbnRpYWxpYXNpbmdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYWNiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQW50aWFsaWFzaW5nVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIEJ1dHRvbiBhbnRpQWxpYXNCdXR0b247Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZiwgeVBvcyA9IDAuMGYsIHpQb3MgPSAtNi4wZjsKLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMTsKLQkJCX0KLQkJfSk7Ci0KLQkJYW50aUFsaWFzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWFudGlBbGlhc0J1dHRvbi5zZXRUZXh0KCJBbnRpLUFsaWFzaW5nIik7Ci0JCWFudGlBbGlhc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWFudGlBbGlhc0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGFudGlBbGlhc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0wuZ2xEZWxldGVMaXN0cygxLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJBbnRpLWFsaWFzaW5nIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlmaW5hbCBmbG9hdFtdIEJFWklFUl9QT0lOVFMgPSB7Ci0JCQktMS41ZiwgLTEuNWYsIDQuMGYsIC0wLjVmLCAtMS41ZiwgMi4wZiwgMC41ZiwgLTEuNWYsCi0JCQktMS4wZiwgMS41ZiwgLTEuNWYsIDIuMGYsIC0xLjVmLCAtMC41ZiwgMS4wZiwgLTAuNWYsCi0JCQktMC41ZiwgMy4wZiwgMC41ZiwgLTAuNWYsIDAuMGYsIDEuNWYsIC0wLjVmLCAtMS4wZiwKLQkJCS0xLjVmLCAwLjVmLCA0LjBmLCAtMC41ZiwgMC41ZiwgMC4wZiwgMC41ZiwgMC41ZiwKLQkJCTMuMGYsIDEuNWYsIDAuNWYsIDQuMGYsIC0xLjVmLCAxLjVmLCAtMi4wZiwgLTAuNWYsCi0JCQkxLjVmLCAtMi4wZiwgMC41ZiwgMS41ZiwgMC4wZiwgMS41ZiwgMS41ZiwgLTEuMGYsCi0JCX07Ci0JCUdMLmdsSGludChHTC5HTF9MSU5FX1NNT09USF9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfVkVSVEVYXzMsIDAsIDEsIDMsIDQsIDAsIDEsIDEyLCA0LCBCRVpJRVJfUE9JTlRTKTsKLQkJR0wuZ2xNYXBHcmlkMmYoMzAsIDAuMGYsIDEuMGYsIDMwLCAwLjBmLCAxLjBmKTsKLQotCQlHTC5nbEVuYWJsZShHTC5HTF9BVVRPX05PUk1BTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TVElQUExFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9NQVAyX1ZFUlRFWF8zKTsKLQotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwotCQlHTC5nbE5ld0xpc3QoMSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsRXZhbE1lc2gyKEdMLkdMX0xJTkUsIDAsIDMwLCAwLCAzMCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsQ2FsbExpc3QoMSk7CS8vIGRyYXcgdGhlIGJlaXplciBzdXJmYWNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9BcmVhVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1ZWU3Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEFyZWFUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCWFic3RyYWN0IGNsYXNzIFNoYXBlIHsKLQkJYWJzdHJhY3Qgdm9pZCBkcmF3KCk7Ci0JfQotCWNsYXNzIFN0YXRlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzdGF0ZQotCQkgKiBAcGFyYW0gaW5kZXggdGhlIGRpc3BsYXkgbGlzdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RhdGUKLQkJICovCi0JCVN0YXRlIChTdHJpbmcgbmFtZSwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQl2b2lkIGRpc3BsYXkoKSB7Ci0JCQlHTC5nbENhbGxMaXN0KGluZGV4KTsKLQkJfQotCQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlHTC5nbERlbGV0ZUxpc3RzKGluZGV4LCAxKTsKLQkJfQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZVtdIHN0YXRlczsKLQlwcml2YXRlIFN0YXRlIGN1cnJlbnRTdGF0ZTsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC0zMC4wZjsKLQlwcml2YXRlIGZsb2F0IHhSb3QgPSA5MC4wZiwgeVJvdCA9IDAuMGYsIHpSb3QgPSAwLjBmOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYywgZGlzazsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gNDA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIHJvdGF0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0VGV4dCgiUm90YXRpb24iKTsKLQkJcm90YXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeFJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXhSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXhSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl4Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXhSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeFJvdGF0aW9uLnNldFNlbGVjdGlvbig5MCk7Ci0JCXhSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFJvdCA9IHhSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeVJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl5Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl5Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeVJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl5Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXlSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXlSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVJvdCA9IHlSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgelJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl6Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl6Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJelJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl6Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXpSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIG9wdGlvbnNHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJbmV3IExhYmVsKG9wdGlvbnNHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlNoYXBlOiIpOwotCi0JCWZpbmFsIENvbWJvIHN0YXRlc0NvbWJvID0gbmV3IENvbWJvKG9wdGlvbnNHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzdGF0ZXNDb21iby5hZGQoc3RhdGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc3RhdGVzQ29tYm8uc2VsZWN0KDApOwotCQlzdGF0ZXNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFN0YXRlID0gc3RhdGVzW3N0YXRlc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gbGlnaHRzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWxpZ2h0c0J1dHRvbi5zZXRUZXh0KCJMaWdodHMiKTsKLQkJbGlnaHRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJbGlnaHRzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAobGlnaHRzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTC5nbERpc2FibGUoR0wuR0xfTElHSFRJTkcpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKGRpc2spOwotCQlpZiAoc3RhdGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RhdGVzIFtpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgbG9naWNhbCBBTkQgb2YgdHdvIHNoYXBlcy4KLQkgKgotCSAqIEBwYXJhbSBhIHNoYXBlIEEKLQkgKiBAcGFyYW0gYiBzaGFwZSBCCi0JICovCi0Jdm9pZCBkcmF3QWFuZEIoU2hhcGUgYSwgU2hhcGUgYikgewotCQkvLyBkcmF3IHBhcnRzIG9mIEIgdGhhdCBhcmUgaW5zaWRlIEEKLQkJZHJhd0FpbnNpZGVCKGEsIGIsIEdMLkdMX0JBQ0ssIEdMLkdMX05PVEVRVUFMKTsKLQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlIGZvbGxvd2luZyB0byBzaG93IHVwCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gdHVybiBvbiBkZXB0aCB0ZXN0aW5nCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9BTFdBWVMpOwotCQkvLyByZW5kZXIgdGhlIGZyb250IGZhY2Ugb2YgQgotCQliLmRyYXcoKTsKLQkJLy8gcmVzZXQgdGhlIGRlcHRoIGZ1bmN0aW9uCi0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFU1MpOwotCQkvLyBkcmF3IHBhcnRzIG9mIEEgdGhhdCBhcmUgaW5zaWRlIEIKLQkJZHJhd0FpbnNpZGVCKGIsIGEsIEdMLkdMX0JBQ0ssIEdMLkdMX05PVEVRVUFMKTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgY29udGVudHMgb2Ygb25lIHNoYXBlIHRoYXQgYXBwZWFyIHdpdGhpbiBhbm90aGVyLgotCSAqCi0JICogQHBhcmFtIGEgdGhlIHNoYXBlIHRvIGRyYXcKLQkgKiBAcGFyYW0gYiB0aGUgY29uc3RyYWluaW5nIHNoYXBlCi0JICogQHBhcmFtIGZhY2UKLQkgKiBAcGFyYW0gdGVzdAotCSAqLwotCXZvaWQgZHJhd0FpbnNpZGVCKFNoYXBlIGEsIFNoYXBlIGIsIGludCBmYWNlLCBpbnQgdGVzdCkgewotCQkvLyB0dXJuIG9mZiB0aGUgY29sb3IgYnVmZmVyCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gY2xlYXIgdGhlIHN0ZW5jaWwgYnVmZmVyCi0JCUdMLmdsQ2xlYXJTdGVuY2lsKDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gc2V0IHRvIHByb3BlciBDdWxsaW5nCi0JCUdMLmdsQ3VsbEZhY2UoZmFjZSk7Ci0JCS8vIHJlbmRlciBzaGFwZSBBCi0JCWEuZHJhdygpOwotCQkvLyBzZXQgZGVwdGggbWFzawotCQlHTC5nbERlcHRoTWFzayhmYWxzZSk7Ci0JCS8vIGVuYWJsZSBzdGVuY2lsIHRlc3QKLQkJR0wuZ2xFbmFibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDAsIDApOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyIHRvIGluY3JlbWVudCBpZiB0aGUgZGVwdGggdGVzdCBwYXNzZXMKLQkJR0wuZ2xTdGVuY2lsT3AoR0wuR0xfS0VFUCwgR0wuR0xfS0VFUCwgR0wuR0xfSU5DUik7Ci0JCS8vIHR1cm4gb24gYmFjayBmYWNlIGN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShHTC5HTF9CQUNLKTsKLQkJLy8gcmVuZGVyIEIKLQkJYi5kcmF3KCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gZGVjcmVtZW50IGlmIHRoZSBkZXB0aCB0ZXN0IHBhc3NlcwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9ERUNSKTsKLQkJLy8gY3VsbCB0aGUgZnJvbnQgZmFjZQotCQlHTC5nbEN1bGxGYWNlKEdMLkdMX0ZST05UKTsKLQkJLy8gcmVuZGVyIEIgYWdhaW4KLQkJYi5kcmF3KCk7Ci0JCS8vIHNldCBkZXB0aCBtYXNrCi0JCUdMLmdsRGVwdGhNYXNrKHRydWUpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJLy8gc2V0IHRoZSBzdGVuY2lsIGJ1ZmZlcgotCQlHTC5nbFN0ZW5jaWxGdW5jKHRlc3QsIDAsIDEpOwotCQkvLyB0dXJuIG9mZiBkZXB0aCB0ZXN0aW5nCi0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gc2V0IHRvIHByb3BlciBjdWxsaW5nCi0JCUdMLmdsQ3VsbEZhY2UoZmFjZSk7Ci0JCS8vIHJlbmRlciBBCi0JCWEuZHJhdygpOwotCQkvLyBkaXNhYmxlIHN0ZW5jaWwgdGVzdAotCQlHTC5nbERpc2FibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgbG9naWNhbCBPUiBvZiB0d28gc2hhcGVzLgotCSAqCi0JICogQHBhcmFtIGEgc2hhcGUgQQotCSAqIEBwYXJhbSBiIHNoYXBlIEIKLQkgKi8KLQl2b2lkIGRyYXdBb3JCKFNoYXBlIGEsIFNoYXBlIGIpIHsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCWEuZHJhdygpOwotCQliLmRyYXcoKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIG9uZSBzaGFwZSBzdWJ0cmFjdGVkIGZyb20gYW5vdGhlci4KLQkgKgotCSAqIEBwYXJhbSBhIHRoZSBiYXNlIHNoYXBlCi0JICogQHBhcmFtIGIgdGhlIHNoYXBlIHRvIHN1YnRyYWN0Ci0JICovCi0Jdm9pZCBkcmF3QXN1YkIoU2hhcGUgYSwgU2hhcGUgYikgewotCQkvLyBkcmF3IGJhY2sgcGFydHMgb2YgQiBpbnNpZGUgQQotCQlkcmF3QWluc2lkZUIoYiwgYSwgR0wuR0xfRlJPTlQsIEdMLkdMX05PVEVRVUFMKTsKLQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlIGZvbGxvd2luZyB0byBzaG93IHVwCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCS8vIGNoYW5nZSB0aGUgZGVwdGggdGVzdCB0byBHTF9BTFdBWVMKLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfQUxXQVlTKTsKLQkJLy8gcmVuZGVyIHRoZSBmcm9udCBmYWNlIG9mIEIKLQkJYS5kcmF3KCk7Ci0JCS8vIHJlc2V0IHRoZSBkZXB0aCBmdW5jdGlvbgotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVNTKTsKLQkJLy8gZHJhdyBmcm9udCBwYXJ0cyBvZiBBIG91dHNpZGUgQgotCQlkcmF3QWluc2lkZUIoYSwgYiwgR0wuR0xfQkFDSywgR0wuR0xfRVFVQUwpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBzcGVjaWZlZCBzaGFwZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hhcGUgdGhlIHNoYXBlIHRvIGRyYXcKLQkgKi8KLQl2b2lkIGRyYXdTaGFwZShTaGFwZSBzaGFwZSkgewotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJc2hhcGUuZHJhdygpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiQXJlYSI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0JCQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCWZsb2F0W10gbGlnaHRQb3MgPSB7IDAuMGYsIDUuMGYsIC0xMC4wZiwgMS4wZiB9OwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgbGlnaHRQb3MpOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlkaXNrID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ1VMTF9GQUNFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElTVF9NT0RFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbExpZ2h0TW9kZWxpKEdMLkdMX0xJR0hUX01PREVMX1RXT19TSURFLCBHTC5HTF9UUlVFKTsKLQotCQlmaW5hbCBmbG9hdFtdIHNwaGVyZU1hdGVyaWFsID0geyAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmIH07Ci0JCWZpbmFsIGZsb2F0W10gY3lsaW5kZXJNYXRlcmlhbCA9IHsgMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiB9OwotCi0JCVNoYXBlIHNwaGVyZSA9IG5ldyBTaGFwZSgpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KAotCQkJCQlHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwKLQkJCQkJc3BoZXJlTWF0ZXJpYWwpOwotCQkJCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMywgMzIsIDMyKTsKLQkJCX0KLQkJfTsKLQkJU2hhcGUgY3lsaW5kZXIgPSBuZXcgU2hhcGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsTWF0ZXJpYWxmdigKLQkJCQkJR0wuR0xfRlJPTlRfQU5EX0JBQ0ssCi0JCQkJCUdMLkdMX0FNQklFTlRfQU5EX0RJRkZVU0UsCi0JCQkJCWN5bGluZGVyTWF0ZXJpYWwpOwotCQkJCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1UXVhZHJpY09yaWVudGF0aW9uKGRpc2ssIEdMVS5HTFVfSU5TSURFKTsKLQkJCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJCQlHTC5nbFRyYW5zbGF0ZWYoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCQkJR0xVLmdsdURpc2soZGlzaywgMCwgMywgMzIsIDMyKTsKLQkJCQlHTFUuZ2x1Q3lsaW5kZXIocXVhZHJhdGljLCAzLCAzLCA2LCAzMiwgMzIpOwotCQkJCUdMLmdsUHVzaE1hdHJpeCgpOwotCQkJCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCA2LjBmKTsKLQkJCQlHTFUuZ2x1UXVhZHJpY09yaWVudGF0aW9uKGRpc2ssIEdMVS5HTFVfT1VUU0lERSk7Ci0JCQkJR0xVLmdsdURpc2soZGlzaywgMCwgMywgMzIsIDMyKTsKLQkJCQlHTC5nbFBvcE1hdHJpeCgpOwotCQkJCUdMLmdsUG9wTWF0cml4KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gY3JlYXRlIHRoZSBkaXNwbGF5IGxpc3RzIGFuZCBzdGF0ZXMKLQkJc3RhdGVzID0gbmV3IFN0YXRlWzZdOwotCQlpbnQgaW5kZXggPSAxOwotCQkKLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NoYXBlKGN5bGluZGVyKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXN0YXRlc1swXSA9IG5ldyBTdGF0ZSgiQ3lsaW5kZXIiLGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdTaGFwZShzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzFdID0gbmV3IFN0YXRlKCJTcGhlcmUiLGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdBb3JCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzJdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBPUiBTcGhlcmUiLGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdBYW5kQihjeWxpbmRlciwgc3BoZXJlKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXN0YXRlc1szXSA9IG5ldyBTdGF0ZSgiQ3lsaW5kZXIgQU5EIFNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FzdWJCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzRdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBTVUIgU3BoZXJlIixpbmRleCsrKTsKLQkJCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdBc3ViQihzcGhlcmUsIGN5bGluZGVyKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXN0YXRlc1s1XSA9IG5ldyBTdGF0ZSgiU3BoZXJlIFNVQiBDeWxpbmRlciIsaW5kZXgrKyk7Ci0KLQkJY3VycmVudFN0YXRlID0gc3RhdGVzWzBdOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkCi0JICovCi0JYm9vbGVhbiBpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcigKLQkJCUdMLkdMX0NPTE9SX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0KLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbFJvdGF0ZWYoeFJvdCwgMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih5Um90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHpSb3QsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0JCWN1cnJlbnRTdGF0ZS5kaXNwbGF5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Db2xvclNlbGVjdGlvbkdyb3VwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkYmI1My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQ29sb3JTZWxlY3Rpb25Hcm91cCBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZSBzdHlsZSBiaXRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbG9yIGdyb3VwCi0JICovCi0JQ29sb3JTZWxlY3Rpb25Hcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdENvbG9yKHBhcmVudC5nZXREaXNwbGF5KCkpOwotCi0JCUNvbXBvc2l0ZSBjb2xvckdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb2xvckdyb3VwLnNldExheW91dChsYXlvdXQpOwotLy8JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotLy8JCWNvbG9yR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGNvbG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWltYWdlID0gbmV3IEltYWdlKGJ1dHRvbi5nZXREaXNwbGF5KCksIDEyLCAxMik7Ci0JCWRyYXdCdXR0b25JbWFnZSgpOwotCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGNvbG9yICE9IG51bGwpIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb2xvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIkNvbG9yIik7Ci0vLwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBhcmd1bWVudCB0byB0aGlzIGdyb3VwJ3MgY29sbGVjdGlvbiBvZgotCSAqIGNvbG9yIHNlbGVjdGlvbiBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCBhZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKElDb2xvclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGRFbGVtZW50KGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIGNvbG9yZWQgc3F1YXJlIG9uIHRoZSBzZWxlY3Rpb24gYnV0dG9uLgotCSAqLwotCXZvaWQgZHJhd0J1dHRvbkltYWdlKCkgewotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGggLSAxLCBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJU2hlbGwgc2hlbGwgPSBidXR0b24uZ2V0U2hlbGwoKTsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IoCi0JCQluZXcgUkdCKGNvbG9yLmdldFJlZCgpLCBjb2xvci5nZXRHcmVlbigpLCBjb2xvci5nZXRCbHVlKCkpKTsKLQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCXNldFJHQihyZ2IpOwotCQlub3RpZnlMaXN0ZW5lcnMocmdiKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29sb3IgYnkgcXVlcnlpbmcgZm9yIHRoZSBjdXJyZW50IGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICovCi0Jdm9pZCBpbml0Q29sb3IoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWRvdWJsZVtdIGN1cnJlbnRDb2xvciA9IG5ldyBkb3VibGVbNF07Ci0JCUdMLmdsR2V0RG91YmxldihHTC5HTF9DVVJSRU5UX0NPTE9SLCBjdXJyZW50Q29sb3IpOwotCQlSR0IgcmdiID0KLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgY3VycmVudENvbG9yWzBdICogMjU1LAotCQkJCShpbnQpIGN1cnJlbnRDb2xvclsxXSAqIDI1NSwKLQkJCQkoaW50KSBjdXJyZW50Q29sb3JbMl0gKiAyNTUpOwotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgcmVnaXN0ZXJlZCBjb2xvciBzZWxlY3Rpb24gbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXZvaWQgbm90aWZ5TGlzdGVuZXJzKFJHQiByZ2IpIHsKLQkJSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnNBcnIgPQotCQkJbmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldOwotCQlsaXN0ZW5lcnMuY29weUludG8obGlzdGVuZXJzQXJyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnNBcnIubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3RlbmVyc0FyciBbaV0uaGFuZGxlQ29sb3JTZWxlY3Rpb24ocmdiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGFyZ3VtZW50IGZyb20gdGhpcyBncm91cCdzIGNvbGxlY3Rpb24gb2YgY29sb3Igc2VsZWN0aW9uCi0JICogbGlzdGVuZXJzLiAgSWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHJlZ2lzdGVyZWQgbGlzdGVuZXIgdGhlbiBkb2VzCi0JICogbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgZm9yIHRoZSBncm91cCdzIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBuZXcgbGFiZWwgdGV4dAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIHJnYiB0aGUgcmdiIG9mIHRoZSBuZXcgY29sb3IKLQkgKi8KLQl2b2lkIHNldFJHQihSR0IgcmdiKSB7Ci0JCUNvbG9yIG9sZENvbG9yID0gY29sb3I7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGJ1dHRvbi5nZXREaXNwbGF5KCksIHJnYik7Ci0JCWRyYXdCdXR0b25JbWFnZSgpOwotCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ZvZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzIwZDU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBGb2dUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCi0JcHJpdmF0ZSBmbG9hdCByb3RZID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmLCB4UG9zID0gMC4wZiwgelBvcyA9IC0xNS4wZjsKLQlwcml2YXRlIGludCBjdWJlTGlzdEluZGV4QmFzZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnRbXSBGT0dfVFlQRVMgPSB7IEdMLkdMX0xJTkVBUiwgR0wuR0xfRVhQLCBHTC5HTF9FWFAyIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gRk9HX05BTUVTID0geyAiTElORUFSIiwgIkdMX0VYUCIsICJHTF9FWFAyIiB9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSAwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjQpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYig0KTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDI1OwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgZm9nVHlwZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWZvZ1R5cGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZvZ1R5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJbmV3IExhYmVsKGZvZ1R5cGVzR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJGb2cgVHlwZXM6Iik7Ci0JCWZpbmFsIENvbWJvIGZvZ1R5cGVDb21ibyA9IG5ldyBDb21ibyhmb2dUeXBlc0dyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlmb2dUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZm9nVHlwZUNvbWJvLnNldEl0ZW1zKEZPR19OQU1FUyk7Ci0JCWZvZ1R5cGVDb21iby5zZWxlY3QoMCk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkZvZyBEZW5zaXR5OiIpOwotCQlmaW5hbCBTbGlkZXIgZm9nRGVuc2l0eVNsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldE1heGltdW0oMzIpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0UGFnZUluY3JlbWVudCg1KTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZsb2F0IGZvZ0RlbnNpdHkgPSAoKGZsb2F0KWZvZ0RlbnNpdHlTbGlkZXIuZ2V0U2VsZWN0aW9uKCkpIC8gMTAwOwotCQkJCUdMLmdsRm9nZihHTC5HTF9GT0dfREVOU0lUWSwgZm9nRGVuc2l0eSk7Ci0JCQl9Ci0JCX0pOwotCQlmb2dUeXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludCBjdXJyZW50U2VsZWN0aW9uID0gZm9nVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJLy8gZm9nIHR5cGUgR0wuR0xfTElORUFSIGRvZXMgbm90IHV0aWxpemUgZm9nRGVuc2l0eSwgYnV0IHRoZSBvdGhlciBmb2cgdHlwZXMgZG8KLQkJCQlmb2dEZW5zaXR5U2xpZGVyLnNldEVuYWJsZWQoY3VycmVudFNlbGVjdGlvbiAhPSAwKTsKLQkJCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX01PREUsIEZPR19UWVBFU1tjdXJyZW50U2VsZWN0aW9uXSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjdWJlIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICovCi0gCXZvaWQgY3JlYXRlQ3ViZSgpIHsKLQkJR0wuZ2xOZXdMaXN0KGN1YmVMaXN0SW5kZXhCYXNlLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gbGVmdCAKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7CS8vIHRvcCBsZWZ0Ci0JCS8vIGJhY2sKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgLTAuNWYpOwkvLyBib3R0b20gbGVmdCAKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAtMC41Zik7CS8vIHRvcCBsZWZ0Ci0JCS8vIGxlZnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgLTAuNWYpOwkvLyBib3R0b20gbGVmdAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7CS8vIHRvcCByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIGxlZnQJCi0JCS8vIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgMC41Zik7CS8vIGJvdHRvbSBsZWZ0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgLTAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gdG9wCi0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgLTAuNWYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgMC41Zik7Ci0JCS8vIGJvdHRvbQotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAwLjVmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgLTAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIC0wLjVmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoY3ViZUxpc3RJbmRleEJhc2UsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7CQotCX0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJGb2ciOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQkvLyBmb2cgY29sb3Igc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBjbGVhciBjb2xvcgotCQkvLyB0byBsb29rIGFwcHJvcHJpYXRlCi0JCWZsb2F0W10gZm9nQ29sb3IgPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJR0wuZ2xGb2dmdihHTC5HTF9GT0dfQ09MT1IsIGZvZ0NvbG9yKTsKLQkJR0wuZ2xIaW50KEdMLkdMX0ZPR19ISU5ULCBHTC5HTF9ET05UX0NBUkUpOwotCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX1NUQVJULCAwKTsKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19ERU5TSVRZLCAwLjBmKTsKLQkJLy8gc2V0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0IGRpc3RhbmNlOyBhbnl0aGluZyA+IDE1Ci0JCS8vIHVuaXRzIGZyb20gdGhlIGNhbWVyYSB3aWxsIGJlIGNvdmVyZWQgaW4gZm9nCi0JCUdMLmdsRm9nZihHTC5HTF9GT0dfRU5ELCAxNSk7Ci0JCUdMLmdsRm9nZihHTC5HTF9GT0dfTU9ERSwgRk9HX1RZUEVTWzBdKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfRk9HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0KLQkJY3ViZUxpc3RJbmRleEJhc2UgPSBHTC5nbEdlbkxpc3RzKDEpOwotCQljcmVhdGVDdWJlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZihyb3RZLCAwLjBmLCAxLjBmLCAwLjBmKTsKLQotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDMsIDAsIC0zKTsKLQkJR0wuZ2xDYWxsTGlzdChjdWJlTGlzdEluZGV4QmFzZSk7Ci0JCUdMLmdsUG9wTWF0cml4KCk7Ci0KLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigtMywgMCwgLTMpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDAsIDAsIDQpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlyb3RZICs9IDAuNmY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlkNWRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvR3JhZGllbnRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEdyYWRpZW50VGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC03LjBmOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDE4MC4wZiwgeVJvdCA9IDE4MC4wZiwgelJvdCA9IDE4MC4wZjsKLQlwcml2YXRlIGludCBjdXJyZW50U2VsZWN0aW9uID0gMTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdFtdIEJFWklFUl9DT0xPUlMgPSB7Ci0JCTAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuM2YsIDAuNmYsIDAuMWYsIDAuMGYsCi0JCTAuOGYsIDAuMmYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCi0JCTAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuOGYsIDAuOGYsIDAuOGYsIDAuMGYKLQl9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0W10gQkVaSUVSX1BPSU5UUyA9IHsKLQkJLTEuNWYsIC0xLjVmLCA0LjBmLCAtMC41ZiwgLTEuNWYsIDIuMGYsIDAuNWYsIC0xLjVmLAotCQktMS4wZiwgMS41ZiwgLTEuNWYsIDIuMGYsIC0xLjVmLCAtMC41ZiwgMS4wZiwgLTAuNWYsCi0JCS0wLjVmLCAzLjBmLCAwLjVmLCAtMC41ZiwgMC4wZiwgMS41ZiwgLTAuNWYsIC0xLjBmLAotCQktMS41ZiwgMC41ZiwgNC4wZiwgLTAuNWYsIDAuNWYsIDAuMGYsIDAuNWYsIDAuNWYsCi0JCTMuMGYsIDEuNWYsIDAuNWYsIDQuMGYsIC0xLjVmLCAxLjVmLCAtMi4wZiwgLTAuNWYsCi0JCTEuNWYsIC0yLjBmLCAwLjVmLCAxLjVmLCAwLjBmLCAxLjVmLCAxLjVmLCAtMS4wZiwKLQl9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIE9CSkVDVF9OQU1FUyA9IHsgIkJlemllciIsICJTcXVhcmUiIH07Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMjsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDE4MCk7Ci0JCXhSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFJvdCA9IHhSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeVJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl5Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl5Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeVJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl5Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXlSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMTgwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigxODApOwotCQl6Um90YXRpb24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpSb3QgPSB6Um90YXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIG9iamVjdEdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCW5ldyBMYWJlbChvYmplY3RHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0Q29tYm8gPSBuZXcgQ29tYm8ob2JqZWN0R3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW9iamVjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9iamVjdENvbWJvLnNldEl0ZW1zKE9CSkVDVF9OQU1FUyk7Ci0JCW9iamVjdENvbWJvLnNlbGVjdCgwKTsKLQkJb2JqZWN0Q29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBvYmplY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICsgMTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTC5nbERlbGV0ZUxpc3RzKDEsIDIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJHcmFkaWVudHMiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xIaW50KEdMLkdMX0xJTkVfU01PT1RIX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0ZJTEwpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfVkVSVEVYXzMsIDAsIDEsIDMsIDQsIDAsIDEsIDEyLCA0LCBCRVpJRVJfUE9JTlRTKTsKLQkJR0wuZ2xNYXAyZihHTC5HTF9NQVAyX0NPTE9SXzQsIDAsIDEsIDQsIDEsIDAsIDEsIDQsIDYsIEJFWklFUl9DT0xPUlMpOwotCQlHTC5nbE1hcEdyaWQyZigyMCwgMC4wZiwgMS4wZiwgMjAsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFNoYWRlTW9kZWwoR0wuR0xfU01PT1RIKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NUSVBQTEUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfQ09MT1JfNCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfVkVSVEVYXzMpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwotCQlHTC5nbE5ld0xpc3QoMSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsRXZhbE1lc2gyKEdMLkdMX0ZJTEwsIDAsIDIwLCAwLCAyMCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoMiwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVfRkFOKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChjdXJyZW50U2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTM1NDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JQ29sb3JTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb2xvclNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSW1hZ2VEYXRhVXRpbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNjZhZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLQotcHVibGljIGNsYXNzIEltYWdlRGF0YVV0aWwgewotCS8qKgotCSAqIEFscGhhIG1vZGUsIHZhbHVlcyAwIC0gMjU1IHNwZWNpZnkgZ2xvYmFsIGFscGhhIGxldmVsCi0JICovCi0Jc3RhdGljIGZpbmFsIGludAotCQlBTFBIQV9PUEFRVUUgPSAyNTUsICAgICAgICAgICAvLyBGdWxseSBvcGFxdWUgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX1RSQU5TUEFSRU5UID0gMCwgICAgICAgIC8vIEZ1bGx5IHRyYW5zcGFyZW50IChpZ25vcmVzIGFueSBhbHBoYSBkYXRhKQotCQlBTFBIQV9DSEFOTkVMX1NFUEFSQVRFID0gLTEsICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBmcm9tIHNlcGFyYXRlIGFscGhhRGF0YQotCQlBTFBIQV9DSEFOTkVMX1NPVVJDRSA9IC0yLCAgICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBlbWJlZGRlZCBpbiBzb3VyY2VEYXRhCi0JCUFMUEhBX01BU0tfVU5QQUNLRUQgPSAtMywgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgYnl0ZXMgaW4gYWxwaGFEYXRhIChub24temVybyBpcyBvcGFxdWUpCi0JCUFMUEhBX01BU0tfUEFDS0VEID0gLTQsICAgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgcGFja2VkIGJpdHMgaW4gYWxwaGFEYXRhCi0JCUFMUEhBX01BU0tfSU5ERVggPSAtNSwgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBwYWxldHRlIGluZGljZXMgdHJhbnNwYXJlbnQgaWYgaW4gYWxwaGFEYXRhIGFycmF5Ci0JCUFMUEhBX01BU0tfUkdCID0gLTY7ICAgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBSR0JzIHRyYW5zcGFyZW50IGlmIGluIFJHQjg4OCBmb3JtYXQgYWxwaGFEYXRhIGFycmF5Ci0JCQotCS8qKgotCSAqIERhdGEgdHlwZXMgKGludGVybmFsKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCQkvLyBkaXJlY3QgLyB0cnVlIGNvbG9yIGZvcm1hdHMgd2l0aCBhcmJpdHJhcnkgbWFza3MgJiBzaGlmdHMKLQkJVFlQRV9HRU5FUklDXzggPSAwLAotCQlUWVBFX0dFTkVSSUNfMTZfTVNCID0gMSwKLQkJVFlQRV9HRU5FUklDXzE2X0xTQiA9IDIsCi0JCVRZUEVfR0VORVJJQ18yNCA9IDMsCi0JCVRZUEVfR0VORVJJQ18zMl9NU0IgPSA0LAotCQlUWVBFX0dFTkVSSUNfMzJfTFNCID0gNTsKLQkJCi0JLyoqCi0JICogQnl0ZSBhbmQgYml0IG9yZGVyIGNvbnN0YW50cy4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBNU0JfRklSU1QgPSAxOwotCQotCS8qKgotCSAqIEJsaXQgb3BlcmF0aW9uIGJpdHMgdG8gYmUgT1InZWQgdG9nZXRoZXIgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0JICovCi0Jc3RhdGljIGZpbmFsIGludAotCQlCTElUX1NSQyA9IDEsICAgICAvLyBjb3B5IHNvdXJjZSBkaXJlY3RseSwgZWxzZSBhcHBsaWVzIGxvZ2ljIG9wZXJhdGlvbnMKLQkJQkxJVF9BTFBIQSA9IDIsICAgLy8gZW5hYmxlIGFscGhhIGJsZW5kaW5nCi0JCUJMSVRfRElUSEVSID0gNDsgIC8vIGVuYWJsZSBkaXRoZXJpbmcgaW4gbG93IGNvbG9yIG1vZGVzCi0JCQotCS8qKgotCSAqIEFyYml0cmFyeSBjaGFubmVsIHdpZHRoIGRhdGEgdG8gOC1iaXQgY29udmVyc2lvbiB0YWJsZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgYnl0ZVtdW10gQU5ZX1RPX0VJR0hUID0gbmV3IGJ5dGVbOV1bXTsKLQlzdGF0aWMgewotCQlmb3IgKGludCBiID0gMDsgYiA8IDk7ICsrYikgewotCQkJYnl0ZVtdIGRhdGEgPSBBTllfVE9fRUlHSFRbYl0gPSBuZXcgYnl0ZVsxIDw8IGJdOwotCQkJaWYgKGIgPT0gMCkgY29udGludWU7Ci0JCQlpbnQgaW5jID0gMDsKLQkJCWZvciAoaW50IGJpdCA9IDB4MTAwMDA7IChiaXQgPj49IGIpICE9IDA7KSBpbmMgfD0gYml0OwotCQkJZm9yIChpbnQgdiA9IDAsIHAgPSAwOyB2IDwgMHgxMDAwMDsgdis9IGluYykgZGF0YVtwKytdID0gKGJ5dGUpKHYgPj4gOCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCbGl0cyBhIGRpcmVjdCBwYWxldHRlIGltYWdlIGludG8gYSBkaXJlY3QgcGFsZXR0ZSBpbWFnZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBXaGVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRlcHRoLCBvcmRlciBhbmQgbWFza3MKLQkgKiBhcmUgcGFpcndpc2UgZXF1YWwgYW5kIHRoZSBibGl0dGVyIG9wZXJhdGlvbiBpcyBCTElUX1NSQywKLQkgKiB0aGUgbWFza3MgYXJlIGlnbm9yZWQuICBIZW5jZSB3aGVuIG5vdCBjaGFuZ2luZyB0aGUgaW1hZ2UKLQkgKiBkYXRhIGZvcm1hdCwgMCBtYXkgYmUgc3BlY2lmaWVkIGZvciB0aGUgbWFza3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcCB0aGUgYmxpdHRlciBvcGVyYXRpb246IGEgY29tYmluYXRpb24gb2YgQkxJVF94eHggZmxhZ3MKLQkgKiAgICAgICAgKHNlZSBCTElUX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIHNyY0RhdGEgdGhlIHNvdXJjZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotCSAqIEBwYXJhbSBzcmNEZXB0aCB0aGUgc291cmNlIGRlcHRoOiBvbmUgb2YgOCwgMTYsIDI0LCAzMgotCSAqIEBwYXJhbSBzcmNTdHJpZGUgdGhlIHNvdXJjZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKLQkgKiBAcGFyYW0gc3JjT3JkZXIgdGhlIHNvdXJjZSBieXRlIG9yZGVyaW5nOiBvbmUgb2YgTVNCX0ZJUlNUIG9yIExTQl9GSVJTVDsKLQkgKiAgICAgICAgaWdub3JlZCBpZiBzcmNEZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gc3JjWCB0aGUgdG9wLWxlZnQgeC1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1kgdGhlIHRvcC1sZWZ0IHktY29vcmQgb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBzcmNXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1JlZE1hc2sgdGhlIHNvdXJjZSByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0dyZWVuTWFzayB0aGUgc291cmNlIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBzcmNCbHVlTWFzayB0aGUgc291cmNlIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGFscGhhTW9kZSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBtb2RlLCBtYXkgYmUKLQkgKiAgICAgICAgYW4gaW50ZWdlciAwLTI1NSBmb3IgZ2xvYmFsIGFscGhhOyBpZ25vcmVkIGlmIEJMSVRfQUxQSEEKLQkgKiAgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgYmxpdHRlciBvcGVyYXRpb25zCi0JICogICAgICAgIChzZWUgQUxQSEFfTU9ERV94eHggY29uc3RhbnRzKQotCSAqIEBwYXJhbSBhbHBoYURhdGEgdGhlIGFscGhhIGJsZW5kaW5nIG9yIG1hc2sgZGF0YSwgdmFyaWVzIGRlcGVuZGluZwotCSAqICAgICAgICBvbiB0aGUgdmFsdWUgb2YgYWxwaGFNb2RlIGFuZCBzb21ldGltZXMgaWdub3JlZAotCSAqIEBwYXJhbSBhbHBoYVN0cmlkZSB0aGUgYWxwaGEgZGF0YSBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKLQkgKiBAcGFyYW0gYWxwaGFYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBhbHBoYSBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBhbHBoYVkgdGhlIHRvcC1sZWZ0IHktY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3REYXRhIHRoZSBkZXN0aW5hdGlvbiBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotCSAqIEBwYXJhbSBkZXN0RGVwdGggdGhlIGRlc3RpbmF0aW9uIGRlcHRoOiBvbmUgb2YgOCwgMTYsIDI0LCAzMgotCSAqIEBwYXJhbSBkZXN0U3RyaWRlIHRoZSBkZXN0aW5hdGlvbiBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKLQkgKiBAcGFyYW0gZGVzdE9yZGVyIHRoZSBkZXN0aW5hdGlvbiBieXRlIG9yZGVyaW5nOiBvbmUgb2YgTVNCX0ZJUlNUIG9yIExTQl9GSVJTVDsKLQkgKiAgICAgICAgaWdub3JlZCBpZiBkZXN0RGVwdGggaXMgbm90IDE2IG9yIDMyCi0JICogQHBhcmFtIGRlc3RYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0WSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgZGVzdGluYXRpb24gYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdEhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0UmVkTWFzayB0aGUgZGVzdGluYXRpb24gcmVkIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0R3JlZW5NYXNrIHRoZSBkZXN0aW5hdGlvbiBncmVlbiBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gZGVzdEJsdWVNYXNrIHRoZSBkZXN0aW5hdGlvbiBibHVlIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBmbGlwWCBpZiB0cnVlIHRoZSByZXN1bHRpbmcgaW1hZ2UgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcwotCSAqIEBwYXJhbSBmbGlwWSBpZiB0cnVlIHRoZSByZXN1bHRpbmcgaW1hZ2UgaXMgZmxpcHBlZCBhbG9uZyB0aGUgaG9yaXpvbnRhbCBheGlzCi0JICovCi0Jc3RhdGljIHZvaWQgYmxpdChpbnQgb3AsCi0JCWJ5dGVbXSBzcmNEYXRhLCBpbnQgc3JjRGVwdGgsIGludCBzcmNTdHJpZGUsIGludCBzcmNPcmRlciwKLQkJaW50IHNyY1gsIGludCBzcmNZLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCi0JCWludCBzcmNSZWRNYXNrLCBpbnQgc3JjR3JlZW5NYXNrLCBpbnQgc3JjQmx1ZU1hc2ssCi0JCWludCBhbHBoYU1vZGUsIGJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYVN0cmlkZSwgaW50IGFscGhhWCwgaW50IGFscGhhWSwKLQkJYnl0ZVtdIGRlc3REYXRhLCBpbnQgZGVzdERlcHRoLCBpbnQgZGVzdFN0cmlkZSwgaW50IGRlc3RPcmRlciwKLQkJaW50IGRlc3RYLCBpbnQgZGVzdFksIGludCBkZXN0V2lkdGgsIGludCBkZXN0SGVpZ2h0LAotCQlpbnQgZGVzdFJlZE1hc2ssIGludCBkZXN0R3JlZW5NYXNrLCBpbnQgZGVzdEJsdWVNYXNrLAotCQlib29sZWFuIGZsaXBYLCBib29sZWFuIGZsaXBZKSB7Ci0JCWlmICgoZGVzdFdpZHRoIDw9IDApIHx8IChkZXN0SGVpZ2h0IDw9IDApIHx8IChhbHBoYU1vZGUgPT0gQUxQSEFfVFJBTlNQQVJFTlQpKSByZXR1cm47Ci0KLQkJLy8gdGhlc2Ugc2hvdWxkIGJlIHN1cHBsaWVkIGFzIHBhcmFtcyBsYXRlcgotCQlmaW5hbCBpbnQgc3JjQWxwaGFNYXNrID0gMCwgZGVzdEFscGhhTWFzayA9IDA7Ci0KLQkJLyoqKiBQcmVwYXJlIHNjYWxpbmcgZGF0YSAqKiovCi0JCWZpbmFsIGludCBkd20xID0gZGVzdFdpZHRoIC0gMTsKLQkJZmluYWwgaW50IHNmeGkgPSAoZHdtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjV2lkdGggPDwgMTYpIC0gMSkgLyBkd20xKSA6IDA7Ci0JCWZpbmFsIGludCBkaG0xID0gZGVzdEhlaWdodCAtIDE7Ci0JCWZpbmFsIGludCBzZnlpID0gKGRobTEgIT0gMCkgPyAoaW50KSgoKChsb25nKXNyY0hlaWdodCA8PCAxNikgLSAxKSAvIGRobTEpIDogMDsKLQotCQkvKioqIFByZXBhcmUgc291cmNlLXJlbGF0ZWQgZGF0YSAqKiovCi0JCWZpbmFsIGludCBzYnBwLCBzdHlwZTsKLQkJc3dpdGNoIChzcmNEZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCXNicHAgPSAxOwotCQkJCXN0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCXNicHAgPSAyOwotCQkJCXN0eXBlID0gKHNyY09yZGVyID09IE1TQl9GSVJTVCkgPyBUWVBFX0dFTkVSSUNfMTZfTVNCIDogVFlQRV9HRU5FUklDXzE2X0xTQjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjQ6Ci0JCQkJc2JwcCA9IDM7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfMjQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDMyOgotCQkJCXNicHAgPSA0OwotCQkJCXN0eXBlID0gKHNyY09yZGVyID09IE1TQl9GSVJTVCkgPyBUWVBFX0dFTkVSSUNfMzJfTVNCIDogVFlQRV9HRU5FUklDXzMyX0xTQjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNvdXJjZSB0eXBlIik7Ci0JCQkJcmV0dXJuOwotCQl9CQkJCi0JCWludCBzcHIgPSBzcmNZICogc3JjU3RyaWRlICsgc3JjWCAqIHNicHA7Ci0KLQkJLyoqKiBQcmVwYXJlIGRlc3RpbmF0aW9uLXJlbGF0ZWQgZGF0YSAqKiovCi0JCWZpbmFsIGludCBkYnBwLCBkdHlwZTsKLQkJc3dpdGNoIChkZXN0RGVwdGgpIHsKLQkJCWNhc2UgODoKLQkJCQlkYnBwID0gMTsKLQkJCQlkdHlwZSA9IFRZUEVfR0VORVJJQ184OwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlkYnBwID0gMjsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlkYnBwID0gMzsKLQkJCQlkdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJZGJwcCA9IDQ7Ci0JCQkJZHR5cGUgPSAoZGVzdE9yZGVyID09IE1TQl9GSVJTVCkgPyBUWVBFX0dFTkVSSUNfMzJfTVNCIDogVFlQRV9HRU5FUklDXzMyX0xTQjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRlc3RpbmF0aW9uIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IGRwciA9ICgoZmxpcFkpID8gZGVzdFkgKyBkaG0xIDogZGVzdFkpICogZGVzdFN0cmlkZSArICgoZmxpcFgpID8gZGVzdFggKyBkd20xIDogZGVzdFgpICogZGJwcDsKLQkJZmluYWwgaW50IGRwcnhpID0gKGZsaXBYKSA/IC1kYnBwIDogZGJwcDsKLQkJZmluYWwgaW50IGRwcnlpID0gKGZsaXBZKSA/IC1kZXN0U3RyaWRlIDogZGVzdFN0cmlkZTsKLQotCQkvKioqIFByZXBhcmUgc3BlY2lhbCBwcm9jZXNzaW5nIGRhdGEgKioqLwotCQlpbnQgYXByOwotCQlpZiAoKG9wICYgQkxJVF9BTFBIQSkgIT0gMCkgewotCQkJc3dpdGNoIChhbHBoYU1vZGUpIHsKLQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJY2FzZSBBTFBIQV9DSEFOTkVMX1NFUEFSQVRFOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFscGhhU3RyaWRlIDw8PSAzOwotCQkJCQlhcHIgPSBhbHBoYVkgKiBhbHBoYVN0cmlkZSArIGFscGhhWDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBTFBIQV9NQVNLX0lOREVYOgotCQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYWxwaGEgdHlwZSIpOwotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBBTFBIQV9NQVNLX1JHQjoKLQkJCQkJaWYgKGFscGhhRGF0YSA9PSBudWxsKSBhbHBoYU1vZGUgPSAweDEwMDAwOwotCQkJCQlhcHIgPSAwOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlhbHBoYU1vZGUgPSAoYWxwaGFNb2RlIDw8IDE2KSAvIDI1NTsgLy8gcHJlc2NhbGUKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU09VUkNFOgotCQkJCQlhcHIgPSAwOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQlhcHIgPSAwOwotCQl9Ci0KLQkJLyoqKiBCbGl0ICoqKi8KLQkJaW50IGRwID0gZHByOwotCQlpbnQgc3AgPSBzcHI7Ci0JCWlmICgoYWxwaGFNb2RlID09IDB4MTAwMDApICYmIChzdHlwZSA9PSBkdHlwZSkgJiYKLQkJCShzcmNSZWRNYXNrID09IGRlc3RSZWRNYXNrKSAmJiAoc3JjR3JlZW5NYXNrID09IGRlc3RHcmVlbk1hc2spICYmCi0JCQkoc3JjQmx1ZU1hc2sgPT0gZGVzdEJsdWVNYXNrKSAmJiAoc3JjQWxwaGFNYXNrID09IGRlc3RBbHBoYU1hc2spKSB7Ci0JCQkvKioqIEZhc3QgYmxpdCAoc3RyYWlnaHQgY29weSkgKioqLwotCQkJc3dpdGNoIChzYnBwKSB7Ci0JCQkJY2FzZSAxOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwkJCQkJCi0JCQkJY2FzZSAyOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJZm9yIChpbnQgZHkgPSBkZXN0SGVpZ2h0LCBzZnkgPSBzZnlpOyBkeSA+IDA7IC0tZHksIHNwID0gc3ByICs9IChzZnkgPj4+IDE2KSAqIHNyY1N0cmlkZSwgc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLCBkcCA9IGRwciArPSBkcHJ5aSkgewotCQkJCQkJZm9yIChpbnQgZHggPSBkZXN0V2lkdGgsIHNmeCA9IHNmeGk7IGR4ID4gMDsgLS1keCwgZHAgKz0gZHByeGksIHNmeCA9IChzZnggJiAweGZmZmYpICsgc2Z4aSkgewotCQkJCQkJCWRlc3REYXRhW2RwXSA9IHNyY0RhdGFbc3BdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSBzcmNEYXRhW3NwICsgMV07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IHNyY0RhdGFbc3AgKyAyXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJZm9yIChpbnQgZHkgPSBkZXN0SGVpZ2h0LCBzZnkgPSBzZnlpOyBkeSA+IDA7IC0tZHksIHNwID0gc3ByICs9IChzZnkgPj4+IDE2KSAqIHNyY1N0cmlkZSwgc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLCBkcCA9IGRwciArPSBkcHJ5aSkgewotCQkJCQkJZm9yIChpbnQgZHggPSBkZXN0V2lkdGgsIHNmeCA9IHNmeGk7IGR4ID4gMDsgLS1keCwgZHAgKz0gZHByeGksIHNmeCA9IChzZnggJiAweGZmZmYpICsgc2Z4aSkgewotCQkJCQkJCWRlc3REYXRhW2RwXSA9IHNyY0RhdGFbc3BdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSBzcmNEYXRhW3NwICsgMV07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IHNyY0RhdGFbc3AgKyAyXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gc3JjRGF0YVtzcCArIDNdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoqKiBDb21wcmVoZW5zaXZlIGJsaXQgKGFwcGx5IHRyYW5zZm9ybWF0aW9ucykgKioqLwotCQlmaW5hbCBpbnQgc3JjUmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoc3JjUmVkTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNSZWRzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNSZWRNYXNrLCBzcmNSZWRTaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjR3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNHcmVlbk1hc2spOwotCQlmaW5hbCBieXRlW10gc3JjR3JlZW5zID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNHcmVlbk1hc2ssIHNyY0dyZWVuU2hpZnQpXTsKLQkJZmluYWwgaW50IHNyY0JsdWVTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNCbHVlTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNCbHVlcyA9IEFOWV9UT19FSUdIVFtnZXRDaGFubmVsV2lkdGgoc3JjQmx1ZU1hc2ssIHNyY0JsdWVTaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNBbHBoYU1hc2spOwotCQlmaW5hbCBieXRlW10gc3JjQWxwaGFzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNBbHBoYU1hc2ssIHNyY0FscGhhU2hpZnQpXTsKLQotCQlmaW5hbCBpbnQgZGVzdFJlZFNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RSZWRNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RSZWRXaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0UmVkTWFzaywgZGVzdFJlZFNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RSZWRzID0gQU5ZX1RPX0VJR0hUW2Rlc3RSZWRXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0UmVkUHJlU2hpZnQgPSA4IC0gZGVzdFJlZFdpZHRoOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdEdyZWVuTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5XaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0R3JlZW5NYXNrLCBkZXN0R3JlZW5TaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0R3JlZW5zID0gQU5ZX1RPX0VJR0hUW2Rlc3RHcmVlbldpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RHcmVlblByZVNoaWZ0ID0gOCAtIGRlc3RHcmVlbldpZHRoOwotCQlmaW5hbCBpbnQgZGVzdEJsdWVTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0Qmx1ZU1hc2spOwotCQlmaW5hbCBpbnQgZGVzdEJsdWVXaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0Qmx1ZU1hc2ssIGRlc3RCbHVlU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdEJsdWVzID0gQU5ZX1RPX0VJR0hUW2Rlc3RCbHVlV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEJsdWVQcmVTaGlmdCA9IDggLSBkZXN0Qmx1ZVdpZHRoOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdEFscGhhTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFXaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0QWxwaGFNYXNrLCBkZXN0QWxwaGFTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0QWxwaGFzID0gQU5ZX1RPX0VJR0hUW2Rlc3RBbHBoYVdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVByZVNoaWZ0ID0gOCAtIGRlc3RBbHBoYVdpZHRoOwotCi0JCWludCBhcCA9IGFwciwgYWxwaGEgPSBhbHBoYU1vZGU7Ci0JCWludCByID0gMCwgZyA9IDAsIGIgPSAwLCBhID0gMDsKLQkJaW50IHJxID0gMCwgZ3EgPSAwLCBicSA9IDAsIGFxID0gMDsKLQkJZm9yIChpbnQgZHkgPSBkZXN0SGVpZ2h0LCBzZnkgPSBzZnlpOyBkeSA+IDA7IC0tZHksCi0JCQkJc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLAotCQkJCWFwID0gYXByICs9IChzZnkgPj4+IDE2KSAqIGFscGhhU3RyaWRlLAotCQkJCXNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwKLQkJCQlkcCA9IGRwciArPSBkcHJ5aSkgewotCQkJZm9yIChpbnQgZHggPSBkZXN0V2lkdGgsIHNmeCA9IHNmeGk7IGR4ID4gMDsgLS1keCwKLQkJCQkJZHAgKz0gZHByeGksCi0JCQkJCXNmeCA9IChzZnggJiAweGZmZmYpICsgc2Z4aSkgewotCQkJCS8qKiogUkVBRCBORVhUIFBJWEVMICoqKi8KLQkJCQlzd2l0Y2ggKHN0eXBlKSB7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzg6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gc3JjRGF0YVtzcF0gJiAweGZmOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8IChzcmNEYXRhW3NwICsgMV0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9MU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwICsgMV0gJiAweGZmKSA8PCA4KSB8IChzcmNEYXRhW3NwXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzI0OiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMzsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX01TQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3BdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCShzcmNEYXRhW3NwICsgMV0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCShzcmNEYXRhW3NwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCShzcmNEYXRhW3NwICsgM10gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKCggKChzcmNEYXRhW3NwICsgM10gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiA0OwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQl9Ci0KLQkJCQkvKioqIERPIFNQRUNJQUwgUFJPQ0VTU0lORyBJRiBSRVFVSVJFRCAqKiovCi0JCQkJc3dpdGNoIChhbHBoYU1vZGUpIHsKLQkJCQkJY2FzZSBBTFBIQV9DSEFOTkVMX1NFUEFSQVRFOgotCQkJCQkJYWxwaGEgPSAoKGFscGhhRGF0YVthcF0gJiAweGZmKSA8PCAxNikgLyAyNTU7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU09VUkNFOgotCQkJCQkJYWxwaGEgPSAoYSA8PCAxNikgLyAyNTU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBTFBIQV9NQVNLX1VOUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwXSAhPSAwKSA/IDB4MTAwMDAgOiAwOwotCQkJCQkJYXAgKz0gKHNmeCA+PiAxNik7Ci0JCQkJCQlicmVhazsJCQkJCQkKLQkJCQkJY2FzZSBBTFBIQV9NQVNLX1BBQ0tFRDoKLQkJCQkJCWFscGhhID0gKGFscGhhRGF0YVthcCA+PiAzXSA8PCAoKGFwICYgNykgKyA5KSkgJiAweDEwMDAwOwotCQkJCQkJYXAgKz0gKHNmeCA+PiAxNik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBTFBIQV9NQVNLX1JHQjoKLQkJCQkJCWFscGhhID0gMHgxMDAwMDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFEYXRhLmxlbmd0aDsgaSArPSAzKSB7Ci0JCQkJCQkJaWYgKChyID09IGFscGhhRGF0YVtpXSkgJiYgKGcgPT0gYWxwaGFEYXRhW2kgKyAxXSkgJiYgKGIgPT0gYWxwaGFEYXRhW2kgKyAyXSkpIHsKLQkJCQkJCQkJYWxwaGEgPSAweDAwMDA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoYWxwaGEgIT0gMHgxMDAwMCkgewotCQkJCQlpZiAoYWxwaGEgPT0gMHgwMDAwKSBjb250aW51ZTsKLQkJCQkJc3dpdGNoIChkdHlwZSkgewotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gZGVzdERhdGFbZHBdICYgMHhmZjsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfCAoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcCArIDFdICYgMHhmZikgPDwgOCkgfCAoZGVzdERhdGFbZHBdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKGRlc3REYXRhW2RwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDNdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKGRlc3REYXRhW2RwICsgM10gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHBdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQl9Ci0JCQkJCS8vIFBlcmZvcm0gYWxwaGEgYmxlbmRpbmcKLQkJCQkJYSA9IGFxICsgKChhIC0gYXEpICogYWxwaGEgPj4gMTYpOwotCQkJCQlyID0gcnEgKyAoKHIgLSBycSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCWcgPSBncSArICgoZyAtIGdxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJYiA9IGJxICsgKChiIC0gYnEpICogYWxwaGEgPj4gMTYpOwotCQkJCX0KLQotCQkJCS8qKiogV1JJVEUgTkVYVCBQSVhFTCAqKiovCi0JCQkJZmluYWwgaW50IGRhdGEgPSAKLQkJCQkJKHIgPj4+IGRlc3RSZWRQcmVTaGlmdCA8PCBkZXN0UmVkU2hpZnQpIHwKLQkJCQkJKGcgPj4+IGRlc3RHcmVlblByZVNoaWZ0IDw8IGRlc3RHcmVlblNoaWZ0KSB8Ci0JCQkJCShiID4+PiBkZXN0Qmx1ZVByZVNoaWZ0IDw8IGRlc3RCbHVlU2hpZnQpIHwKLQkJCQkJKGEgPj4+IGRlc3RBbHBoYVByZVNoaWZ0IDw8IGRlc3RBbHBoYVNoaWZ0KTsKLQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzg6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSBkYXRhOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhICYgMHhmZik7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhICYgMHhmZik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSA+Pj4gMTYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhICYgMHhmZik7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IChieXRlKSAoZGF0YSA+Pj4gMTYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSA+Pj4gMjQpOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHNoaWZ0IGZyb20gYSBtYXNrLgotCSAqLwotCXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFNoaWZ0KGludCBtYXNrKSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgKChtYXNrICYgMSkgPT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHdpZHRoIChkZXB0aCkgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsV2lkdGgoaW50IG1hc2ssIGludCBzaGlmdCkgewotCQlpZiAobWFzayA9PSAwKSByZXR1cm4gMDsKLQkJaW50IGk7Ci0JCW1hc2sgPj4+PSBzaGlmdDsKLQkJZm9yIChpID0gc2hpZnQ7ICgobWFzayAmIDEpICE9IDApICYmIChpIDwgMzIpOyArK2kpIHsKLQkJCW1hc2sgPj4+PSAxOwotCQl9Ci0JCXJldHVybiBpIC0gc2hpZnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURhdGEgY29udmVydEltYWdlRGF0YSAoSW1hZ2VEYXRhIHNvdXJjZSkgewotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhICgweGZmMDAwMCwgMHhmZjAwLCAweGZmKTsKLQkJSW1hZ2VEYXRhIG5ld1NvdXJjZSA9IG5ldyBJbWFnZURhdGEgKHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgMjQsIHBhbGV0dGUpOwotCi0JCUltYWdlRGF0YVV0aWwuYmxpdCAoCi0JCQkxLAotCQkJc291cmNlLmRhdGEsCi0JCQlzb3VyY2UuZGVwdGgsCi0JCQlzb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKHNvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCXNvdXJjZS53aWR0aCwKLQkJCXNvdXJjZS5oZWlnaHQsCi0JCQlzb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJc291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJc291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQkyNTUsCi0JCQludWxsLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLmRhdGEsCi0JCQluZXdTb3VyY2UuZGVwdGgsCi0JCQluZXdTb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKG5ld1NvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCW5ld1NvdXJjZS53aWR0aCwKLQkJCW5ld1NvdXJjZS5oZWlnaHQsCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQlmYWxzZSwKLQkJCXRydWUpOwotCi0JCXJldHVybiBuZXdTb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTFdKR0xFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDFjMjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTERhdGE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTDExOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0xDb250ZXh0OwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuZ2x1LkdMVTsKLWltcG9ydCBvcmcubHdqZ2wuTFdKR0xFeGNlcHRpb247Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IHVzZSBMV0pHTCB0byBkcmF3IHRvIGFuIFNXVCBHTENhbnZhcwotICovCi1wdWJsaWMgY2xhc3MgTFdKR0xFeGFtcGxlIHsKLQlzdGF0aWMgdm9pZCBkcmF3VG9ydXMoZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmLCBjb3NUaGV0YSA9IDEuMGYsIHNpblRoZXRhID0gMC4wZjsKLQkJZm9yIChpbnQgaSA9IHJpbmdzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWZsb2F0IHRoZXRhMSA9IHRoZXRhICsgcmluZ0RlbHRhOwotCQkJZmxvYXQgY29zVGhldGExID0gKGZsb2F0KSBNYXRoLmNvcyh0aGV0YTEpOwotCQkJZmxvYXQgc2luVGhldGExID0gKGZsb2F0KSBNYXRoLnNpbih0aGV0YTEpOwotCQkJR0wxMS5nbEJlZ2luKEdMMTEuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wxMS5nbFZlcnRleDNmKGNvc1RoZXRhMSAqIGRpc3QsIC1zaW5UaGV0YTEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCQlHTDExLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCUdMMTEuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhICgpOwotCQlkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0JCWZpbmFsIEdMQ2FudmFzIGNhbnZhcyA9IG5ldyBHTENhbnZhcyhjb21wLCBTV1QuTk9ORSwgZGF0YSk7Ci0KLQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJdHJ5IHsKLSAgICAgICAJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0gICAgICAgIH0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0gICAgICAgIAotICAgICAgICBjYW52YXMuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldEJvdW5kcygpOwotICAgICAgICAJCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIGJvdW5kcy53aWR0aCAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCQlHTDExLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOwotICAgICAgICAJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0gICAgICAgIAkJR0wxMS5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOwotICAgICAgICAJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0KLQkJR0wxMS5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMMTEuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTDExLmdsSGludChHTDExLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wxMS5HTF9OSUNFU1QpOwotCQlHTDExLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlHTDExLmdsTGluZVdpZHRoKDIpOwotCQlHTDExLmdsRW5hYmxlKEdMMTEuR0xfREVQVEhfVEVTVCk7Ci0KLQkJc2hlbGwuc2V0VGV4dCgiU1dUL0xXSkdMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCSAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JICAgIAlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkgICAgICAgIH0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJCUdMMTEuZ2xDbGVhcihHTDExLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDExLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlHTDExLmdsQ2xlYXJDb2xvciguM2YsIC41ZiwgLjhmLCAxLjBmKTsKLQkJCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlHTDExLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlHTDExLmdsUm90YXRlZigwLjE1ZiAqIHJvdCwgMi4wZiAqIGZyb3QsIDEwLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlHTDExLmdsUG9seWdvbk1vZGUoR0wxMS5HTF9GUk9OVF9BTkRfQkFDSywgR0wxMS5HTF9MSU5FKTsKLQkJCQkJR0wxMS5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cygxLCAxLjlmICsgKChmbG9hdCkgTWF0aC5zaW4oKDAuMDA0ZiAqIGZyb3QpKSksIDE1LCAxNSk7Ci0JCQkJCWNhbnZhcy5zd2FwQnVmZmVycygpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWU5NDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MaWdodFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgTGlnaHRUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXRbXSBtYXRlcmlhbFNoaW5pbmVzcyA9IHsgMjUuMGYgfTsKLQlwcml2YXRlIGZsb2F0W10gbGlnaHRQb3NpdGlvbiA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiB9OwotCXByaXZhdGUgZmxvYXRbXVtdIGNvbG9yVmFsdWVzID0gewotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbGlnaHQgZGlmZnVzZQotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbGlnaHQgYW1iaWVudAotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbGlnaHQgc3BlY3VsYXIKLQkJeyAwLjVmLCAwLjVmLCAwLjVmLCAxLjBmIH0sCS8vIGxpZ2h0IG1haW4gYW1iaWVudAotCQl7IDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbWF0ZXJpYWwgZGlmZnVzZQotCQl7IDAuM2YsIDAuM2YsIDAuM2YsIDEuMGYgfSwJLy8gbWF0ZXJpYWwgYW1iaWVudAotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfQkvLyBtYXRlcmlhbCBzcGVjdWxhcgotCX07Ci0JcHJpdmF0ZSBmbG9hdCB5UG9zID0gMC4wZiwgeFBvcyA9IDAuMGYsIHpQb3MgPSAtMjAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljLCBzcGhlcmU7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMjIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMjIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjIpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYigyKTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBwb3NpdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwb3NpdGlvbkdyb3VwLnNldFRleHQoIkxpZ2h0IFBvc2l0aW9uIik7Ci0JCXBvc2l0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgbGlnaHRYID0gbmV3IFNsaWRlcihwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0WC5zZXRJbmNyZW1lbnQoMSk7Ci0JCWxpZ2h0WC5zZXRNYXhpbXVtKDIyKTsKLQkJbGlnaHRYLnNldE1pbmltdW0oMCk7Ci0JCWxpZ2h0WC5zZXRUaHVtYigyKTsKLQkJbGlnaHRYLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWxpZ2h0WC5zZXRTZWxlY3Rpb24oMTApOwotCQlsaWdodFguYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWxpZ2h0UG9zaXRpb25bMF0gPSAoKGZsb2F0KSBsaWdodFguZ2V0U2VsZWN0aW9uKCkgKiAxMCkgLSAxMDA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGxpZ2h0WSA9IG5ldyBTbGlkZXIocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlsaWdodFkuc2V0SW5jcmVtZW50KDEpOwotCQlsaWdodFkuc2V0TWF4aW11bSgyMik7Ci0JCWxpZ2h0WS5zZXRNaW5pbXVtKDApOwotCQlsaWdodFkuc2V0VGh1bWIoMik7Ci0JCWxpZ2h0WS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlsaWdodFkuc2V0U2VsZWN0aW9uKDEwKTsKLQkJbGlnaHRZLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlsaWdodFBvc2l0aW9uWzFdID0gKChmbG9hdCkgbGlnaHRZLmdldFNlbGVjdGlvbigpICogMTApIC0gMTAwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciBsaWdodFogPSBuZXcgU2xpZGVyKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRaLnNldEluY3JlbWVudCgxKTsKLQkJbGlnaHRaLnNldE1heGltdW0oMjIpOwotCQlsaWdodFouc2V0TWluaW11bSgwKTsKLQkJbGlnaHRaLnNldFRodW1iKDIpOwotCQlsaWdodFouc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJbGlnaHRaLnNldFNlbGVjdGlvbigxMCk7Ci0JCWxpZ2h0Wi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbGlnaHRQb3NpdGlvblsyXSA9ICgoZmxvYXQpIGxpZ2h0Wi5nZXRTZWxlY3Rpb24oKSAqIDEwKSAtIDIwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBsaWdodENvbG9yc0dyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsaWdodENvbG9yc0dyb3VwLnNldFRleHQoIkxpZ2h0IENvbG9ycyIpOwotCQlsaWdodENvbG9yc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlsaWdodENvbG9yc0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBsaWdodERpZmZ1c2VCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobGlnaHRDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQlsaWdodERpZmZ1c2VCdXR0b24uc2V0VGV4dCgiRGlmZnVzZSIpOwotCQlsaWdodERpZmZ1c2VCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMF1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1swXVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzBdWzJdICogMjU1KSkpOwotCQlsaWdodERpZmZ1c2VCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1swXVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzBdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1swXVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0QW1iaWVudEJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0QW1iaWVudEJ1dHRvbi5zZXRUZXh0KCJBbWJpZW50Iik7Ci0JCWxpZ2h0QW1iaWVudEJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1sxXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzFdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMV1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0QW1iaWVudEJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzFdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzFdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRTcGVjdWxhckJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0U3BlY3VsYXJCdXR0b24uc2V0VGV4dCgiU3BlY3VsYXIiKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1syXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzJdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMl1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0U3BlY3VsYXJCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1syXVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzJdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1syXVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0TWFpbkFtYmllbnRCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobGlnaHRDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uLnNldFRleHQoIk1haW4gQW1iaWVudCIpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzNdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbM11bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1szXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRNYWluQW1iaWVudEJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzNdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzNdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG1hdGVyaWFsQ29sb3JzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1hdGVyaWFsQ29sb3JzR3JvdXAuc2V0VGV4dCgiTWF0ZXJpYWwgQ29sb3JzIik7Ci0JCW1hdGVyaWFsQ29sb3JzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCW1hdGVyaWFsQ29sb3JzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIG1hdGVyaWFsRGlmZnVzZUJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChtYXRlcmlhbENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hdGVyaWFsRGlmZnVzZUJ1dHRvbi5zZXRUZXh0KCJEaWZmdXNlIik7Ci0JCW1hdGVyaWFsRGlmZnVzZUJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s0XVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzRdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNF1bMl0gKiAyNTUpKSk7Ci0JCW1hdGVyaWFsRGlmZnVzZUJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzRdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzRdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbWF0ZXJpYWxBbWJpZW50QnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxBbWJpZW50QnV0dG9uLnNldFRleHQoIkFtYmllbnQiKTsKLQkJbWF0ZXJpYWxBbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzVdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNV1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s1XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxBbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNV1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s1XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNV1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBtYXRlcmlhbFNwZWN1bGFyQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxTcGVjdWxhckJ1dHRvbi5zZXRUZXh0KCJTcGVjdWxhciIpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzZdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNl1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s2XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxTcGVjdWxhckJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzZdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzZdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJNYXRlcmlhbCBTaGluaW5lc3M6Iik7Ci0JCWZpbmFsIFNsaWRlciBzaGluZVNsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNoaW5lU2xpZGVyLnNldEluY3JlbWVudCg1KTsKLQkJc2hpbmVTbGlkZXIuc2V0TWF4aW11bSgxMDIpOwotCQlzaGluZVNsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzaGluZVNsaWRlci5zZXRUaHVtYigyKTsKLQkJc2hpbmVTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgxMCk7Ci0JCXNoaW5lU2xpZGVyLnNldFNlbGVjdGlvbigyNSk7Ci0JCXNoaW5lU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQltYXRlcmlhbFNoaW5pbmVzc1swXSA9IHNoaW5lU2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfU0hJTklORVNTLAotCQkJCQltYXRlcmlhbFNoaW5pbmVzcyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCQlHTC5nbERlbGV0ZUxpc3RzKHNwaGVyZSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiTGlnaHQiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wKTsKLQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdGVyaWFsU2hpbmluZXNzKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbEhpbnQoR0wuR0xfTElORV9TTU9PVEhfSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xIaW50KEdMLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xQb2ludFNpemUoMi4wZik7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCXNwaGVyZSA9IEdMLmdsR2VuTGlzdHMoMSk7Ci0JCUdMLmdsTmV3TGlzdChzcGhlcmUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMywgMzIsIDMyKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgbGlnaHRQb3NpdGlvbik7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdChzcGhlcmUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgY29sb3IgdmFsdWVzIGludG8gdGhlIHJlbmRlcmVkIGRpc3BsYXkuCi0JICovCi0Jdm9pZCBzZXRDb2xvclZhbHVlcygpIHsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfRElGRlVTRSwgY29sb3JWYWx1ZXNbMF0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0RJRkZVU0UsIGNvbG9yVmFsdWVzWzRdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9BTUJJRU5ULCBjb2xvclZhbHVlc1s1XSk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzFdKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfU1BFQ1VMQVIsIGNvbG9yVmFsdWVzWzJdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TUEVDVUxBUiwgY29sb3JWYWx1ZXNbNl0pOwotCQlHTC5nbExpZ2h0TW9kZWxmdihHTC5HTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBjb2xvclZhbHVlc1szXSk7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfU0hJTklORVNTLCBtYXRlcmlhbFNoaW5pbmVzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9OdXJiVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzZjA0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIE51cmJUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgeFBvcyA9IC01LjBmLCB5UG9zID0gLTUuMGYsIHpQb3MgPSAtMjUuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMzMwLjBmLCB5Um90ID0gMC4wZiwgelJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgbnVyYjsKLQotCS8qKgotCSAqIFJldHVybnMgYSAzIGRpbWVuc2lvbmFsIGFycmF5IHRvIHN0b3JlIHZlcnRleCBwb2ludHMgZm9yIHRoZSBudXJiCi0JICogc3VyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheQotCSAqLwotCWZsb2F0W11bXVtdIGJ1aWxkTnVyYigpIHsKLQkJZmxvYXRbXVtdW10gY3RybCA9IG5ldyBmbG9hdFs0XVs0XVszXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJLy8gc2V0IHRoZSB4IHZhbHVlCi0JCQkJY3RybFtpXVtqXVswXSA9IDIgKiAoaSArIChmbG9hdCkgTWF0aC5jb3MoaSArIGopKTsKLQkJCQkvLyBzZXQgdGhlIHkgdmFsdWUKLQkJCQljdHJsW2ldW2pdWzFdID0gMiAqIChqICsgKGZsb2F0KSBNYXRoLmNvcyhpICsgaikpOwotCQkJCS8vIHNldCB0aGUgeiB2YWx1ZQotCQkJCWlmICgoaSA9PSAxICYmIGogPT0gMSkgfHwgKGkgPT0gMiAmJiBqID09IDIpKSB7Ci0JCQkJCS8vIHRoaXMgbWFrZXMgdGhlIGhpbGwKLQkJCQkJY3RybFtpXVtqXVsyXSA9IDYuMGY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybFtpXVtqXVsyXSA9IDAuMGY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHNldHMgdGhpcyBwYXJ0aWN1bGFyIHogdmFsdWUgdG8gYSBsYXJnZSBudW1iZXIgdG8gbWFrZSBhIGhpZ2gKLQkJLy8gaGlsbAotCQljdHJsWzJdWzJdWzJdID0gOC4wZjsKLQotCQlyZXR1cm4gY3RybDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIDEgZGltZW5zaW9uYWwgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSAzIGRpbWVuc2lvbmFsCi0JICogYXJndW1lbnQuICBUaGlzIHJlc3VsdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBudXJiIHJlbmRlcmVyCi0JICogCi0JICogQHBhcmFtIGN0cmwgc291cmNlIDNEIGFycmF5Ci0JICogQHJldHVybiAxRCBhcnJheQotCSAqLwotCWZsb2F0W10gY29udmVydChmbG9hdFtdW11bXSBjdHJsKSB7Ci0JCWZsb2F0W10gcHRzID0KLQkJCW5ldyBmbG9hdFtjdHJsLmxlbmd0aCAqIGN0cmxbMF0ubGVuZ3RoICogY3RybFswXVswXS5sZW5ndGhdOwotCQlpbnQgcm93ID0gMDsKLQkJaW50IGNvbCA9IDA7Ci0JCS8vIHNldCByb3dJbmNyIHRvIG51bWJlciBvZiBjb2x1bW5zICogZGVwdGggCi0JCWludCByb3dJbmNyID0gY3RybFswXS5sZW5ndGggKiBjdHJsWzBdWzBdLmxlbmd0aDsKLQkJLy8gc2V0IGNvbEluY3IgdG8gZGVwdGggCi0JCWludCBjb2xJbmNyID0gY3RybFswXVswXS5sZW5ndGg7Ci0JCS8vIGxvb3AgdGhyb3VnaCByb3dzIAotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmwubGVuZ3RoOyBpKyspIHsKLQkJCWNvbCA9IDA7Ci0JCQkvLyBsb29wIHRocm91Z2ggY29sdW1ucwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdHJsWzBdLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gbG9vcCB0aHJvdWdoIHRvIGdldCB0aGUgZGVwdGggdmFsdWVzCi0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjdHJsWzBdWzBdLmxlbmd0aDsgaysrKSB7Ci0JCQkJCXB0c1tyb3cgKyBjb2wgKyBrXSA9IGN0cmxbaV1bal1ba107Ci0JCQkJfQotCQkJCWNvbCArPSBjb2xJbmNyOwotCQkJfQotCQkJcm93ICs9IHJvd0luY3I7Ci0JCX0KLQkJcmV0dXJuIHB0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAzMDsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDMzMCk7Ci0JCXhSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFJvdCA9IHhSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeVJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl5Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl5Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeVJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl5Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXlSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXlSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVJvdCA9IHlSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgelJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl6Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl6Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJelJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl6Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXpSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNhbXBsaW5nIFRvbGVyYW5jZToiKTsKLQkJZmluYWwgU2xpZGVyIHNTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc1NsaWRlci5zZXRNYXhpbXVtKDEwMSk7Ci0JCXNTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzU2xpZGVyLnNldFNlbGVjdGlvbig3NSk7Ci0JCXNTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQludXJiLAotCQkJCQlHTFUuR0xVX1NBTVBMSU5HX1RPTEVSQU5DRSwKLQkJCQkJc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDEpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gZmlsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmaWxsQnV0dG9uLnNldFRleHQoIkZpbGwiKTsKLQkJZmlsbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWZpbGxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQkJbnVyYiwKLQkJCQkJCUdMVS5HTFVfRElTUExBWV9NT0RFLAotCQkJCQkJR0xVLkdMVV9GSUxMKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTFUuZ2x1TnVyYnNQcm9wZXJ0eSgKLQkJCQkJCW51cmIsCi0JCQkJCQlHTFUuR0xVX0RJU1BMQVlfTU9ERSwKLQkJCQkJCUdMVS5HTFVfT1VUTElORV9QT0xZR09OKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVOdXJic1JlbmRlcmVyKG51cmIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJOdXJiIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJLy8gc2V0IHVwIG1hdGVyaWFsIGNvbG9yIHdoaWNoIGhlbHBzIHNob3cgY3VydmVzCi0JCWZsb2F0IG1hdF9zcGVjdWxhcltdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0JCWZsb2F0IG1hdF9zaGluaW5lc3NbXSA9IHsgMTAwLjBmIH07Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfU1BFQ1VMQVIsIG1hdF9zcGVjdWxhcik7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfU0hJTklORVNTLCBtYXRfc2hpbmluZXNzKTsKLQkJR0wuZ2xDb2xvck1hdGVyaWFsKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9BTUJJRU5UX0FORF9ESUZGVVNFKTsKLQkJCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ09MT1JfTUFURVJJQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQVVUT19OT1JNQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9OT1JNQUxJWkUpOwotCQkKLQkJbnVyYiA9IEdMVS5nbHVOZXdOdXJic1JlbmRlcmVyKCk7Ci0KLQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQludXJiLAotCQkJR0xVLkdMVV9TQU1QTElOR19NRVRIT0QsCi0JCQlHTFUuR0xVX1BBVEhfTEVOR1RIKTsKLQkJLy8gc2FtcGxpbmcgdG9sZXJhbmNlIGlzIHNwZWNpZmljIGZvciBHTFUuR0xVX1BBVEhfTEVOR1RICi0JCUdMVS5nbHVOdXJic1Byb3BlcnR5KG51cmIsIEdMVS5HTFVfU0FNUExJTkdfVE9MRVJBTkNFLCA3NS4wZik7Ci0JCUdMVS5nbHVOdXJic1Byb3BlcnR5KG51cmIsIEdMVS5HTFVfRElTUExBWV9NT0RFLCBHTFUuR0xVX0ZJTEwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCS8vIGRvIHRyYW5zbGF0aW9uIGFuZCByb3RhdGlvbgotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0JCS8vIGRlZmluZSBudXJicyBzdXJmYWNlCi0JCWZsb2F0W10ga25vdHMgPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJR0xVLmdsdUJlZ2luU3VyZmFjZShudXJiKTsKLQkJR0xVLmdsdU51cmJzU3VyZmFjZSgKLQkJCW51cmIsIDgsIGtub3RzLCA4LCBrbm90cywgMTIsIDMsCi0JCQljb252ZXJ0KGJ1aWxkTnVyYigpKSwgNCwgNCwgR0wuR0xfTUFQMl9WRVJURVhfMyk7Ci0JCUdMVS5nbHVFbmRTdXJmYWNlKG51cmIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT2JqZWN0c1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTFlMGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBPYmplY3RzVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGNsYXNzIFNoYXBlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzaGFwZQotCQkgKiBAcGFyYW0gaW5kZXggdGhlIGRpc3BsYXkgbGlzdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2hhcGUKLQkJICovCi0JCVNoYXBlKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXZvaWQgZGlzcG9zZSgpIHsKLQkJCUdMLmdsRGVsZXRlTGlzdHMoaW5kZXgsIDEpOwotCQl9Ci0JCXZvaWQgZHJhdygpIHsKLQkJCUdMLmdsQ2FsbExpc3QoaW5kZXgpOwotCQl9Ci0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXBlW10gc2hhcGVzOwotCXByaXZhdGUgU2hhcGUgY3VycmVudFNoYXBlOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDAuMGYsIHlSb3QgPSAwLjBmOwotCXByaXZhdGUgYm9vbGVhbiBmaWxsID0gdHJ1ZTsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29udHJvbHMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQluZXcgTGFiZWwoY29udHJvbHMsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIG9iamVjdHNDb21ibyA9IG5ldyBDb21ibyhjb250cm9scywgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlvYmplY3RzQ29tYm8uYWRkKHNoYXBlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0JCW9iamVjdHNDb21iby5zZWxlY3QoMCk7Ci0JCW9iamVjdHNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNoYXBlID0gc2hhcGVzW29iamVjdHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmluYWwgQnV0dG9uIGZpbGxUb2dnbGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRyb2xzLCBTV1QuQ0hFQ0spOwotCQlmaWxsVG9nZ2xlQnV0dG9uLnNldFRleHQoIkZpbGwiKTsKLQkJZmlsbFRvZ2dsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWZpbGxUb2dnbGVCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZpbGwgPSBmaWxsVG9nZ2xlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgY29sb3JHcm91cCA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29sb3JHcm91cC5zZXRUZXh0KCJGb3JlZ3JvdW5kIGNvbG9yIik7Ci0JCWNvbG9yR3JvdXAuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJR0wuZ2xDb2xvcjN1YigoYnl0ZSkgcmdiLnJlZCwgKGJ5dGUpIHJnYi5ncmVlbiwgKGJ5dGUpIHJnYi5ibHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzaGFwZXMgW2ldLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY2lyY2xlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHJhZGl1cwotCSAqIEBwYXJhbSB4U2hyaW5rCi0JICogQHBhcmFtIHlTaHJpbmsKLQkgKi8KLQl2b2lkIGRyYXdDaXJjbGUoZmxvYXQgcmFkaXVzLCBmbG9hdCB4U2hyaW5rLCBmbG9hdCB5U2hyaW5rKSB7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUE9MWUdPTik7Ci0JCWZsb2F0IGRpYSA9IChmbG9hdCkgMi4wICogKGZsb2F0KSBNYXRoLlBJOwotCQlmb3IgKGZsb2F0IGFuZ2xlID0gMC4wZjsgYW5nbGUgPD0gZGlhOyBhbmdsZSArPSAwLjFmKSB7Ci0JCQlHTC5nbFZlcnRleDJkKHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKSwgcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpKTsKLQkJfQotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY3ViZSBjZW50ZXJlZCBhdCAwLDAgaW4gdGhlIHZpZXdwb3J0LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKi8KLQl2b2lkIGRyYXdDdWJlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IGRlcHRoKSB7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBib3R0b20gbGVmdCAJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCBsZWZ0Ci0JCS8vIGJhY2sKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJvdHRvbSBsZWZ0IAkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gdG9wIGxlZnQKLQkJLy8gbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIGxlZnQJCQkJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgbGVmdAkKLQkJLy8gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBib3R0b20gbGVmdAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIGhlaWdodCwgZGVwdGgpOwkvLyB0b3AgbGVmdAotCQkvLyB0b3AKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IHJpZ2h0Ci0JCS8vIGJvdHRvbQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBweXJhbWlkIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBkZXB0aAotCSAqLwotCXZvaWQgZHJhd1B5cmFtaWQoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgZGVwdGgpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyB0b3AJCQkJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gcmlnaHQKLQkJLy8gbGVmdAotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyB0b3AJCQkJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBsZWZ0CQotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyByaWdodAkKLQkJLy8gZnJvbnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyByaWdodAotCQkvLyByaWdodAotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyB0b3AJCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gcmlnaHQJCQkKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGJvdHRvbQotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBmcm9udCBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IHJpZ2h0Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzcXVhcmUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0Jdm9pZCBkcmF3U3F1YXJlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gYm90dG9tIGxlZnQgCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAwLjBmKTsJLy8gdG9wIGxlZnQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZnJvbSBnbHV0X3NoYXBlcy5jIC4KLQkgKiAKLQkgKiBAcGFyYW0gcgotCSAqIEBwYXJhbSBSCi0JICogQHBhcmFtIG5zaWRlcwotCSAqIEBwYXJhbSByaW5ncwotCSAqLwotCXZvaWQgZHJhd1RvcnVzKGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZjsKLQkJZmxvYXQgY29zVGhldGEgPSAxLjBmOwotCQlmbG9hdCBzaW5UaGV0YSA9IDAuMGY7Ci0JCQotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURfU1RSSVApOwotCQkJZmxvYXQgcGhpID0gMC4wZjsKLQkJCQotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCUdMLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTC5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQkKLQkJCUdMLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRyaWFuZ2xlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqLwotCXZvaWQgZHJhd1RyaWFuZ2xlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyBtaWRkbGUgCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gbGVmdCAKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgMC4wZik7CS8vIHJpZ2h0CQkgCQkKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsJCi0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIk9iamVjdHMiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbExpbmVXaWR0aCgyKTsKLQotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQkvLyBjcmVhdGUgdGhlIGRpc3BsYXkgbGlzdHMgYW5kIHNoYXBlcwotCQlzaGFwZXMgPSBuZXcgU2hhcGVbMTFdOwotCQlpbnQgaW5kZXggPSAxOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdUcmlhbmdsZSgyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1swXSA9IG5ldyBTaGFwZSgiVHJpYW5nbGUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3UHlyYW1pZCgyLjBmLCAyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1sxXSA9IG5ldyBTaGFwZSgiUHlyYW1pZCIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdTcXVhcmUoMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbMl0gPSBuZXcgU2hhcGUoIlNxdWFyZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdDdWJlKDIuMGYsIDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzNdID0gbmV3IFNoYXBlKCJDdWJlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0NpcmNsZSgyLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s0XSA9IG5ldyBTaGFwZSgiQ2lyY2xlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdVBhcnRpYWxEaXNrKHF1YWRyYXRpYywgMC41LCAyLjAsIDE4LCAxOCwgOTAsIDEyNSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbNV0gPSBuZXcgU2hhcGUoIlBhcnRpYWwgRGlzayIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMC41LCAyLjAsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbNl0gPSBuZXcgU2hhcGUoIkRpc2siLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3VG9ydXMoMSwgMiwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s3XSA9IG5ldyBTaGFwZSgiVG9ydXMiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMi4wLCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzhdID0gbmV3IFNoYXBlKCJTcGhlcmUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1Q3lsaW5kZXIocXVhZHJhdGljLCAyLjAsIDIuMCwgNCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s5XSA9IG5ldyBTaGFwZSgiQ3lsaW5kZXIiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1Q3lsaW5kZXIocXVhZHJhdGljLCAwLCAyLjAsIDQsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbMTBdID0gbmV3IFNoYXBlKCJDb25lIiwgaW5kZXgrKyk7Ci0KLQkJY3VycmVudFNoYXBlID0gc2hhcGVzWzBdOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTQuMGYpOwotCQkvLyByb3RhdGUgYXJvdW5kIFggYW5kIFkgYXhpcwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJLy8gc2V0cyBwb2x5Z29uIGZpbGwgbW9kZQotCQlpZiAoZmlsbCkgewotCQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRklMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9MSU5FKTsKLQkJfQotCQljdXJyZW50U2hhcGUuZHJhdygpOwotCQl5Um90ICs9IDEuNTsKLQkJeFJvdCArPSAxLjU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzZGEyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE9wZW5HTEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19vcGVuZ2wiKTsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JcHJpdmF0ZSBPcGVuR0xUYWJbXSB0YWJzOwotCXByaXZhdGUgaW50IHNsZWVwOwotCQotCXB1YmxpYyBPcGVuR0xFeGFtcGxlKCkge30KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYW4gT3BlbkdMRXhhbXBsZSBlbWJlZGRlZCBpbnNpZGUKLQkgKiB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgT3BlbkdMRXhhbXBsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRhYnMgPQotCQkJbmV3IE9wZW5HTFRhYltdIHsKLQkJCQluZXcgQW50aWFsaWFzaW5nVGFiKCksCi0JCQkJbmV3IEFyZWFUYWIoKSwKLQkJCQluZXcgRm9nVGFiKCksCi0JCQkJbmV3IEdyYWRpZW50VGFiKCksCi0JCQkJbmV3IExpZ2h0VGFiKCksCi0JCQkJbmV3IE51cmJUYWIoKSwKLQkJCQluZXcgT2JqZWN0c1RhYigpLAotCQkJCW5ldyBSZWZsZWN0aW9uVGFiKCksCi0JCQkJbmV3IFN0ZW5jaWxUYWIoKSwKLQkJCQluZXcgVGV4dHVyZVRhYigpLAotCQkJCW5ldyBUcmFuc3BhcmVuY3lUYWIoKQotCQkJfTsKLQkJCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCh0YWJzW2ldLmdldFRhYlRleHQoKSk7Ci0JCQlpdGVtLnNldENvbnRyb2wodGFic1tpXS5jcmVhdGVUYWJGb2xkZXJQYWdlKHRhYkZvbGRlcikpOwotCQl9Ci0JCQotCQl0YWJGb2xkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCU9wZW5HTFRhYiB0YWIgPSB0YWJzW3RhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCQl0YWIuc2V0Q3VycmVudCgpOwotCQkJCXNsZWVwID0gdGFiLmdldFNsZWVwTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAodGFicy5sZW5ndGggPiAwKSB7Ci0JCQl0YWJzWzBdLnNldEN1cnJlbnQoKTsKLQkJCXNsZWVwID0gdGFic1swXS5nZXRTbGVlcExlbmd0aCgpOwotCQl9Ci0JCQotCQlSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodGFiRm9sZGVyLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCWRpc3BsYXkoKTsKLQkJCQl0YWJGb2xkZXIuZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhzbGVlcCwgdGhpcyk7Ci0JCQl9Ci0JCX07Ci0JCXRpbWVyLnJ1bigpOwotCQl0YWJGb2xkZXIuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJlbmRlcnMgdGhlIHNjZW5lIG9mIHRoZSBjdXJyZW50IHRhYi4KLQkgKi8KLQl2b2lkIGRpc3BsYXkoKSB7Ci0JCWludCBpbmRleCA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQl0YWJzW2luZGV4XS5yZW5kZXIoKTsKLQkJdGFic1tpbmRleF0uc3dhcCgpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgY29udGFpbmVkIHRhYnMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQl0YWJGb2xkZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCXRhYnNbaV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VzIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJT3BlbkdMRXhhbXBsZSBpbnN0YW5jZSA9IG5ldyBPcGVuR0xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgT3BlbkdMRXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTllOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC4qOwotCi0vKioKLSAqIDxjb2RlPk9wZW5HTFRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgZXZlcnkgcGFnZQotICogaW4gdGhlIGV4YW1wbGUncyB0YWIgZm9sZGVyLiAgRWFjaCBwYWdlIGluIHRoZSB0YWIgZm9sZGVyCi0gKiBkaXNwbGF5cyBhIGRpZmZlcmVudCBleGFtcGxlLgotICoKLSAqIEFuIE9wZW5HTFRhYiBpdHNlbGYgaXMgbm90IGEgY29udHJvbCBidXQgaW5zdGVhZCBwcm92aWRlcyBhIGhpZXJhcmNoeQotICogd2l0aCB3aGljaCB0byBzaGFyZSBjb2RlIHRoYXQgaXMgY29tbW9uIHRvIGV2ZXJ5IHBhZ2UgaW4gdGhlIGZvbGRlci4KLSAqLwotYWJzdHJhY3QgY2xhc3MgT3BlbkdMVGFiIHsKLQlwcml2YXRlIEdMQ2FudmFzIGdsQ2FudmFzOwotCXByaXZhdGUgQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JcHJpdmF0ZSBib29sZWFuIHN0ZW5jaWxTdXBwb3J0OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX1NMRUVQX0xFTkdUSCA9IDEwMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhpcyB0YWIncyBjb250cm9scy4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKgotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciB0aGUgcGFyZW50IHRhYiBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZQotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlclBhZ2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZGF0YS5zdGVuY2lsU2l6ZSA9IDg7Ci0JCWdsQ2FudmFzID0gbmV3IEdMQ2FudmFzKHRhYkZvbGRlclBhZ2UsIFNXVC5OT19CQUNLR1JPVU5ELCBkYXRhKTsKLQkJZ2xDYW52YXMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlnbENhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZ2xDYW52YXMuc2V0U2l6ZSg0MDAsIDQwMCk7CQkvLyBuZWVkZWQgZm9yIHdpbmRvd3MKLQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJQ29tcG9zaXRlIGNvbnRyb2xDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJY29udHJvbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbnRyb2xDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBPcGVuR0wgU2NyZWVuIGFuZCBjb250cm9scwotCQlzZXRDdXJyZW50KCk7Ci0JCXNldHVwVmlld2luZ0FyZWEoKTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgbmF0aXZlIHN0ZW5jaWwgc3VwcG9ydCBpcyBhdmFpbGFibGUKLQkJaW50W10gcGFyYW0gPSBuZXcgaW50WzFdOwotCQlHTC5nbEdldEludGVnZXJ2KEdMLkdMX1NURU5DSUxfQklUUywgcGFyYW0pOwotCQlzdGVuY2lsU3VwcG9ydCA9IHBhcmFtWzBdICE9IDA7Ci0KLQkJaW5pdCgpOwotCi0JCWlmICghaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHx8IGhhc1N0ZW5jaWxTdXBwb3J0KCkpIHsKLQkJCWNyZWF0ZUNvbnRyb2xzKGNvbnRyb2xDb21wb3NpdGUpOwotCQl9IGVsc2UgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udHJvbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyB0YWIgcmVxdWlyZXMgbmF0aXZlIHN0ZW5jaWwgc3VwcG9ydC4iKTsKLQkJfQotCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgdGFiLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnbENhbnZhcyBmb3IgdGhpcyB0YWIuCi0JICogCi0JICogQHJldHVybiBDYW52YXMKLQkgKi8KLQlHTENhbnZhcyBnZXRHbENhbnZhcygpIHsKLQkJcmV0dXJuIGdsQ2FudmFzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGF0IHRoZSBleGFtcGxlCi0JICogc2hvdWxkIHNsZWVwIGJldHdlZW4gYW5pbWF0aW9uIHJlZHJhd3MuICBBcyB0aGlzIGxlbmd0aAotCSAqIGluY3JlYXNlcywgdXNlciByZXNwb25zaXZlbmVzcyBpbmNyZWFzZXMgYW5kIHRoZSBmcmVxdWVuY3kgb2YKLQkgKiBhbmltYXRpb24gcmVkcmF3cyBkZWNyZWFzZXMuICBTdWJjbGFzc2VzIHdpdGggbW92aW5nIGFuaW1hdGlvbnMKLQkgKiBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEKLQkgKiBzbWFsbGVyIHZhbHVlIGlmIHRoZWlyIGFuaW1hdGlvbnMgZG8gbm90IG9jY3VyIGZyZXF1ZW50bHkgZW5vdWdoLiAKLQkgKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZXR3ZWVuIHJlZHJhd3MKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NMRUVQX0xFTkdUSDsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhpcyB0YWIuICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0VGFiVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWFjaGluZSBoYXMgbmF0aXZlIHN0ZW5jaWxzIHN1cHBvcnQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNTdGVuY2lsU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHN0ZW5jaWxTdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgT3BlbkdMIHJlc291cmNlcyBmb3IgdGhpcyB0YWIuICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBpbml0KCk7Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHRleHR1cmUuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gdGV4dHVyZVtdCi0JICovCi0Jc3RhdGljIHZvaWQgbG9hZFRleHR1cmUoR0xDYW52YXMgY29udGV4dCwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgaW5kZXgsIGludFtdIHRleHR1cmUpIHsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlW2luZGV4XSk7Ci0JCUltYWdlRGF0YSBzb3VyY2UgPQotCQkJbmV3IEltYWdlRGF0YShPcGVuR0xUYWIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSkpOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc291cmNlKTsKLQkJSW1hZ2UgbmV3SW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NiwgMjU2KTsKLQkJR0MgZ2MgPSBuZXcgR0MobmV3SW1hZ2UpOwotCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgMCwgMCwgMjU2LCAyNTYpOwotCQlzb3VyY2UgPSBuZXdJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlzb3VyY2UgPSBJbWFnZURhdGFVdGlsLmNvbnZlcnRJbWFnZURhdGEoc291cmNlKTsKLQkJbmV3SW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCUdMLmdsVGV4SW1hZ2UyRCgKLQkJCUdMLkdMX1RFWFRVUkVfMkQsIDAsIDMsIAotCQkJc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAwLAotCQkJR0wuR0xfUkdCLCBHTC5HTF9VTlNJR05FRF9CWVRFLCBzb3VyY2UuZGF0YSk7Ci0JCUdMLmdsVGV4UGFyYW1ldGVyaShHTC5HTF9URVhUVVJFXzJELCBHTC5HTF9URVhUVVJFX01JTl9GSUxURVIsIEdMLkdMX0xJTkVBUik7Ci0JCUdMLmdsVGV4UGFyYW1ldGVyaShHTC5HTF9URVhUVVJFXzJELCBHTC5HTF9URVhUVVJFX01BR19GSUxURVIsIEdMLkdMX0xJTkVBUik7Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGlzIHRhYi4KLQkgKi8KLQl2b2lkIHJlbmRlcigpIHsKLQkJc2V0Q3VycmVudCgpOwotCQlpZiAoIWlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB8fCBoYXNTdGVuY2lsU3VwcG9ydCgpKSB7Ci0JCQlyZW5kZXJTY2VuZSgpOwotCQl9IGVsc2UgewotCQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbmRlcnMgdGhlIHNjZW5lIGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHJlbmRlclNjZW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0YWIgcmVxdWlyZXMgc3RlbmNpbCBzdXBwb3J0IGluIG9yZGVyIHRvIGRpc3BsYXkKLQkgKiBwcm9wZXJseS4gU3ViY2xhc3NlcyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQgdG8gYmUgY3VycmVudC4KLQkgKi8KLQl2b2lkIHNldEN1cnJlbnQoKSB7Ci0JCWdsQ2FudmFzLnNldEN1cnJlbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgdmlld2luZyBhcmVhIGZvciB0aGUgT3BlbkdMIHNjcmVlbi4gIFRoZSBkZWZhdWx0Ci0JICogYmVoYXZpb3IgaXMgdG8gdXNlIGEgcGVyc3BlY3RpdmUgdmlldywgYnV0IHRoZXJlIGFsc28gZXhpc3QgZnJ1c3RydW0KLQkgKiBhbmQgb3J0aG8gdmlld3MuICBTdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0dXBWaWV3aW5nQXJlYSgpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBnbENhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB3aWR0aCA9IHJlY3Qud2lkdGg7Ci0JCWludCBoZWlnaHQgPSByZWN0LmhlaWdodDsKLQkJaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCAxKTsKLQkJR0wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwkvLyBzZWxlY3QgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7CQkJCS8vIHJlc2V0IHRoZSBwcm9qZWN0aW9uIG1hdHJpeAotCQlmbG9hdCBmQXNwZWN0ID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OwotCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0JCUdMLmdsTWF0cml4TW9kZShHTC5HTF9NT0RFTFZJRVcpOwkvLyBzZWxlY3QgdGhlIG1vZGVsdmlldyBtYXRyaXgKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBTd2FwcyB0aGUgYnVmZmVycy4KLQkgKi8KLQl2b2lkIHN3YXAoKSB7Ci0JCWdsQ2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9SZWZsZWN0aW9uVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2NTRiMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFJlZmxlY3Rpb25UYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgYmFsbFkgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFogPSAxLjY2NjY2NjZmOwotCXByaXZhdGUgZmxvYXQgYmFsbFggPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWCA9IDIuNWY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWSA9IC0yLjBmOwotCXByaXZhdGUgZmxvYXQgY3ViZVogPSAyLjBmOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB5UG9zID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHpQb3MgPSAyMi4wZjsKLQlwcml2YXRlIGZsb2F0IGJhbGxSb3RTcGVlZCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgaW50W10gdGV4dHVyZXMgPSBuZXcgaW50WzNdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludAotCQlMSVNUX0lOREVYX0JBTEwgPSAxLExJU1RfSU5ERVhfQk9YID0gMiwKLQkJTElTVF9JTkRFWF9NSVJST1IgPSAzLCBMSVNUX0lOREVYX1JPT00gPSA0OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludAotCQlURVhUVVJFX0lOREVYX0JBTEwgPSAwLCBURVhUVVJFX0lOREVYX0ZMT09SID0gMSwKLQkJVEVYVFVSRV9JTkRFWF9CT1ggPSAyOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIElNQUdFUyA9IHsKLQkJImltYWdlcy9CYWxsLmpwZyIsICJpbWFnZXMvRmxvb3IuanBnIiwgImltYWdlcy9Cb3guYm1wIiB9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSA1MDsKLQotCS8qKgotCSAqIERyYXdzIHRoZSBiYWxsCi0JICovCi0Jdm9pZCBjcmVhdGVCYWxsKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9CQUxMLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQkFMTF0pOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMC4zNWYsIDMyLCAxNik7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBib3gKLQkgKi8KLQl2b2lkIGNyZWF0ZUJveCgpIHsKLQkJZmxvYXQgc2l6ZSA9IDEuMGY7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX0JPWCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlc1tURVhUVVJFX0lOREVYX0JPWF0pOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZnJvbnQJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCS8vIGJhY2sJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgLTEuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIC1zaXplKTsKLQkJLy8gbGVmdAkKLQkJR0wuZ2xOb3JtYWwzZigtMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyByaWdodAkKLQkJR0wuZ2xOb3JtYWwzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIC1zaXplKTsKLQkJLy8gdG9wCQotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIHNpemUpOwotCQkvLyBib3R0b20JCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgLTEuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBiYWxsVHJhbnNsYXRpb24gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJhbGxUcmFuc2xhdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJYmFsbFRyYW5zbGF0aW9uLnNldFRleHQoIkJhbGwgVHJhbnNsYXRpb24iKTsKLQotCQluZXcgTGFiZWwoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxYUG9zU2xpZGVyID0gbmV3IFNsaWRlcihiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQliYWxsWFBvc1NsaWRlci5zZXRNYXhpbXVtKDM4KTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxOCk7Ci0JCWJhbGxYUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWCA9IChmbG9hdCkgKGJhbGxYUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMTgpIC8gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0TWF4aW11bSgzOCk7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQliYWxsWVBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsWVBvc1NsaWRlci5zZXRTZWxlY3Rpb24oMTgpOwotCQliYWxsWVBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYmFsbFkgPSAoZmxvYXQpIChiYWxsWVBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSAtIDE4KSAvIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgYmFsbFpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQliYWxsWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldE1heGltdW0oMjQpOwotCQliYWxsWlBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsWlBvc1NsaWRlci5zZXRUaHVtYigxKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDQpOwotCQliYWxsWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYmFsbFogPSAoZmxvYXQpIChiYWxsWlBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDEpIC8gMzsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgY3ViZVRyYW5zbGF0aW9uID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljdWJlVHJhbnNsYXRpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWN1YmVUcmFuc2xhdGlvbi5zZXRUZXh0KCJDdWJlIFRyYW5zbGF0aW9uIik7Ci0KLQkJbmV3IExhYmVsKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciBjdWJlWFBvc1NsaWRlciA9IG5ldyBTbGlkZXIoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0TWF4aW11bSgxNCk7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQljdWJlWFBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQljdWJlWFBvc1NsaWRlci5zZXRTZWxlY3Rpb24oMTEpOwotCQljdWJlWFBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3ViZVggPSAoZmxvYXQpIChjdWJlWFBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSAtIDYpIC8gMjsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciBjdWJlWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0TWF4aW11bSgxNCk7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQljdWJlWVBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQljdWJlWVBvc1NsaWRlci5zZXRTZWxlY3Rpb24oMik7Ci0JCWN1YmVZUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdWJlWSA9IChmbG9hdCkgKGN1YmVZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gNikgLyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVaUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWlBvc1NsaWRlci5zZXRNYXhpbXVtKDEwKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0TWluaW11bSgxKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0VGh1bWIoMSk7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyKTsKLQkJY3ViZVpQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1YmVaID0gKGZsb2F0KSAoY3ViZVpQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgKyAyKSAvIDI7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiUm9vbSBSb3RhdGlvbiIpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHNjcmVlblhQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0TWF4aW11bSg0Mik7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCXNjcmVlblhQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSBzY3JlZW5YUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHNjcmVlbllQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0TWF4aW11bSg0Mik7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCXNjcmVlbllQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSBzY3JlZW5ZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHNjcmVlblpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0TWF4aW11bSg0Mik7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCXNjcmVlblpQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSBzY3JlZW5aUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMjsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkJhbGwgUm90YXRpb24gU3BlZWQ6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsUm90U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0TWF4aW11bSgyMik7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRUaHVtYigyKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsUm90U2xpZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJYmFsbFJvdFNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYmFsbFJvdFNwZWVkID0gYmFsbFJvdFNsaWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIERyYXdzIHRoZSBtaXJyb3IKLQkgKi8KLQl2b2lkIGNyZWF0ZU1pcnJvcigpIHsKLQkJR0wuZ2xOZXdMaXN0KExJU1RfSU5ERVhfTUlSUk9SLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMC40Zik7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIERyYXdzIHRoZSByb29tCi0JICovCi0Jdm9pZCBjcmVhdGVSb29tKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9ST09NLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gbGVmdCB3YWxsCi0JCUdMLmdsTm9ybWFsM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCA0LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgMC4wZik7Ci0JCS8vIHJpZ2h0IHdhbGwKLQkJR0wuZ2xOb3JtYWwzZigtMS4wZiwgMC4wZiwgMDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZig0LjBmLCAtNC4wZiwgMC4wZik7Ci0JCS8vIGNlaWxpbmcJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgLTEuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCA0LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZig0LjBmLCA0LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZig0LjBmLCA0LjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJLy8gYmFjayB3YWxsIHdpdGggdHJpYW5nbGUgc3RyaXAgdG8gaWxsaW1pbmF0ZSB0LWludGVyc2VjdGlvbnMgCi0JCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVfU1RSSVApOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIC00LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoNC4wLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoNC4wLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoNC4wLCA0LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCA0LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtNC4wLCA0LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCS8vIGRyYXcgZmxvb3IKLQkJR0wuZ2xDb2xvcjRmKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfRkxPT1JdKTsKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZsb29yCi0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIC00LjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCA2LjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJLy8gZHJhdyBtaXJyb3IgZnJhbWUKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlc1tURVhUVVJFX0lOREVYX0JPWF0pOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gdG9wCi0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMmYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIDIuMmYsIDAuMGYpOwotCQkvLyByaWdodAotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAyLjBmLCAwLjBmKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgLTIuMmYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIC0yLjJmLCAwLjBmKTsKLQkJLy8gbGVmdAotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfQkFMTCwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9CT1gsIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfTUlSUk9SLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhMSVNUX0lOREVYX1JPT00sIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlJlZmxlY3Rpb24iOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0KLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCUdMLmdsQ2xlYXJTdGVuY2lsKDApOwotCQlHTC5nbEdlblRleHR1cmVzKElNQUdFUy5sZW5ndGgsIHRleHR1cmVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBJTUFHRVMubGVuZ3RoOyBpKyspIHsKLQkJCWxvYWRUZXh0dXJlKGdldEdsQ2FudmFzKCksIElNQUdFU1tpXSwgaSwgdGV4dHVyZXMpOwotCQl9Ci0KLQkJR0wuZ2xTaGFkZU1vZGVsKEdMLkdMX1NNT09USCk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCUdMVS5nbHVRdWFkcmljTm9ybWFscyhxdWFkcmF0aWMsIEdMLkdMX1NNT09USCk7Ci0JCUdMVS5nbHVRdWFkcmljVGV4dHVyZShxdWFkcmF0aWMsIHRydWUpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCi0JCS8vIHNldCB1cCB0aGUgbGlnaHRzCi0JCWZsb2F0W10gTGlnaHRBbWIgPSB7IDAuN2YsIDAuN2YsIDAuN2YsIDEuMGYgfTsKLQkJZmxvYXRbXSBMaWdodERpZiA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlmbG9hdFtdIGxpZ2h0c0FtYmllbnQgPSB7IDAuNWYsIDAuNWYsIDAuNWYsIDEuMGYgfTsKLQkJR0wuZ2xMaWdodE1vZGVsZnYoR0wuR0xfTElHSFRfTU9ERUxfQU1CSUVOVCwgbGlnaHRzQW1iaWVudCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX0FNQklFTlQsIExpZ2h0QW1iKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfRElGRlVTRSwgTGlnaHREaWYpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUMCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQotCQljcmVhdGVSb29tKCk7Ci0JCWNyZWF0ZUJhbGwoKTsKLQkJY3JlYXRlQm94KCk7Ci0JCWNyZWF0ZU1pcnJvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2lzU3RlbmNpbFN1cHBvcnROZWVkZWQKLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTFUuZ2x1TG9va0F0KHhQb3MsIHlQb3MsIHpQb3MsIDAsIDAsIDAsIDAsIDEsIDApOwotCQkvLyBjbGlwIHBsYW5lIGVxdWF0aW9uCi0JCWRvdWJsZSBjbGlwRXF1YXRpb25bXSA9IHsgMC4wZiwgMC4wZiwgLTEuMGYsIDAuMGYgfTsKLQkJZmxvYXRbXSBMaWdodFBvcyA9IHsgMC4wZiwgMi4wZiwgNy4wZiwgMS4wZiB9OwotCQlHTC5nbENvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCS8vIGVuYWJsZSBzdGVuY2lsIGJ1ZmZlciBmb3IgIm1hcmtpbmciIHRoZSBtaXJyb3IJCQotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyIHRvIDEgd2hlcmUgYSBwb2x5Z29uIGlzIGRyYXduCi0JCUdMLmdsU3RlbmNpbEZ1bmMoR0wuR0xfQUxXQVlTLCAxLCAxKTsKLQkJR0wuZ2xTdGVuY2lsT3AoR0wuR0xfS0VFUCwgR0wuR0xfS0VFUCwgR0wuR0xfUkVQTEFDRSk7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX01JUlJPUik7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9FUVVBTCwgMSwgMSk7Ci0JCS8vIGRyYXcgd2hlcmUgdGhlIHN0ZW5jaWwgaXMgMQkJCQkJCQotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9LRUVQKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ0xJUF9QTEFORTApOwotCQlHTC5nbENsaXBQbGFuZShHTC5HTF9DTElQX1BMQU5FMCwgY2xpcEVxdWF0aW9uKTsKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsU2NhbGVmKDEuMGYsIDEuMGYsIC0xLjBmKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfUE9TSVRJT04sIExpZ2h0UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX1JPT00pOwkJCS8vIHJlZmxlY3Rpb24KLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZihjdWJlWCwgY3ViZVksIGN1YmVaKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JPWCk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoYmFsbFgsIGJhbGxZLCBiYWxsWik7Ci0JCUdMLmdsUm90YXRlZihiYWxsUm90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JBTEwpOwkJCS8vIHJlZmxlY3Rpb24KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0NMSVBfUExBTkUwKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX1NURU5DSUxfVEVTVCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBMaWdodFBvcyk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX01JUlJPUik7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX1JPT00pOwotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGN1YmVYLCBjdWJlWSwgY3ViZVopOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQk9YKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGJhbGxYLCBiYWxsWSwgYmFsbFopOwotCQlHTC5nbFJvdGF0ZWYoYmFsbFJvdCwgMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ2FsbExpc3QoTElTVF9JTkRFWF9CQUxMKTsKLQkJYmFsbFJvdCArPSBiYWxsUm90U3BlZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9TdGVuY2lsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzMzdlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFN0ZW5jaWxUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgU2hhcGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkvKioKLQkJICogQ29uc3RydWN0b3IKLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lIHRoZSBzaGFwZSdzIG5hbWUKLQkJICovCi0JCVNoYXBlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQkvKioKLQkJICogRHJhd3MgdGhpcyBzaGFwZS4KLQkJICovCi0JCWFic3RyYWN0IHZvaWQgZHJhdygpOwotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbmFtZS4KLQkJICogCi0JCSAqIEByZXR1cm4gU3RyaW5nCi0JCSAqLwotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTaGFwZVtdIHNoYXBlcyA9IG5ldyBTaGFwZVs1XTsKLQlwcml2YXRlIFNoYXBlIGN1cnJlbnRTaGFwZTsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLCB5UG9zID0gMDsKLQlwcml2YXRlIGZsb2F0IHNpemUgPSAwLjQ1ZjsKLQlwcml2YXRlIGludCB0ZXh0dXJlOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1BR0UgPSAiaW1hZ2VzL3NwbGFzaC5ibXAiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSA1MDsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb250cm9scy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTk9ORSkuc2V0VGV4dCgiT2JqZWN0OiIpOwotCQlmaW5hbCBDb21ibyBzaGFwZUNvbWJvID0gbmV3IENvbWJvKGNvbnRyb2xzLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNoYXBlQ29tYm8uYWRkKHNoYXBlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0JCXNoYXBlQ29tYm8uc2VsZWN0KDApOwotCQlzaGFwZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbc2hhcGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNpemU6Iik7Ci0JCWZpbmFsIFNsaWRlciBzaXplU2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJc2l6ZVNsaWRlci5zZXRWYWx1ZXMoMCwgMTUsIDc1LCA1LCA1LCAxMCk7Ci0JCXNpemVTbGlkZXIuc2V0U2VsZWN0aW9uKDQ1KTsKLQkJc2l6ZVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJc2l6ZSA9ICgoZmxvYXQpIHNpemVTbGlkZXIuZ2V0U2VsZWN0aW9uKCkpIC8gMTAwOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJTdGVuY2lsIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCWlmICghaGFzU3RlbmNpbFN1cHBvcnQoKSkgcmV0dXJuOwotCQkKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCWludFtdIHRleHR1cmVPdXQgPSBuZXcgaW50WzFdOwotCQlHTC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVPdXQpOwotCQlsb2FkVGV4dHVyZShnZXRHbENhbnZhcygpLCBJTUFHRSwgMCwgdGV4dHVyZU91dCk7Ci0JCXRoaXMudGV4dHVyZSA9IHRleHR1cmVPdXRbMF07Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCUdMVS5nbHVRdWFkcmljTm9ybWFscyhxdWFkcmF0aWMsIEdMVS5HTFVfU01PT1RIKTsKLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVRVUFMKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBjcmVhdGUgc2hhcGVzCi0JCXNoYXBlc1swXSA9IG5ldyBTaGFwZSgiVHJpYW5nbGUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVTKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCXNoYXBlc1sxXSA9IG5ldyBTaGFwZSgiRGlzayIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAwLjBmLCBzaXplLCAzMiwgMzIpOwotCQkJfQotCQl9OwotCi0JCXNoYXBlc1syXSA9IG5ldyBTaGFwZSgiU3F1YXJlIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbFJlY3RmKC1zaXplLCAtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzNdID0gbmV3IFNoYXBlKCJIb3VyIEdsYXNzIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAtc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCXNoYXBlc1s0XSA9IG5ldyBTaGFwZSgiU3RhciIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkJCUdMLmdsVmVydGV4M2YoLTAuM2YsIDAsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoMiAqIHNpemUgLSAwLjNmLCAwLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUgLSAwLjNmLCAyICogc2l6ZSAqIDAuODVmLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDIgKiBzaXplIC0gMC4zZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigwIC0gMC4zZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihzaXplIC0gMC4zZiwgLXNpemUgKiAwLjg1ZiwgMC4wZik7Ci0JCQkJR0wuZ2xFbmQoKTsKLQkJCX0KLQkJfTsKLQotCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbMF07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaXNTdGVuY2lsU3VwcG9ydE5lZWRlZAotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigKLQkJCShmbG9hdCkgKDEuNSAqIE1hdGguY29zKHhQb3MpKSwKLQkJCShmbG9hdCkgKDEuMCAqIE1hdGguc2luKHlQb3MpKSwKLQkJCS0zLjBmKTsKLQkJeFBvcyArPSAwLjE1ZjsKLQkJeVBvcyArPSAwLjNmOwotCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9SRVBMQUNFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0KLQkJY3VycmVudFNoYXBlLmRyYXcoKTsKLQotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xDb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCUdMLmdsU3RlbmNpbEZ1bmMoR0wuR0xfRVFVQUwsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9LRUVQKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQkvLyBsb2FkIHRoZSB0ZXh0dXJlIGJlaGluZCB0aGUgc3RlbmNpbCBvYmplY3QKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0zLjFmKTsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC44NWYsIC0wLjg1ZiwgMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjg1ZiwgLTAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuODVmLCAwLjg1ZiwgMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC44NWYsIDAuODVmLCAxLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RleHR1cmVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFlMTFhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgVGV4dHVyZVRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCB5cm90ID0gMCwgenJvdCA9IDA7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZiwgeVBvcyA9IDAuMGYsIHpQb3MgPSAtMjA7Ci0JcHJpdmF0ZSBpbnQgdGV4dHVyZSA9IDA7Ci0JcHJpdmF0ZSBmbG9hdFtdW11bXSBwb2ludHMgPSBuZXcgZmxvYXRbNDVdWzQ1XVszXTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1BR0UgPSAiaW1hZ2VzL3NwbGFzaC5ibXAiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSA1MDsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDI0KTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoNCk7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAzMDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiVGV4dHVyZSI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQkvL0dMLmdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjNmLCAxLjBmKTsgCi0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDbGVhckRlcHRoKDEuMGYpOwotCQlpbnRbXSB0ZXh0dXJlT3V0ID0gbmV3IGludFsxXTsKLQkJR0wuZ2xHZW5UZXh0dXJlcygxLCB0ZXh0dXJlT3V0KTsKLQkJbG9hZFRleHR1cmUoZ2V0R2xDYW52YXMoKSwgSU1BR0UsIDAsIHRleHR1cmVPdXQpOwotCQl0ZXh0dXJlID0gdGV4dHVyZU91dFswXTsKLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVRVUFMKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9CQUNLLCBHTC5HTF9GSUxMKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVCwgR0wuR0xfTElORSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJU1RfTU9ERSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gaW5pdGlhbGl6ZSBwb2ludHMJCi0JCWZvciAoaW50IHggPSAwOyB4IDwgNDU7IHgrKykgewotCQkJZm9yIChpbnQgeSA9IDA7IHkgPCA0NTsgeSsrKSB7Ci0JCQkJcG9pbnRzW3hdW3ldWzBdID0geCAvIDUuMGYgLSA0LjVmOwotCQkJCXBvaW50c1t4XVt5XVsxXSA9IHkgLyA1LjBmIC0gNC41ZjsKLQkJCQlwb2ludHNbeF1beV1bMl0gPQotCQkJCQkoZmxvYXQpIE1hdGguc2luKAotCQkJCQkJKCgoeCAvIDUuMGYpICogNDAuMGYpIC8gMzYwLjBmKSAqIE1hdGguUEkgKiAyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbFJvdGF0ZWYoeXJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6cm90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKLQotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NDsgeCsrKSB7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IDQ0OyB5KyspIHsKLQkJCQlmbG9hdCBmeCA9IHggLyA0NC4wZjsKLQkJCQlmbG9hdCBmeSA9IHkgLyA0NC4wZjsKLQkJCQlmbG9hdCBmeGIgPSAoeCArIDEpIC8gNDQuMGY7Ci0JCQkJZmxvYXQgZnliID0gKHkgKyAxKSAvIDQ0LjBmOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeCwgZnkpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4XVt5XVswXSwKLQkJCQkJcG9pbnRzW3hdW3ldWzFdLAotCQkJCQlwb2ludHNbeF1beV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeCwgZnliKTsKLQkJCQlHTC5nbFZlcnRleDNmKAotCQkJCQlwb2ludHNbeF1beSArIDFdWzBdLAotCQkJCQlwb2ludHNbeF1beSArIDFdWzFdLAotCQkJCQlwb2ludHNbeF1beSArIDFdWzJdKTsKLQkJCQlHTC5nbFRleENvb3JkMmYoZnhiLCBmeWIpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4ICsgMV1beSArIDFdWzBdLAotCQkJCQlwb2ludHNbeCArIDFdW3kgKyAxXVsxXSwKLQkJCQkJcG9pbnRzW3ggKyAxXVt5ICsgMV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeGIsIGZ5KTsKLQkJCQlHTC5nbFZlcnRleDNmKAotCQkJCQlwb2ludHNbeCArIDFdW3ldWzBdLAotCQkJCQlwb2ludHNbeCArIDFdW3ldWzFdLAotCQkJCQlwb2ludHNbeCArIDFdW3ldWzJdKTsKLQkJCX0KLQkJfQotCQlHTC5nbEVuZCgpOwotCQkvLyBwZXJmb3JtIHdhdmUgbW90aW9uCi0JCWZvciAoaW50IHkgPSAwOyB5IDwgNDU7IHkrKykgewotCQkJZmxvYXQgaG9sZCA9IHBvaW50c1swXVt5XVsyXTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgNDQ7IHgrKykgewotCQkJCXBvaW50c1t4XVt5XVsyXSA9IHBvaW50c1t4ICsgMV1beV1bMl07Ci0JCQl9Ci0JCQlwb2ludHNbNDRdW3ldWzJdID0gaG9sZDsKLQkJfQotCQl5cm90ICs9IDAuOWY7Ci0JCXpyb3QgKz0gMC42ZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UcmFuc3BhcmVuY3lUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZGI1My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgVHJhbnNwYXJlbmN5VGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0W10gYWxwaGFzID0geyAwLjNmLCAwLjVmLCAxLjBmIH07Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludAotCQlJTkRFWF9UUklBTkdMRSA9IDEsIElOREVYX1NQSEVSRSA9IDIsIElOREVYX0RJU0sgPSAzOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIE9CSkVDVFMgPSB7IlRyaWFuZ2xlIiwgIlNwaGVyZSIsICJEaXNrIiB9OwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgb2JqZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlvYmplY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQluZXcgTGFiZWwob2JqZWN0R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIG9iamVjdENvbWJvID0gbmV3IENvbWJvKG9iamVjdEdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlvYmplY3RDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlvYmplY3RDb21iby5zZXRJdGVtcyhPQkpFQ1RTKTsKLQkJb2JqZWN0Q29tYm8uc2VsZWN0KDApOwotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlRyYW5zcGFyZW5jeToiKTsKLQkJZmluYWwgU2xpZGVyIHRyYW5zcGFyZW5jeVNsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRWYWx1ZXMoMCwgMCwgMTEsIDEsIDEsIDIpOwotCQl0cmFuc3BhcmVuY3lTbGlkZXIuc2V0U2VsZWN0aW9uKDcpOwotCQl0cmFuc3BhcmVuY3lTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZsb2F0IGFscGhhID0gdHJhbnNwYXJlbmN5U2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCWFscGhhID0gMS4wZiAtIGFscGhhIC8gMTA7Ci0JCQkJYWxwaGFzW2N1cnJlbnRTZWxlY3Rpb24gLSAxXSA9IGFscGhhOwotCQkJfQotCQl9KTsKLQkJb2JqZWN0Q29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBvYmplY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICsgMTsKLQkJCQl0cmFuc3BhcmVuY3lTbGlkZXIuc2V0U2VsZWN0aW9uKAotCQkJCQkoaW50KSAoKDEuMGYgLSBhbHBoYXNbY3VycmVudFNlbGVjdGlvbiAtIDFdKSAqIDEwKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCQlHTC5nbERlbGV0ZUxpc3RzKElOREVYX0RJU0ssIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKElOREVYX1NQSEVSRSwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfVFJJQU5HTEUsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlRyYW5zcGFyZW5jeSI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCUdMVS5nbHVRdWFkcmljTm9ybWFscyhxdWFkcmF0aWMsIEdMVS5HTFVfU01PT1RIKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ1VMTF9GQUNFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJLy8gY3JlYXRlIGRpc3BsYXkgbGlzdHMJCQotCQlHTC5nbE5ld0xpc3QoSU5ERVhfU1BIRVJFLCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdVF1YWRyaWNEcmF3U3R5bGUocXVhZHJhdGljLCBHTFUuR0xVX0ZJTEwpOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMS41LCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJR0wuZ2xOZXdMaXN0KElOREVYX0RJU0ssIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfRklMTCk7Ci0JCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMS4wLCAzLCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJR0wuZ2xOZXdMaXN0KElOREVYX1RSSUFOR0xFLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAtMi4wZiwgMi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlbGVjdGlvblRhYi5wcm9jZXNzUGljayAoaW50W10sIGludCkKLQkgKi8KLQl2b2lkIHByb2Nlc3NQaWNrKGludFtdIHBTZWxlY3RCdWZmLCBpbnQgaGl0cykgewotCQlpbnQgekRlcHRoOwotCQlpbnQgdGVtcFNlbGVjdGlvbiA9IHBTZWxlY3RCdWZmWzNdOwotCQl6RGVwdGggPSBwU2VsZWN0QnVmZlsyXTsKLQkJLy8gcGljayBvYmplY3Qgd2l0aCBsYXJnZXN0IHogdmFsdWUKLQkJZm9yIChpbnQgaSA9IDQ7IGkgPD0gNCAqIChoaXRzIC0gMSk7IGkgPSBpICsgNCkgewotCQkJaWYgKHpEZXB0aCA+IHBTZWxlY3RCdWZmW2kgKyAyXSkgewotCQkJCXpEZXB0aCA9IHBTZWxlY3RCdWZmW2kgKyAyXTsKLQkJCQl0ZW1wU2VsZWN0aW9uID0gcFNlbGVjdEJ1ZmZbaSArIDNdOwotCQkJfQotCQl9Ci0JCWlmICh0ZW1wU2VsZWN0aW9uID4gMCkgY3VycmVudFNlbGVjdGlvbiA9IHRlbXBTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCS8vIGRyYXcgaXRlbXMgd2l0aCB0cmFuc3BhcmVudCBxdWFsaXRpZXMgaW4gcmV2ZXJzZSBaIG9yZGVyCi0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTE0LjBmKTsKLQkJR0wuZ2xQdXNoTmFtZSgwKTsKLQotCQkvLyBkcmF3IGRpc2sKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigtMS4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQ29sb3I0ZigwLjBmLCAxLjBmLCAwLjBmLCBhbHBoYXNbMl0pOwotCQlHTC5nbExvYWROYW1lKElOREVYX0RJU0spOwotCQlHTC5nbENhbGxMaXN0KElOREVYX0RJU0spOwotCQlpZiAoY3VycmVudFNlbGVjdGlvbiA9PSBJTkRFWF9ESVNLKSB7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfTElORSk7Ci0JCQlHTFUuZ2x1RGlzayhxdWFkcmF0aWMsIDAuOTgsIDMuMDIsIDMyLCAzMik7Ci0JCX0KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQkvLyBkcmF3IHRyaWFuZ2xlCi0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCArMy4wZik7Ci0JCUdMLmdsTG9hZE5hbWUoSU5ERVhfVFJJQU5HTEUpOwotCQlHTC5nbENvbG9yNGYoMS4wZiwgMC4wZiwgMC4wZiwgYWxwaGFzWzBdKTsKLQkJR0wuZ2xDYWxsTGlzdChJTkRFWF9UUklBTkdMRSk7Ci0JCUdMLmdsUG9pbnRTaXplKDUuMGYpOwotCQlpZiAoY3VycmVudFNlbGVjdGlvbiA9PSBJTkRFWF9UUklBTkdMRSkgewotCQkJR0wuZ2xCZWdpbihHTC5HTF9QT0lOVFMpOwotCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAyLjBmLCAwLjBmKTsKLQkJCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAyLjBmKTsKLQkJCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDIuMGYpOwotCQkJR0wuZ2xFbmQoKTsKLQkJfQotCi0JCS8vIGRyYXcgc3BoZXJlCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMS4wZiwgMC4wZiwgKzMuMGYpOwotCQlHTC5nbENvbG9yNGYoMC4wZiwgMC4wZiwgMS4wZiwgYWxwaGFzWzFdKTsKLQkJR0wuZ2xMb2FkTmFtZShJTkRFWF9TUEhFUkUpOwotCQlHTC5nbENhbGxMaXN0KElOREVYX1NQSEVSRSk7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX1NQSEVSRSkgewotCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJR0xVLmdsdVF1YWRyaWNEcmF3U3R5bGUocXVhZHJhdGljLCBHTFUuR0xVX0xJTkUpOwotCQkJR0xVLmdsdVNwaGVyZShxdWFkcmF0aWMsIDEuNTEsIDgsIDgpOwotCQl9Ci0JCUdMLmdsUG9wTWF0cml4KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQmFsbC5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5MGQyNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9Cb3guYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWVmNjYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MzRjOWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvRmxvb3IuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3NwbGFzaC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzc1ZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkNmFhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy91bnRpdGxlZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5YjNhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uuc3d0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFhYTkzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHNuaXBwZXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMDIxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU1dUIFNuaXBwZXRzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5MDMzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTBiMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThjOTBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBEcmF3aW5nIHdpdGggdHJhbnNmb3JtYXRpb25zLCBwYXRocyBhbmQgYWxwaGEgYmxlbmRpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJBZHZhbmNlZCBHcmFwaGljcyIpOwotCQlGb250RGF0YSBmZCA9IHNoZWxsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlmaW5hbCBGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIDYwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCA2NDAsIDQ4MCk7Ci0JCWZpbmFsIFJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbE92YWwocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsJCQkJCi0JCQkJVHJhbnNmb3JtIHRyID0gbmV3IFRyYW5zZm9ybShkaXNwbGF5KTsKLQkJCQl0ci50cmFuc2xhdGUoNTAsIDEyMCk7Ci0JCQkJdHIucm90YXRlKC0zMCk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMCwgMCwgcmVjdC53aWR0aCAvIDIsIHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQkJZ2Muc2V0QWxwaGEoMTAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHIpOwotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQkJCXBhdGguYWRkU3RyaW5nKCJTV1QiLCAwLCAwLCBmb250KTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCQkJdHIuZGlzcG9zZSgpOwotCQkJCXBhdGguZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShyZWN0LndpZHRoIC8gMiwgcmVjdC5oZWlnaHQgLyAyKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZmODBhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGb250IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGFyZ2UgZm9udCBmb3IgdXNlIGJ5IGEgdGV4dCB3aWRnZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSk7Ci0JdGV4dC5zZXRCb3VuZHMoMTAsIDEwLCAxNTAsIDE1MCk7Ci0JRm9udCBpbml0aWFsRm9udCA9IHRleHQuZ2V0Rm9udCgpOwotCUZvbnREYXRhW10gZm9udERhdGEgPSBpbml0aWFsRm9udC5nZXRGb250RGF0YSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHsKLQkJZm9udERhdGFbaV0uc2V0SGVpZ2h0KDI0KTsKLQl9Ci0JRm9udCBuZXdGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGEpOwotCXRleHQuc2V0Rm9udChuZXdGb250KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQluZXdGb250LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwZTk3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0YWJsZSBpdGVtIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUsIDEpOwotCWl0ZW0uc2V0VGV4dCAoIioqKiBOZXcgSXRlbSAiICsgdGFibGUuaW5kZXhPZiAoaXRlbSkgKyAiICoqKiIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwNTZiNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGluc2VydCBhIHRyZWUgaXRlbSAoYXQgYW4gaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUsIDEpOwotCVRyZWVJdGVtIFtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcyAoKTsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlIChpbmRleCA8IGl0ZW1zLmxlbmd0aCAmJiBpdGVtcyBbaW5kZXhdICE9IGl0ZW0pIGluZGV4Kys7Ci0JaXRlbS5zZXRUZXh0ICgiKioqIE5ldyBJdGVtICIgKyBpbmRleCArICIgKioqIik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyOGM0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgdGFibGUgaXRlbSB0ZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAzIHsKLQotc3RhdGljIGNoYXIgY29udGVudCA9ICdhJzsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjQwKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCXRhYmxlLnNldEJvdW5kcygxMCwgMTAsIDE2MCwgMTYwKTsKLQotCWZpbmFsIFRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVs0XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKS5zZXRXaWR0aCg0MCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCX0KLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldEJvdW5kcygxMCwgMTgwLCA1MCwgMzApOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGFuZ2UiKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBwb3B1bGF0ZUl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQlTdHJpbmcgc3RyaW5nQ29udGVudCA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQpOwotCWl0ZW0uc2V0VGV4dCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQgfSk7Ci0JY29udGVudCsrOwotCWlmIChjb250ZW50ID4gJ3onKSBjb250ZW50ID0gJ2EnOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZWFkOGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNwbGFzaCBzY3JlZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgaW50IFtdIGNvdW50ID0gbmV3IGludCBbXSB7NH07Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzAwLCAzMDApOwotCWZpbmFsIFNoZWxsIHNwbGFzaCA9IG5ldyBTaGVsbChTV1QuT05fVE9QKTsKLQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JYmFyLnNldE1heGltdW0oY291bnRbMF0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNwbGFzaCwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0Jc3BsYXNoLnNldExheW91dChsYXlvdXQpOwotCUZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JRm9ybURhdGEgcHJvZ3Jlc3NEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCXByb2dyZXNzRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCA1KTsKLQlwcm9ncmVzc0RhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCXByb2dyZXNzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCWJhci5zZXRMYXlvdXREYXRhKHByb2dyZXNzRGF0YSk7Ci0Jc3BsYXNoLnBhY2soKTsKLQlSZWN0YW5nbGUgc3BsYXNoUmVjdCA9IHNwbGFzaC5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCWludCB4ID0gKGRpc3BsYXlSZWN0LndpZHRoIC0gc3BsYXNoUmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gKGRpc3BsYXlSZWN0LmhlaWdodCAtIHNwbGFzaFJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc3BsYXNoLnNldExvY2F0aW9uKHgsIHkpOwotCXNwbGFzaC5vcGVuKCk7Ci0JZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGxbY291bnRbMF1dOwotCQkJZm9yIChpbnQgaT0wOyBpPGNvdW50WzBdOyBpKyspIHsKLQkJCQlzaGVsbHMgW2ldID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxscyBbaV0uc2V0U2l6ZSAoMzAwLCAzMDApOwotCQkJCXNoZWxscyBbaV0uYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCQktLWNvdW50WzBdOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbihpKzEpOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDEwMDApO30gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQotCQkJfQotCQkJc3BsYXNoLmNsb3NlKCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0ub3BlbigpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jd2hpbGUgKGNvdW50IFswXSAhPSAwKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2QzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgYW4gZXh0ZXJuYWwgYmF0Y2ggZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVByb2dyYW0ubGF1bmNoKCJjOlxcY3lnd2luXFxjeWd3aW4uYmF0Iik7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzNhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgY29sdW1uIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmaW5hbCBUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucyAoKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgajxjb2x1bW5zLmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQgKGosICJJdGVtICIgKyBpKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGk8Y29sdW1ucy5sZW5ndGg7IGkrKykgY29sdW1ucyBbaV0ucGFjayAoKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlmaW5hbCBpbnQgaW5kZXggPSAxOwotCWJ1dHRvbi5zZXRUZXh0ICgiSW5zZXJ0IENvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoaW5kZXgsICJJdGVtICIgKyBpICsgImEiKTsKLQkJCX0KLQkJCWNvbHVtbi5wYWNrICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMzY5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc3BsaXR0ZXIgKHdpdGggYSAyMCBwaXhlbCBsaW1pdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0ICgiQnV0dG9uIDIiKTsKLQkKLQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlzaGVsbC5zZXRMYXlvdXQgKGZvcm0pOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24xRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQotCWZpbmFsIGludCBsaW1pdCA9IDIwLCBwZXJjZW50ID0gNTA7Ci0JZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0Jc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAocGVyY2VudCwgMCk7Ci0Jc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0Jc2FzaC5zZXRMYXlvdXREYXRhIChzYXNoRGF0YSk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIHNoZWxsUmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgcmlnaHQgPSBzaGVsbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIGxpbWl0OwotCQkJZS54ID0gTWF0aC5tYXggKE1hdGgubWluIChlLngsIHJpZ2h0KSwgbGltaXQpOwotCQkJaWYgKGUueCAhPSBzYXNoUmVjdC54KSAgewotCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIGUueCk7Ci0JCQkJc2hlbGwubGF5b3V0ICgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoc2FzaCwgMCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMkRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTJiYzMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXR0b24gZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiRW50ZXIgeW91ciBuYW1lOiIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoMTAwLCBTV1QuREVGQVVMVCkpOwotCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jb2suc2V0VGV4dCAoIk9rIik7Ci0JQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JY2FuY2VsLnNldFRleHQgKCJDYW5jZWwiKTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uIChjYW5jZWwpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjI1YmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTYXNoRm9ybSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNhc2ggZm9ybSB3aXRoIHRocmVlIGNoaWxkcmVuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JU2FzaEZvcm0gZm9ybSA9IG5ldyBTYXNoRm9ybShzaGVsbCxTV1QuSE9SSVpPTlRBTCk7Ci0JZm9ybS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JQ29tcG9zaXRlIGNoaWxkMSA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQxLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoY2hpbGQxLFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBpbiBwYW5lIDEiKTsKLQkKLQlDb21wb3NpdGUgY2hpbGQyID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBCdXR0b24oY2hpbGQyLFNXVC5QVVNIKS5zZXRUZXh0KCJCdXR0b24gaW4gcGFuZTIiKTsKLQotCUNvbXBvc2l0ZSBjaGlsZDMgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMy5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IExhYmVsKGNoaWxkMyxTV1QuUFVTSCkuc2V0VGV4dCgiTGFiZWwgaW4gcGFuZTMiKTsKLQkKLQlmb3JtLnNldFdlaWdodHMobmV3IGludFtdIHszMCw0MCwzMH0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmMwMDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHNlbGVjdGlvbiAoaS1iZWFtKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dC5zZXRCb3VuZHMgKDEwLCAxMCwgMTAwLCAxMDApOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kICgiTGluZSAiICsgaSArICJcbiIpOwotCX0KLQlzaGVsbC5vcGVuICgpOwotCXRleHQuc2V0U2VsZWN0aW9uICgzMCk7Ci0JU3lzdGVtLm91dC5wcmludGxuICh0ZXh0LmdldENhcmV0TG9jYXRpb24gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZGEwYzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZmluZCBhIHRhYmxlIGNlbGwgZnJvbSBtb3VzZSBkb3duICh3b3JrcyBmb3IgYW55IHRhYmxlIHN0eWxlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZmluYWwgaW50IHJvd0NvdW50ID0gNjQsIGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmb3IgKGludCBpPTA7IGkgPCByb3dDb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaj0wOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0IChqLCAiSXRlbSAiICsgaSArICItIiArIGopOwotCQl9Ci0JfQotCWZvciAoaW50IGk9MDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uIChpKS5wYWNrICgpOwotCX0KLQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCAyMDApOwotCXRhYmxlLnNldFNpemUgKHNpemUpOwotCXNoZWxsLnBhY2sgKCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0VG9wSW5kZXggKCk7Ci0JCQl3aGlsZSAoaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGluZGV4KTsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKGkpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJdGVtICIgKyBpbmRleCArICItIiArIGkpOwotCQkJCQl9Ci0JCQkJCWlmICghdmlzaWJsZSAmJiByZWN0LmludGVyc2VjdHMgKGNsaWVudEFyZWEpKSB7Ci0JCQkJCQl2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZpc2libGUpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2U1OTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogZWRpdCB0aGUgdGV4dCBvZiBhIHRyZWUgaXRlbSAoaW4gcGxhY2UsIGZhbmN5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTExIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW1JID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW1JLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDE2OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW1KID0gbmV3IFRyZWVJdGVtIChpdGVtSSwgU1dULk5PTkUpOwotCQkJaXRlbUouc2V0VGV4dCAoIkl0ZW0gIiArIGopOwotCQl9Ci0JfQotCWZpbmFsIFRyZWVJdGVtIFtdIGxhc3RJdGVtID0gbmV3IFRyZWVJdGVtIFsxXTsKLQlmaW5hbCBUcmVlRWRpdG9yIGVkaXRvciA9IG5ldyBUcmVlRWRpdG9yICh0cmVlKTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0gPT0gbGFzdEl0ZW0gWzBdKSB7Ci0JCQkJYm9vbGVhbiBpc0NhcmJvbiA9IFNXVC5nZXRQbGF0Zm9ybSAoKS5lcXVhbHMgKCJjYXJib24iKTsKLQkJCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAodHJlZSwgU1dULk5PTkUpOwotCQkJCWlmICghaXNDYXJib24pIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kIChibGFjayk7Ci0JCQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWZpbmFsIGludCBpbnNldCA9IGlzQ2FyYm9uID8gMCA6IDE7Ci0JCQkJY29tcG9zaXRlLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQkJCXRleHQuc2V0Qm91bmRzIChyZWN0LnggKyBpbnNldCwgcmVjdC55ICsgaW5zZXQsIHJlY3Qud2lkdGggLSBpbnNldCAqIDIsIHJlY3QuaGVpZ2h0IC0gaW5zZXQgKiAyKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCUxpc3RlbmVyIHRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChmaW5hbCBFdmVudCBlKSB7Ci0JCQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQkJCWNhc2UgU1dULkZvY3VzT3V0OgotCQkJCQkJCQlpdGVtLnNldFRleHQgKHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCWNvbXBvc2l0ZS5kaXNwb3NlICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFNXVC5WZXJpZnk6Ci0JCQkJCQkJCVN0cmluZyBuZXdUZXh0ID0gdGV4dC5nZXRUZXh0ICgpOwotCQkJCQkJCQlTdHJpbmcgbGVmdFRleHQgPSBuZXdUZXh0LnN1YnN0cmluZyAoMCwgZS5zdGFydCk7Ci0JCQkJCQkJCVN0cmluZyByaWdodFRleHQgPSBuZXdUZXh0LnN1YnN0cmluZyAoZS5lbmQsIG5ld1RleHQubGVuZ3RoICgpKTsKLQkJCQkJCQkJR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCQkJCQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudCAobGVmdFRleHQgKyBlLnRleHQgKyByaWdodFRleHQpOwotCQkJCQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZSAoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJCQkJCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJCQkJCVJlY3RhbmdsZSBpdGVtUmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpLCByZWN0ID0gdHJlZS5nZXRDbGllbnRBcmVhICgpOwotCQkJCQkJCQllZGl0b3IubWluaW11bVdpZHRoID0gTWF0aC5tYXggKHNpemUueCwgaXRlbVJlY3Qud2lkdGgpICsgaW5zZXQgKiAyOwotCQkJCQkJCQlpbnQgbGVmdCA9IGl0ZW1SZWN0LngsIHJpZ2h0ID0gcmVjdC54ICsgcmVjdC53aWR0aDsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IE1hdGgubWluIChlZGl0b3IubWluaW11bVdpZHRoLCByaWdodCAtIGxlZnQpOwotCQkJCQkJCQllZGl0b3IubWluaW11bUhlaWdodCA9IHNpemUueSArIGluc2V0ICogMjsKLQkJCQkJCQkJZWRpdG9yLmxheW91dCAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVHJhdmVyc2U6Ci0JCQkJCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCQkJCQlpdGVtLnNldFRleHQgKHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCQkJCQljb21wb3NpdGUuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCB0ZXh0TGlzdGVuZXIpOwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgdGV4dExpc3RlbmVyKTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVmVyaWZ5LCB0ZXh0TGlzdGVuZXIpOwotCQkJCWVkaXRvci5zZXRFZGl0b3IgKGNvbXBvc2l0ZSwgaXRlbSk7Ci0JCQkJdGV4dC5zZXRUZXh0IChpdGVtLmdldFRleHQgKCkpOwotCQkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJCXRleHQuc2V0Rm9jdXMgKCk7Ci0JCQl9Ci0JCQlsYXN0SXRlbSBbMF0gPSBpdGVtOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZTM5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogSW1hZ2UgZXhhbXBsZSBzbmlwcGV0OiBkaXNwbGF5IGFuIGltYWdlIGluIGEgZ3JvdXAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCWNvbG9yLmRpc3Bvc2UgKCk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZ3JvdXAuc2V0VGV4dCAoImEgc3F1YXJlIik7Ci0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKGdyb3VwLCBTV1QuTk9ORSk7Ci0JY2FudmFzLmFkZFBhaW50TGlzdGVuZXIgKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sIChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2MuZHJhd0ltYWdlIChpbWFnZSwgMCwgMCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkKLQkJCWRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JhMzRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgYSBzZWxlY3Rpb24gb3IgY2hlY2sgZXZlbnQgaW4gYSB0YWJsZSAoU1dULkNIRUNLKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldFNpemUgKDEwMCwgMTAwKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZXZlbnQuZGV0YWlsID09IFNXVC5DSEVDSyA/ICJDaGVja2VkIiA6ICJTZWxlY3RlZCI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGV2ZW50Lml0ZW0gKyAiICIgKyBzdHJpbmcpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWM2ZmM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBhIHNlbGVjdGlvbiBvciBjaGVjayBldmVudCBpbiBhIHRyZWUgKFNXVC5DSEVDSykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQ0hFQ0sgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0cmVlLnNldFNpemUgKDEwMCwgMTAwKTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLID8gIkNoZWNrZWQiIDogIlNlbGVjdGVkIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZXZlbnQuaXRlbSArICIgIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDIyNDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IGZvcmNlIHJhZGlvIGJlaGF2aW9yIG9uIHR3byBkaWZmZXJlbnQgY29tcG9zaXRlcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5OT19SQURJT19HUk9VUCk7Ci0JYzEuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5OT19SQURJT19HUk9VUCk7Ci0JYzIuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlmaW5hbCBDb21wb3NpdGUgW10gY29tcG9zaXRlcyA9IG5ldyBDb21wb3NpdGUgW10ge2MxLCBjMn07Ci0JTGlzdGVuZXIgcmFkaW9Hcm91cCA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaT0wOyBpPGNvbXBvc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY29tcG9zaXRlcyBbaV07Ci0JCQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJCQlmb3IgKGludCBqPTA7IGo8Y2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtqXTsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgY2hpbGQ7Ci0JCQkJCQlpZiAoKGJ1dHRvbi5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCkgYnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQl9Ci0JfTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIHJhZGlvR3JvdXApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjMiwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIChpICsgNCkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIHJhZGlvR3JvdXApOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzk1ZWY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc3RvcCBDUiBmcm9tIGdvaW5nIHRvIHRoZSBkZWZhdWx0IGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE2ICB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCXRleHQuc2V0VGV4dCgiSGVyZSBpcyBzb21lIHRleHQiKTsKLQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IGRlZmF1bHQgc2VsZWN0ZWQgKG92ZXJyaWRlcyBkZWZhdWx0IGJ1dHRvbikiKTsKLQkJfQotCX0pOwotCXRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQllLmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiT2siKTsKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnV0dG9uIHNlbGVjdGVkIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM4ZmMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogYWRkIGEgc2VsZWN0IGFsbCBtZW51IGl0ZW0gdG8gdGhlIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE3ICB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotICAgIAotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCU1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQllZGl0SXRlbS5zZXRUZXh0ICgiRWRpdCIpOwotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JZWRpdEl0ZW0uc2V0TWVudSAoc3VibWVudSk7Ci0KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9KTsKLQlpdGVtLnNldFRleHQgKCJTZWxlY3QgJkFsbFx0Q3RybCtBIik7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvciAoU1dULkNUUkwgKyAnQScpOwotCQotCS8vIE5vdGUgdGhhdCBhcyBsb25nIGFzIHlvdXIgYXBwbGljYXRpb24gaGFzIG5vdCBvdmVycmlkZGVuIAotCS8vIHRoZSBnbG9iYWwgYWNjZWxlcmF0b3JzIGZvciBjb3B5LCBwYXN0ZSwgYW5kIGN1dCAKLQkvLyhDVFJMK0Mgb3IgQ1RSTCtJTlNFUlQsIENUUkwrViBvciBTSElGVCtJTlNFUlQsIGFuZCBDVFJMK1ggb3IgU0hJRlQrREVMRVRFKQotCS8vIHRoZXNlIGJlaGF2aW91cnMgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGJ5IGRlZmF1bHQuCi0JLy8gSWYgeW91ciBhcHBsaWNhdGlvbiBvdmVycmlkZXMgdGhlc2UgYWNjZWxlcmF0b3JzLAotCS8vIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBUZXh0LmNvcHkoKSwgVGV4dC5wYXN0ZSgpIGFuZCBUZXh0LmN1dCgpCi0JLy8gZnJvbSB0aGUgU2VsZWN0aW9uIGNhbGxiYWNrIGZvciB0aGUgYWNjZWxlcmF0b3Igd2hlbiB0aGUgCi0JLy8gdGV4dCB3aWRnZXQgaGFzIGZvY3VzLgotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUwYzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb2xvciBjdXJzb3IgZnJvbSBhbiBpbWFnZSBmaWxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCWZpbmFsIEN1cnNvcltdIGN1cnNvciA9IG5ldyBDdXJzb3JbMV07Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQ2hhbmdlIGN1cnNvciIpOwotCVBvaW50IHNpemUgPSBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlidXR0b24uc2V0U2l6ZShzaXplKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsKTsKLQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouaWNvIiwgIiouZ2lmIiwgIiouKiJ9KTsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChuYW1lID09IG51bGwpIHJldHVybjsKLQkJCUltYWdlRGF0YSBpbWFnZSA9IG5ldyBJbWFnZURhdGEobmFtZSk7Ci0JCQlDdXJzb3Igb2xkQ3Vyc29yID0gY3Vyc29yWzBdOwotCQkJY3Vyc29yWzBdID0gbmV3IEN1cnNvcihkaXNwbGF5LCBpbWFnZSwgMCwgMCk7Ci0JCQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yWzBdKTsKLQkJCWlmIChvbGRDdXJzb3IgIT0gbnVsbCkgb2xkQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChjdXJzb3JbMF0gIT0gbnVsbCkgY3Vyc29yWzBdLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNzkzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb2xvciBjdXJzb3IgZnJvbSBhIHNvdXJjZSBhbmQgYSBtYXNrCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE5IHsKLQotc3RhdGljIGJ5dGVbXSBzcmNEYXRhID0gewotCShieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwgCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDAyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMwLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MjIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzMsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMywgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLAotCShieXRlKTB4MDEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTAsCi0JKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwKLQkoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLAotCShieXRlKTB4MTAsIChieXRlKTB4NDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTUsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDUwLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4MDAsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLAotfTsKLQotc3RhdGljIGJ5dGVbXSBtc2tEYXRhID0gewotCShieXRlKTB4MDMsIChieXRlKTB4YzAsIAotCShieXRlKTB4MWYsIChieXRlKTB4ZjgsCi0JKGJ5dGUpMHgzZiwgKGJ5dGUpMHhmYywKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweGZmLCAoYnl0ZSkweGZmLAotCShieXRlKTB4ZmUsIChieXRlKTB4N2YsCi0JKGJ5dGUpMHhmZSwgKGJ5dGUpMHg3ZiwKLQkoYnl0ZSkweGZmLCAoYnl0ZSkweGZmLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4M2YsIChieXRlKTB4ZmMsCi0JKGJ5dGUpMHgxZiwgKGJ5dGUpMHhmOCwKLQkoYnl0ZSkweDAzLCAoYnl0ZSkweGMwCi19OwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JQ29sb3IgeWVsbG93ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVyk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgZ3JlZW4gPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfR1JFRU4pOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy9DcmVhdGUgYSBzb3VyY2UgSW1hZ2VEYXRhIG9mIGRlcHRoIDQKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCW10gewotCQlibGFjay5nZXRSR0IoKSwgd2hpdGUuZ2V0UkdCKCksIHllbGxvdy5nZXRSR0IoKSwgCi0JCXJlZC5nZXRSR0IoKSwgYmx1ZS5nZXRSR0IoKSwgZ3JlZW4uZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDE2LCAxNiwgNCwgcGFsZXR0ZSwgMSwgc3JjRGF0YSk7Ci0JCi0JLy9DcmVhdGUgYSBtYXNrIEltYWdlRGF0YSBvZiBkZXB0aCAxIChtb25vY2hyb21lKQotCXBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge2JsYWNrLmdldFJHQigpLCB3aGl0ZS5nZXRSR0IoKSx9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgxNiwgMTYsIDEsIHBhbGV0dGUsIDEsIG1za0RhdGEpOwotCi0JLy9TZXQgbWFzawotCXNvdXJjZURhdGEubWFza0RhdGEgPSBtYXNrRGF0YS5kYXRhOwotCXNvdXJjZURhdGEubWFza1BhZCA9IG1hc2tEYXRhLnNjYW5saW5lUGFkOwotCi0JLy9DcmVhdGUgY3Vyc29yCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgc291cmNlRGF0YSwgMTAsIDEwKTsKLQotCS8vUmVtb3ZlIG1hc2sgdG8gZHJhdyB0aGVtIHNlcGFyYXRlbHkganVzdCB0byBzaG93IHdoYXQgdGhleSBsb29rIGxpa2UKLQlzb3VyY2VEYXRhLm1hc2tEYXRhID0gbnVsbDsKLQlzb3VyY2VEYXRhLm1hc2tQYWQgPSAtMTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEltYWdlIHNvdXJjZSA9IG5ldyBJbWFnZSAoZGlzcGxheSxzb3VyY2VEYXRhKTsKLQlmaW5hbCBJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJaW50IHggPSAxMCwgeSA9IDEwOwotCQkJU3RyaW5nIHN0cmluZ1NvdXJjZSA9ICJzb3VyY2U6ICI7Ci0JCQlTdHJpbmcgc3RyaW5nTWFzayA9ICJtYXNrOiAiOwotCQkJZ2MuZHJhd1N0cmluZyhzdHJpbmdTb3VyY2UsIHgsIHkpOwotCQkJZ2MuZHJhd1N0cmluZyhzdHJpbmdNYXNrLCB4LCB5ICsgMzApOwotCQkJeCArPSBNYXRoLm1heChnYy5zdHJpbmdFeHRlbnQoc3RyaW5nU291cmNlKS54LCBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nTWFzaykueCk7Ci0JCQlnYy5kcmF3SW1hZ2Uoc291cmNlLCB4LCB5KTsKLQkJCWdjLmRyYXdJbWFnZShtYXNrLCB4LCB5ICsgMzApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgxNTAsIDE1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXNoZWxsLnNldEN1cnNvcihjdXJzb3IpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlzb3VyY2UuZGlzcG9zZSgpOwotCW1hc2suZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0MWZhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChzdGFydCwgZW5kKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dC5zZXRCb3VuZHMgKDEwLCAxMCwgMTAwLCAxMDApOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kICgiTGluZSAiICsgaSArICJcbiIpOwotCX0KLQlzaGVsbC5vcGVuICgpOwotCXRleHQuc2V0U2VsZWN0aW9uICgzMCwgMzgpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAodGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1vbml0b3IgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBzaGVsbCBvbiB0aGUgcHJpbWFyeSBtb25pdG9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCU1vbml0b3IgcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IgKCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzICgpOwotCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Qm91bmRzICgpOwotCWludCB4ID0gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC0gcmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc2hlbGwuc2V0TG9jYXRpb24gKHgsIHkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTZhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgcGFzc3dvcmQgKHNldCB0aGUgZWNobyBjaGFyYWN0ZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldEVjaG9DaGFyICgnKicpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmYmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUvZGlzYWJsZSBtZW51IGRlcGVuZGluZyBvbiBjbGlwYm9hcmQgY29udGVudCBhdmFpbGFiaWxpdHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWNvcHlJdGVtLnNldFRleHQoIkNvcHkiKTsKLQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W117c2VsZWN0aW9ufTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCQkJY2Iuc2V0Q29udGVudHMoZGF0YSwgdHlwZXMpOwotCQl9Ci0JfSk7Ci0JZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlwYXN0ZUl0ZW0uc2V0VGV4dCAoIlBhc3RlIik7Ci0JcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKShjYi5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCQkJaWYgKHN0cmluZyAhPSBudWxsKSB0ZXh0Lmluc2VydChzdHJpbmcpOwotCQl9Ci0JfSk7Ci0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCS8vIGlzIGNvcHkgdmFsaWQ/Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbi5sZW5ndGgoKSA+IDApOwotCQkJLy8gaXMgcGFzdGUgdmFsaWQ/Ci0JCQlUcmFuc2ZlckRhdGFbXSBhdmFpbGFibGUgPSBjYi5nZXRBdmFpbGFibGVUeXBlcygpOwotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYXZhaWxhYmxlW2ldKSkgewotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9KTsKLQl0ZXh0LnNldE1lbnUgKG1lbnUpOwotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY2ZGY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGdldCBldmVudHMgZnJvbSBJRSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTIzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCXRyeSB7Ci0JCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCXJldHVybjsKLQl9Ci0Jc2hlbGwub3BlbigpOwotCQotCS8vIElXZWJCcm93c2VyCi0JZmluYWwgT2xlQXV0b21hdGlvbiB3ZWJCcm93c2VyID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCi0JLy8gV2hlbiBhIG5ldyBkb2N1bWVudCBpcyBsb2FkZWQsIGFjY2VzcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZvciB0aGUgbmV3IHBhZ2UuCi0JaW50IERvd25sb2FkQ29tcGxldGUgPSAxMDQ7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihEb3dubG9hZENvbXBsZXRlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQlpbnRbXSBodG1sRG9jdW1lbnRJRCA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkRvY3VtZW50In0pOyAKLQkJCWlmIChodG1sRG9jdW1lbnRJRCA9PSBudWxsKSByZXR1cm47Ci0JCQlWYXJpYW50IHBWYXJSZXN1bHQgPSB3ZWJCcm93c2VyLmdldFByb3BlcnR5KGh0bWxEb2N1bWVudElEWzBdKTsKLQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJLy9JSFRNTERvY3VtZW50MgotCQkJT2xlQXV0b21hdGlvbiBodG1sRG9jdW1lbnQgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQotCQkJLy8gUmVxdWVzdCB0byBiZSBub3RpZmllZCBvZiBjbGljaywgZG91YmxlIGNsaWNrIGFuZCBrZXkgZG93biBldmVudHMKLQkJCUV2ZW50RGlzcGF0Y2ggbXlEaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoKEV2ZW50RGlzcGF0Y2gub25jbGljayk7Ci0JCQlJRGlzcGF0Y2ggaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlWYXJpYW50IGRpc3BhdGNoID0gbmV3IFZhcmlhbnQoaWRpc3BhdGNoKTsKLQkJCWh0bWxEb2N1bWVudC5zZXRQcm9wZXJ0eShFdmVudERpc3BhdGNoLm9uY2xpY2ssIGRpc3BhdGNoKTsKLQotCQkJbXlEaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoKEV2ZW50RGlzcGF0Y2gub25kYmxjbGljayk7Ci0JCQlpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCWRpc3BhdGNoID0gbmV3IFZhcmlhbnQoaWRpc3BhdGNoKTsKLQkJCWh0bWxEb2N1bWVudC5zZXRQcm9wZXJ0eShFdmVudERpc3BhdGNoLm9uZGJsY2xpY2ssIGRpc3BhdGNoKTsKLQotCQkJbXlEaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoKEV2ZW50RGlzcGF0Y2gub25rZXlkb3duKTsKLQkJCWlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25rZXlkb3duLCBkaXNwYXRjaCk7Ci0JCQkKLQkJCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCQkJaHRtbERvY3VtZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCQotCS8vIE5hdmlnYXRlIHRvIGEgd2ViIHNpdGUKLQlpbnRbXSBpZHMgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudCgiaHR0cDovL3d3dy5nb29nbGUuY29tIil9OwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFtde2lkc1sxXX07Ci0Jd2ViQnJvd3Nlci5pbnZva2UoaWRzWzBdLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQkJCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkvL1JlbWVtYmVyIHRvIHJlbGVhc2UgT2xlQXV0b21hdGlvbiBPYmplY3QKLQl3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkKLX0KLX0KLS8vIEV2ZW50RGlzcGF0Y2ggaW1wbGVtZW50cyBhIHNpbXBsZSBJRGlzcGF0Y2ggaW50ZXJmYWNlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIAotLy8gd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuCi1jbGFzcyBFdmVudERpc3BhdGNoIHsKLQlwcml2YXRlIENPTU9iamVjdCBpRGlzcGF0Y2g7Ci0JcHJpdmF0ZSBpbnQgcmVmQ291bnQgPSAwOwotCXByaXZhdGUgaW50IGV2ZW50SUQ7Ci0JCi0JZmluYWwgc3RhdGljIGludCBvbmhlbHAgPSAweDgwMDExNzdkOwotCWZpbmFsIHN0YXRpYyBpbnQgb25jbGljayA9IDB4ODAwMTE3Nzg7Ci0JZmluYWwgc3RhdGljIGludCBvbmRibGNsaWNrID0gMHg4MDAxMTc3OTsKLQlmaW5hbCBzdGF0aWMgaW50IG9ua2V5dXAgPSAweDgwMDExNzc2OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXlkb3duID0gMHg4MDAxMTc3NTsKLQlmaW5hbCBzdGF0aWMgaW50IG9ua2V5cHJlc3MgPSAweDgwMDExNzc3OwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZXVwID0gMHg4MDAxMTc3MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2Vkb3duID0gMHg4MDAxMTc3MjsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2Vtb3ZlID0gMHg4MDAxMTc3NDsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2VvdXQgPSAweDgwMDExNzcxOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW92ZXIgPSAweDgwMDExNzcwOwotCWZpbmFsIHN0YXRpYyBpbnQgb25yZWFkeXN0YXRlY2hhbmdlID0gMHg4MDAxMTc4OTsKLQlmaW5hbCBzdGF0aWMgaW50IG9uYWZ0ZXJ1cGRhdGUgPSAweDgwMDExNzg2OwotCWZpbmFsIHN0YXRpYyBpbnQgb25yb3dleGl0PSAweDgwMDExNzgyOwotCWZpbmFsIHN0YXRpYyBpbnQgb25yb3dlbnRlciA9IDB4ODAwMTE3ODM7Ci0JZmluYWwgc3RhdGljIGludCBvbmRyYWdzdGFydCA9IDB4ODAwMTE3OTM7Ci0JZmluYWwgc3RhdGljIGludCBvbnNlbGVjdHN0YXJ0ID0gMHg4MDAxMTc5NTsKLQotCUV2ZW50RGlzcGF0Y2goaW50IGV2ZW50SUQpIHsKLQkJdGhpcy5ldmVudElEID0gZXZlbnRJRDsKLQkJY3JlYXRlQ09NSW50ZXJmYWNlcygpOwotCX0KLQlpbnQgZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIGlEaXNwYXRjaC5nZXRBZGRyZXNzKCk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVDT01JbnRlcmZhY2VzKCkgewotCQlpRGlzcGF0Y2ggPSBuZXcgQ09NT2JqZWN0KG5ldyBpbnRbXXsyLCAwLCAwLCAxLCAzLCA0LCA4fSl7Ci0JCQlwdWJsaWMgaW50IG1ldGhvZDAoaW50W10gYXJncykge3JldHVybiBRdWVyeUludGVyZmFjZShhcmdzWzBdLCBhcmdzWzFdKTt9Ci0JCQlwdWJsaWMgaW50IG1ldGhvZDEoaW50W10gYXJncykge3JldHVybiBBZGRSZWYoKTt9Ci0JCQlwdWJsaWMgaW50IG1ldGhvZDIoaW50W10gYXJncykge3JldHVybiBSZWxlYXNlKCk7fQotCQkJLy8gbWV0aG9kMyBHZXRUeXBlSW5mb0NvdW50IC0gbm90IGltcGxlbWVudGVkCi0JCQkvLyBtZXRob2Q0IEdldFR5cGVJbmZvIC0gbm90IGltcGxlbWVudGVkCi0JCQkvLyBtZXRob2Q1IEdldElEc09mTmFtZXMgLSBub3QgaW1wbGVtZW50ZWQKLQkJCXB1YmxpYyBpbnQgbWV0aG9kNihpbnRbXSBhcmdzKSB7cmV0dXJuIEludm9rZShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdLCBhcmdzWzddKTt9Ci0JCX07Ci0JfQotCXByaXZhdGUgdm9pZCBkaXNwb3NlQ09NSW50ZXJmYWNlcygpIHsKLQkJaWYgKGlEaXNwYXRjaCAhPSBudWxsKQotCQkJaURpc3BhdGNoLmRpc3Bvc2UoKTsKLQkJaURpc3BhdGNoID0gbnVsbDsKLQkJCi0JfQotCXByaXZhdGUgaW50IEFkZFJlZigpIHsKLQkJcmVmQ291bnQrKzsKLQkJcmV0dXJuIHJlZkNvdW50OwotCX0KLQlwcml2YXRlIGludCBJbnZva2UoaW50IGRpc3BJZE1lbWJlciwgaW50IHJpaWQsIGludCBsY2lkLCBpbnQgZHdGbGFncywgaW50IHBEaXNwUGFyYW1zLCBpbnQgcFZhclJlc3VsdCwgaW50IHBFeGNlcEluZm8sIGludCBwQXJnRXJyKQl7Ci0JCXN3aXRjaCAoZXZlbnRJRCkgewotCQkJY2FzZSBvbmhlbHA6IFN5c3RlbS5vdXQucHJpbnRsbigib25oZWxwIik7IGJyZWFrOwotCQkJY2FzZSBvbmNsaWNrOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uY2xpY2siKTsgYnJlYWs7Ci0JCQljYXNlIG9uZGJsY2xpY2s6IFN5c3RlbS5vdXQucHJpbnRsbigib25kYmxjbGljayIpOyBicmVhazsKLQkJCWNhc2Ugb25rZXl1cDogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleXVwIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleWRvd246IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXlkb3duIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleXByZXNzOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5cHJlc3MiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2V1cDogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNldXAiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2Vkb3duOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2Vkb3duIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlbW92ZTogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlbW92ZSIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZW91dDogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlb3V0Iik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlb3ZlcjogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlb3ZlciIpOyBicmVhazsKLQkJCWNhc2Ugb25yZWFkeXN0YXRlY2hhbmdlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ucmVhZHlzdGF0ZWNoYW5nZSIpOyBicmVhazsKLQkJCWNhc2Ugb25hZnRlcnVwZGF0ZTogU3lzdGVtLm91dC5wcmludGxuKCJvbmFmdGVydXBkYXRlIik7IGJyZWFrOwotCQkJY2FzZSBvbnJvd2V4aXQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25yb3dleGl0Iik7IGJyZWFrOwotCQkJY2FzZSBvbnJvd2VudGVyOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ucm93ZW50ZXIiKTsgYnJlYWs7Ci0JCQljYXNlIG9uZHJhZ3N0YXJ0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uZHJhZ3N0YXJ0Iik7IGJyZWFrOwotCQkJY2FzZSBvbnNlbGVjdHN0YXJ0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uc2VsZWN0c3RhcnQiKTsgYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIENPTS5TX09LOwotCX0KLQlwcml2YXRlIGludCBRdWVyeUludGVyZmFjZShpbnQgcmlpZCwgaW50IHBwdk9iamVjdCkgewotCQlpZiAocmlpZCA9PSAwIHx8IHBwdk9iamVjdCA9PSAwKSByZXR1cm4gQ09NLkVfSU5WQUxJREFSRzsKLQkJR1VJRCBndWlkID0gbmV3IEdVSUQoKTsKLQkJQ09NLk1vdmVNZW1vcnkoZ3VpZCwgcmlpZCwgR1VJRC5zaXplb2YpOwotCQotCQlpZiAoIENPTS5Jc0VxdWFsR1VJRChndWlkLCBDT00uSUlESVVua25vd24pIHx8IENPTS5Jc0VxdWFsR1VJRChndWlkLCBDT00uSUlESURpc3BhdGNoKSkgewotCQkJQ09NLk1vdmVNZW1vcnkocHB2T2JqZWN0LCBuZXcgaW50W10ge2lEaXNwYXRjaC5nZXRBZGRyZXNzKCl9LCA0KTsKLQkJCUFkZFJlZigpOwotCQkJcmV0dXJuIENPTS5TX09LOwotCQl9Ci0JCUNPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludFtdIHswfSwgNCk7Ci0JCXJldHVybiBDT00uRV9OT0lOVEVSRkFDRTsKLQl9Ci0JaW50IFJlbGVhc2UoKSB7Ci0JCXJlZkNvdW50LS07Ci0JCWlmIChyZWZDb3VudCA9PSAwKSB7Ci0JCQlkaXNwb3NlQ09NSW50ZXJmYWNlcygpOwotCQl9Ci0JCXJldHVybiByZWZDb3VudDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMWZiZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgYSBjZWxsIGluIGEgdGFibGUgKGluIHBsYWNlLCBmYW5jeSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFdpZHRoKDEwMCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTwzOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZyBbXSB7IiIgKyBpLCAiIiArIGkgLCAiIiArIGl9KTsKLQl9Ci0JZmluYWwgVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmdldFRvcEluZGV4ICgpOwotCQkJd2hpbGUgKGluZGV4IDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQkJZmluYWwgVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoaSk7Ci0JCQkJCWlmIChyZWN0LmNvbnRhaW5zIChwdCkpIHsKLQkJCQkJCWZpbmFsIGludCBjb2x1bW4gPSBpOwotCQkJCQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCQlMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChmaW5hbCBFdmVudCBlKSB7Ci0JCQkJCQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJCQkJCQljYXNlIFNXVC5Gb2N1c091dDoKLQkJCQkJCQkJCQlpdGVtLnNldFRleHQgKGNvbHVtbiwgdGV4dC5nZXRUZXh0ICgpKTsKLQkJCQkJCQkJCQl0ZXh0LmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFNXVC5UcmF2ZXJzZToKLQkJCQkJCQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCQkJCQkJCWl0ZW0uc2V0VGV4dCAoY29sdW1uLCB0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQkJCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkJCQkJCQkJdGV4dC5kaXNwb3NlICgpOwotCQkJCQkJCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgdGV4dExpc3RlbmVyKTsKLQkJCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgdGV4dExpc3RlbmVyKTsKLQkJCQkJCWVkaXRvci5zZXRFZGl0b3IgKHRleHQsIGl0ZW0sIGkpOwotCQkJCQkJdGV4dC5zZXRUZXh0IChpdGVtLmdldFRleHQgKGkpKTsKLQkJCQkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJCQkJdGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzIChjbGllbnRBcmVhKSkgewotCQkJCQkJdmlzaWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2aXNpYmxlKSByZXR1cm47Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZmODdhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbCBUaXBzIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGZha2UgdG9vbCB0aXBzIGZvciBpdGVtcyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiaXRlbSAiICsgaSk7Ci0JfQotCS8vIERpc2FibGUgbmF0aXZlIHRvb2x0aXAKLQl0YWJsZS5zZXRUb29sVGlwVGV4dCAoIiIpOwotCQotCS8vIEltcGxlbWVudCBhICJmYWtlIiB0b29sdGlwCi0JZmluYWwgTGlzdGVuZXIgbGFiZWxMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpZXZlbnQud2lkZ2V0OwotCQkJU2hlbGwgc2hlbGwgPSBsYWJlbC5nZXRTaGVsbCAoKTsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCQkJZS5pdGVtID0gKFRhYmxlSXRlbSkgbGFiZWwuZ2V0RGF0YSAoIl9UQUJMRUlURU0iKTsKLQkJCQkJLy8gQXNzdW1pbmcgdGFibGUgaXMgc2luZ2xlIHNlbGVjdCwgc2V0IHRoZSBzZWxlY3Rpb24gYXMgaWYKLQkJCQkJLy8gdGhlIG1vdXNlIGRvd24gZXZlbnQgd2VudCB0aHJvdWdoIHRvIHRoZSB0YWJsZQotCQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24gKG5ldyBUYWJsZUl0ZW0gW10geyhUYWJsZUl0ZW0pIGUuaXRlbX0pOwotCQkJCQl0YWJsZS5ub3RpZnlMaXN0ZW5lcnMgKFNXVC5TZWxlY3Rpb24sIGUpOwotCQkJCQkvLyBmYWxsIHRocm91Z2gKLQkJCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQkJCXNoZWxsLmRpc3Bvc2UgKCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlMaXN0ZW5lciB0YWJsZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJU2hlbGwgdGlwID0gbnVsbDsKLQkJTGFiZWwgbGFiZWwgPSBudWxsOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJY2FzZSBTV1QuS2V5RG93bjoKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6IHsKLQkJCQkJaWYgKHRpcCA9PSBudWxsKSBicmVhazsKLQkJCQkJdGlwLmRpc3Bvc2UgKCk7Ci0JCQkJCXRpcCA9IG51bGw7Ci0JCQkJCWxhYmVsID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULk1vdXNlSG92ZXI6IHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQkJaWYgKHRpcCAhPSBudWxsICAmJiAhdGlwLmlzRGlzcG9zZWQgKCkpIHRpcC5kaXNwb3NlICgpOwotCQkJCQkJdGlwID0gbmV3IFNoZWxsIChzaGVsbCwgU1dULk9OX1RPUCB8IFNXVC5UT09MKTsKLQkJCQkJCXRpcC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJCQkJCWxhYmVsID0gbmV3IExhYmVsICh0aXAsIFNXVC5OT05FKTsKLQkJCQkJCWxhYmVsLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCQkJCWxhYmVsLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQkJCWxhYmVsLnNldERhdGEgKCJfVEFCTEVJVEVNIiwgaXRlbSk7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0ICgidG9vbHRpcCAiK2l0ZW0uZ2V0VGV4dCAoKSk7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlQb2ludCBzaXplID0gdGlwLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoMCk7Ci0JCQkJCQlQb2ludCBwdCA9IHRhYmxlLnRvRGlzcGxheSAocmVjdC54LCByZWN0LnkpOwotCQkJCQkJdGlwLnNldEJvdW5kcyAocHQueCwgcHQueSwgc2l6ZS54LCBzaXplLnkpOwotCQkJCQkJdGlwLnNldFZpc2libGUgKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgdGFibGVMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjY0ZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFyYml0cmFyeSBjb250cm9scyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjYgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFdpZHRoICgxMDApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQluZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCX0KLQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IoY29tYm8sIGl0ZW1zW2ldLCAwKTsKLQkJZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQllZGl0b3Iuc2V0RWRpdG9yKHRleHQsIGl0ZW1zW2ldLCAxKTsKLQkJZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uICh0YWJsZSwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnBhY2sgKCk7Ci0JCWVkaXRvci5taW5pbXVtV2lkdGggPSBidXR0b24uZ2V0U2l6ZSAoKS54OwotCQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQllZGl0b3Iuc2V0RWRpdG9yIChidXR0b24sIGl0ZW1zW2ldLCAyKTsKLQl9Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTVkODEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBwcmV2ZW50IFRhYiBmcm9tIHRyYXZlcnNpbmcgb3V0IG9mIGEgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjcgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0Qm91bmRzKDEwLDEwLDE4MCwzMCk7Ci0JYnV0dG9uMS5zZXRUZXh0KCJubyB0cmF2ZXJzZSIpOwotCWJ1dHRvbjEuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVM6IHsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMCwxODAsMzApOwotCWJ1dHRvbjIuc2V0VGV4dCgiY2FuIHRyYXZlcnNlIik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiNjA1Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBicmluZyB1cCBhIGJyb3dzZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyOCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJVG9vbEl0ZW0gaXRlbUJhY2sgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtQmFjay5zZXRUZXh0KCJCYWNrIik7Ci0JCVRvb2xJdGVtIGl0ZW1Gb3J3YXJkID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUZvcndhcmQuc2V0VGV4dCgiRm9yd2FyZCIpOwotCQlUb29sSXRlbSBpdGVtU3RvcCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1TdG9wLnNldFRleHQoIlN0b3AiKTsKLQkJVG9vbEl0ZW0gaXRlbVJlZnJlc2ggPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtUmVmcmVzaC5zZXRUZXh0KCJSZWZyZXNoIik7Ci0JCVRvb2xJdGVtIGl0ZW1HbyA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1Hby5zZXRUZXh0KCJHbyIpOwotCQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJdG9vbGJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUxhYmVsIGxhYmVsQWRkcmVzcyA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsYWJlbEFkZHJlc3Muc2V0VGV4dCgiQWRkcmVzcyIpOwotCQkKLQkJZmluYWwgVGV4dCBsb2NhdGlvbiA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbG9jYXRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBMYWJlbCBzdGF0dXMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3RhdHVzLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5FTkQ7Ci0JCXByb2dyZXNzQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLyogZXZlbnQgaGFuZGxpbmcgKi8KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pZXZlbnQud2lkZ2V0OwotCQkJCVN0cmluZyBzdHJpbmcgPSBpdGVtLmdldFRleHQoKTsKLQkJCQlpZiAoc3RyaW5nLmVxdWFscygiQmFjayIpKSBicm93c2VyLmJhY2soKTsgCi0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiRm9yd2FyZCIpKSBicm93c2VyLmZvcndhcmQoKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJTdG9wIikpIGJyb3dzZXIuc3RvcCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIlJlZnJlc2giKSkgYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiR28iKSkgYnJvd3Nlci5zZXRVcmwobG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJICAgfQotCQl9OwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LnRvdGFsID09IDApIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWludCByYXRpbyA9IGV2ZW50LmN1cnJlbnQgKiAxMDAgLyBldmVudC50b3RhbDsKLQkJCQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKHJhdGlvKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKDApOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoZXZlbnQudGV4dCk7CQotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LnRvcCkgbG9jYXRpb24uc2V0VGV4dChldmVudC5sb2NhdGlvbik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtQmFjay5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1Gb3J3YXJkLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbVN0b3AuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtUmVmcmVzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1Hby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWxvY2F0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYnJvd3Nlci5zZXRVcmwobG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vZWNsaXBzZS5vcmciKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkMWJhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY29sb3IgY2VsbHMgYW5kIHJvd3MgaW4gdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjkgewotIAotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgZ3JheSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGFibGUuc2V0QmFja2dyb3VuZChncmF5KTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiZW50aXJlIiwicm93IiwicmVkIGZvcmVncm91bmQifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiZW50aXJlIiwicm93IiwicmVkIGJhY2tncm91bmQifSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiZW50aXJlIiwicm93Iiwid2hpdGUgZm9yZS9yZWQgYmFjayJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQod2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Im5vcm1hbCIsImJsdWUgZm9yZWdyb3VuZCIsInJlZCBmb3JlZ3JvdW5kIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCgxLCBibHVlKTsKLQlpdGVtLnNldEZvcmVncm91bmQoMiwgcmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJub3JtYWwiLCJibHVlIGJhY2tncm91bmQiLCJyZWQgYmFja2dyb3VuZCJ9KTsKLQlpdGVtLnNldEJhY2tncm91bmQoMSwgYmx1ZSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDIsIHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsid2hpdGUgZm9yZS9ibHVlIGJhY2siLCJub3JtYWwiLCJ3aGl0ZSBmb3JlL3JlZCBiYWNrIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCB3aGl0ZSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDAsIGJsdWUpOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCgyLCB3aGl0ZSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDIsIHJlZCk7Ci0JCi0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JY29sdW1uMy5wYWNrKCk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhOGQwOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGEgdGhpY2sgbGluZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKHNoZWxsKTsKLQlnYy5zZXRMaW5lV2lkdGggKDQpOwotCWdjLmRyYXdSZWN0YW5nbGUgKDIwLCAyMCwgMTAwLCAxMDApOwotCWdjLmRpc3Bvc2UgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODBjYjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJ1c3lJbmRpY2F0b3IgZXhhbXBsZSBzbmlwcGV0OiBkaXNwbGF5IGJ1c3kgY3Vyc29yIGR1cmluZyBsb25nIHJ1bm5pbmcgdGFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZmluYWwgaW50W10gbmV4dElkID0gbmV3IGludFsxXTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiaW52b2tlIGxvbmcgcnVubmluZyBqb2IiKTsKLQkJYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlSdW5uYWJsZSBsb25nSm9iID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQkJaW50IGlkOwotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlpZCA9IG5leHRJZFswXSsrOwotCQkJCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodGV4dC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCQl0ZXh0LmFwcGVuZCgiXG5TdGFydCBsb25nIHJ1bm5pbmcgdGFzayAiK2lkKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKLQkJCQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkbyB0YXNrIHRoYXQgdGFrZXMgYSBsb25nIHRpbWUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgIitpZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCWlmICh0ZXh0LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQkJCXRleHQuYXBwZW5kKCJcbkNvbXBsZXRlZCBsb25nIHJ1bm5pbmcgdGFzayAiK2lkKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJCXRocmVhZC5zdGFydCgpOwotCQkJCQkJd2hpbGUgKCFkb25lICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZGlzcGxheSwgbG9uZ0pvYik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5zZXRTaXplKDI1MCwgMTUwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDBjMDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogc2hvdyBhIHBvcHVwIG1lbnUgKHdhaXQgZm9yIGl0IHRvIGNsb3NlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMxIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIk1lbnUgSXRlbSIpOwotCQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJdGVtIFNlbGVjdGVkIik7Ci0JCQkJfQotCQkJfSk7Ci0JCQltZW51LnNldExvY2F0aW9uIChldmVudC54LCBldmVudC55KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl3aGlsZSAoIW1lbnUuaXNEaXNwb3NlZCAoKSAmJiBtZW51LmlzVmlzaWJsZSAoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQl9Ci0JCQltZW51LmRpc3Bvc2UgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhODFhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBQcmludGluZyBleGFtcGxlIHNuaXBwZXQ6IHByaW50ICJIZWxsbyBXb3JsZCEiIGluIGJsYWNrLCBvdXRsaW5lZCBpbiByZWQsIHRvIGRlZmF1bHQgcHJpbnRlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogTm8gZGVmYXVsdCBwcmludGVyLiIpOwotCQlyZXR1cm47Ci0JfQotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCWlmIChwcmludGVyLnN0YXJ0Sm9iKCJTV1QgUHJpbnRpbmcgU25pcHBldCIpKSB7Ci0JCUNvbG9yIGJsYWNrID0gcHJpbnRlci5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCQlDb2xvciB3aGl0ZSA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQkJQ29sb3IgcmVkID0gcHJpbnRlci5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJUmVjdGFuZ2xlIHRyaW0gPSBwcmludGVyLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQlQb2ludCBkcGkgPSBwcmludGVyLmdldERQSSgpOwotCQlpbnQgbGVmdE1hcmdpbiA9IGRwaS54ICsgdHJpbS54OyAvLyBvbmUgaW5jaCBmcm9tIGxlZnQgc2lkZSBvZiBwYXBlcgotCQlpbnQgdG9wTWFyZ2luID0gZHBpLnkgLyAyICsgdHJpbS55OyAvLyBvbmUtaGFsZiBpbmNoIGZyb20gdG9wIGVkZ2Ugb2YgcGFwZXIKLQkJR0MgZ2MgPSBuZXcgR0MocHJpbnRlcik7Ci0JCUZvbnQgZm9udCA9IGdjLmdldEZvbnQoKTsgLy8gZXhhbXBsZSBqdXN0IHVzZXMgcHJpbnRlcidzIGRlZmF1bHQgZm9udAotCQlpZiAocHJpbnRlci5zdGFydFBhZ2UoKSkgewotCQkJZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLQkJCVN0cmluZyB0ZXN0U3RyaW5nID0gIkhlbGxvIFdvcmxkISI7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQodGVzdFN0cmluZyk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIGxlZnRNYXJnaW4sIHRvcE1hcmdpbiArIGZvbnQuZ2V0Rm9udERhdGEoKVswXS5nZXRIZWlnaHQoKSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQlnYy5kcmF3UmVjdGFuZ2xlKGxlZnRNYXJnaW4sIHRvcE1hcmdpbiwgZXh0ZW50LngsIGV4dGVudC55KTsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcHJpbnRlci5lbmRKb2IoKTsKLQkJfQotCXByaW50ZXIuZGlzcG9zZSgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTgwZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFByaW50aW5nIGV4YW1wbGUgc25pcHBldDogcHJpbnQgdGV4dCB0byBwcmludGVyLCB3aXRoIHdvcmQgd3JhcCBhbmQgcGFnaW5hdGlvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMyB7Ci0JRGlzcGxheSBkaXNwbGF5OwotCVNoZWxsIHNoZWxsOwotCVRleHQgdGV4dDsKLQlGb250IGZvbnQ7Ci0JQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JCi0JUHJpbnRlciBwcmludGVyOwotCUdDIGdjOwotCUZvbnQgcHJpbnRlckZvbnQ7Ci0JQ29sb3IgcHJpbnRlckZvcmVncm91bmRDb2xvciwgcHJpbnRlckJhY2tncm91bmRDb2xvcjsKLQotCWludCBsaW5lSGVpZ2h0ID0gMDsKLQlpbnQgdGFiV2lkdGggPSAwOwotCWludCBsZWZ0TWFyZ2luLCByaWdodE1hcmdpbiwgdG9wTWFyZ2luLCBib3R0b21NYXJnaW47Ci0JaW50IHgsIHk7Ci0JaW50IGluZGV4LCBlbmQ7Ci0JU3RyaW5nIHRleHRUb1ByaW50OwotCVN0cmluZyB0YWJzOwotCVN0cmluZ0J1ZmZlciB3b3JkQnVmZmVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgU25pcHBldDEzMygpLm9wZW4oKTsKLQl9Ci0JCi0Jdm9pZCBvcGVuKCkgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb3VyaWVyIiwgMTAsIFNXVC5OT1JNQUwpOwotCQlmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCWJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dCgiUHJpbnQgVGV4dCIpOwotCQlzaGVsbC5zZXRNYXhpbWl6ZWQodHJ1ZSk7Ci0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCXRleHQuc2V0Rm9udChmb250KTsKLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCXRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQkKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJk9wZW4uLi4iKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ1RSTCArICdPJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9udC4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9udCgpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkZvcmVncm91bmQgQ29sb3IuLi4iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUZvcmVncm91bmRDb2xvcigpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkJhY2tncm91bmQgQ29sb3IuLi4iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUJhY2tncm91bmRDb2xvcigpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIiZQcmludC4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ1AnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVByaW50KCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRSZ4aXQiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQlpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpIGJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JfQotCQkKLQl2b2lkIG1lbnVPcGVuKCkgewotCQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmphdmEiLCAiKi4qIn0pOwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSkgcmV0dXJuOwotCQotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gc3RyZWFtPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUuZ2V0UGF0aCgpKTsKLQkJCXRyeSB7Ci0JCQkJUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQkJCQljaGFyW10gcmVhZEJ1ZmZlcj0gbmV3IGNoYXJbMjA0OF07Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpKSA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQl9Ci0JCQkJdGV4dFN0cmluZyA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCQlib3guc2V0TWVzc2FnZSgiRXJyb3IgcmVhZGluZyBmaWxlOlxuIiArIG5hbWUpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoIkZpbGUgbm90IGZvdW5kOlxuIiArIG5hbWUpOwotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQkKLQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCX0KLQotCXZvaWQgbWVudUZvbnQoKSB7Ci0JCUZvbnREaWFsb2cgZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQkJZm9udERpYWxvZy5zZXRGb250TGlzdChmb250LmdldEZvbnREYXRhKCkpOwotCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotCQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGEpOwotCQkJdGV4dC5zZXRGb250KGZvbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51Rm9yZWdyb3VuZENvbG9yKCkgewotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQihmb3JlZ3JvdW5kQ29sb3IuZ2V0UkdCKCkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0JCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkJY29sb3JEaWFsb2cuc2V0UkdCKGJhY2tncm91bmRDb2xvci5nZXRSR0IoKSk7Ci0JCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZ2IgIT0gbnVsbCkgewotCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCQl0ZXh0LnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVByaW50KCkgewotCQlQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJUHJpbnRlckRhdGEgZGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQkJaWYgKGRhdGEucHJpbnRUb0ZpbGUpIHsKLQkJCWRhdGEuZmlsZU5hbWUgPSAicHJpbnQub3V0IjsgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gYXNrIHRoZSB1c2VyIGZvciBhIGZpbGVuYW1lCi0JCX0KLQkJCi0JCS8qIEdldCB0aGUgdGV4dCB0byBwcmludCBmcm9tIHRoZSBUZXh0IHdpZGdldCAoeW91IGNvdWxkIGdldCBpdCBmcm9tIGFueXdoZXJlLCBpLmUuIHlvdXIgamF2YSBtb2RlbCkgKi8KLQkJdGV4dFRvUHJpbnQgPSB0ZXh0LmdldFRleHQoKTsKLQotCQkvKiBEbyB0aGUgcHJpbnRpbmcgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCBzbyB0aGF0IHNwb29saW5nIGRvZXMgbm90IGZyZWV6ZSB0aGUgVUkuICovCi0JCXByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJVGhyZWFkIHByaW50aW5nVGhyZWFkID0gbmV3IFRocmVhZCgiUHJpbnRpbmciKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJpbnQocHJpbnRlcik7Ci0JCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JCXByaW50aW5nVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCXZvaWQgcHJpbnQoUHJpbnRlciBwcmludGVyKSB7Ci0JCWlmIChwcmludGVyLnN0YXJ0Sm9iKCJUZXh0IikpIHsgICAvLyB0aGUgc3RyaW5nIGlzIHRoZSBqb2IgbmFtZSAtIHNob3dzIHVwIGluIHRoZSBwcmludGVyJ3Mgam9iIGxpc3QKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJpbnRlci5nZXRDbGllbnRBcmVhKCk7Ci0JCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlQb2ludCBkcGkgPSBwcmludGVyLmdldERQSSgpOwotCQkJbGVmdE1hcmdpbiA9IGRwaS54ICsgdHJpbS54OyAvLyBvbmUgaW5jaCBmcm9tIGxlZnQgc2lkZSBvZiBwYXBlcgotCQkJcmlnaHRNYXJnaW4gPSBjbGllbnRBcmVhLndpZHRoIC0gZHBpLnggKyB0cmltLnggKyB0cmltLndpZHRoOyAvLyBvbmUgaW5jaCBmcm9tIHJpZ2h0IHNpZGUgb2YgcGFwZXIKLQkJCXRvcE1hcmdpbiA9IGRwaS55ICsgdHJpbS55OyAvLyBvbmUgaW5jaCBmcm9tIHRvcCBlZGdlIG9mIHBhcGVyCi0JCQlib3R0b21NYXJnaW4gPSBjbGllbnRBcmVhLmhlaWdodCAtIGRwaS55ICsgdHJpbS55ICsgdHJpbS5oZWlnaHQ7IC8vIG9uZSBpbmNoIGZyb20gYm90dG9tIGVkZ2Ugb2YgcGFwZXIKLQkJCQotCQkJLyogQ3JlYXRlIGEgYnVmZmVyIGZvciBjb21wdXRpbmcgdGFiIHdpZHRoLiAqLwotCQkJaW50IHRhYlNpemUgPSA0OyAvLyBpcyB0YWIgd2lkdGggYSB1c2VyIHNldHRpbmcgaW4geW91ciBVST8KLQkJCVN0cmluZ0J1ZmZlciB0YWJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJTaXplOyBpKyspIHRhYkJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCXRhYnMgPSB0YWJCdWZmZXIudG9TdHJpbmcoKTsKLQotCQkJLyogQ3JlYXRlIHByaW50ZXIgR0MsIGFuZCBjcmVhdGUgYW5kIHNldCB0aGUgcHJpbnRlciBmb250ICYgZm9yZWdyb3VuZCBjb2xvci4gKi8KLQkJCWdjID0gbmV3IEdDKHByaW50ZXIpOwotCQkJCi0JCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJCXByaW50ZXJGb250ID0gbmV3IEZvbnQocHJpbnRlciwgZm9udERhdGEuZ2V0TmFtZSgpLCBmb250RGF0YS5nZXRIZWlnaHQoKSwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JCQlnYy5zZXRGb250KHByaW50ZXJGb250KTsKLQkJCXRhYldpZHRoID0gZ2Muc3RyaW5nRXh0ZW50KHRhYnMpLng7Ci0JCQlsaW5lSGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJCQotCQkJUkdCIHJnYiA9IGZvcmVncm91bmRDb2xvci5nZXRSR0IoKTsKLQkJCXByaW50ZXJGb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgcmdiKTsKLQkJCWdjLnNldEZvcmVncm91bmQocHJpbnRlckZvcmVncm91bmRDb2xvcik7Ci0JCQotCQkJcmdiID0gYmFja2dyb3VuZENvbG9yLmdldFJHQigpOwotCQkJcHJpbnRlckJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihwcmludGVyLCByZ2IpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChwcmludGVyQmFja2dyb3VuZENvbG9yKTsKLQkJCi0JCQkvKiBQcmludCB0ZXh0IHRvIGN1cnJlbnQgZ2MgdXNpbmcgd29yZCB3cmFwICovCi0JCQlwcmludFRleHQoKTsKLQkJCXByaW50ZXIuZW5kSm9iKCk7Ci0KLQkJCS8qIENsZWFudXAgZ3JhcGhpY3MgcmVzb3VyY2VzIHVzZWQgaW4gcHJpbnRpbmcgKi8KLQkJCXByaW50ZXJGb250LmRpc3Bvc2UoKTsKLQkJCXByaW50ZXJGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJcHJpbnRlckJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBwcmludFRleHQoKSB7Ci0JCXByaW50ZXIuc3RhcnRQYWdlKCk7Ci0JCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ID0gdG9wTWFyZ2luOwotCQlpbmRleCA9IDA7Ci0JCWVuZCA9IHRleHRUb1ByaW50Lmxlbmd0aCgpOwotCQl3aGlsZSAoaW5kZXggPCBlbmQpIHsKLQkJCWNoYXIgYyA9IHRleHRUb1ByaW50LmNoYXJBdChpbmRleCk7Ci0JCQlpbmRleCsrOwotCQkJaWYgKGMgIT0gMCkgewotCQkJCWlmIChjID09IDB4MGEgfHwgYyA9PSAweDBkKSB7Ci0JCQkJCWlmIChjID09IDB4MGQgJiYgaW5kZXggPCBlbmQgJiYgdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KSA9PSAweDBhKSB7Ci0JCQkJCQlpbmRleCsrOyAvLyBpZiB0aGlzIGlzIGNyLWxmLCBza2lwIHRoZSBsZgotCQkJCQl9Ci0JCQkJCXByaW50V29yZEJ1ZmZlcigpOwotCQkJCQluZXdsaW5lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGMgIT0gJ1x0JykgewotCQkJCQkJd29yZEJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQkJCXByaW50V29yZEJ1ZmZlcigpOwotCQkJCQkJaWYgKGMgPT0gJ1x0JykgewotCQkJCQkJCXggKz0gdGFiV2lkdGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHkgKyBsaW5lSGVpZ2h0IDw9IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByaW50V29yZEJ1ZmZlcigpIHsKLQkJaWYgKHdvcmRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgd29yZCA9IHdvcmRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWludCB3b3JkV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQod29yZCkueDsKLQkJCWlmICh4ICsgd29yZFdpZHRoID4gcmlnaHRNYXJnaW4pIHsKLQkJCQkvKiB3b3JkIGRvZXNuJ3QgZml0IG9uIGN1cnJlbnQgbGluZSwgc28gd3JhcCAqLwotCQkJCW5ld2xpbmUoKTsKLQkJCX0KLQkJCWdjLmRyYXdTdHJpbmcod29yZCwgeCwgeSwgZmFsc2UpOwotCQkJeCArPSB3b3JkV2lkdGg7Ci0JCQl3b3JkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JfQotCi0Jdm9pZCBuZXdsaW5lKCkgewotCQl4ID0gbGVmdE1hcmdpbjsKLQkJeSArPSBsaW5lSGVpZ2h0OwotCQlpZiAoeSArIGxpbmVIZWlnaHQgPiBib3R0b21NYXJnaW4pIHsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQkJaWYgKGluZGV4ICsgMSA8IGVuZCkgewotCQkJCXkgPSB0b3BNYXJnaW47Ci0JCQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkODE5YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIHdpbmRvdwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM0IHsKLQotc3RhdGljIGludFtdIGNpcmNsZShpbnQgciwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7Ci0JaW50W10gcG9seWdvbiA9IG5ldyBpbnRbOCAqIHIgKyA0XTsKLQkvL3heMiArIHleMiA9IHJeMgotCWZvciAoaW50IGkgPSAwOyBpIDwgMiAqIHIgKyAxOyBpKyspIHsKLQkJaW50IHggPSBpIC0gcjsKLQkJaW50IHkgPSAoaW50KU1hdGguc3FydChyKnIgLSB4KngpOwotCQlwb2x5Z29uWzIqaV0gPSBvZmZzZXRYICsgeDsKLQkJcG9seWdvblsyKmkrMV0gPSBvZmZzZXRZICsgeTsKLQkJcG9seWdvbls4KnIgLSAyKmkgLSAyXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDFdID0gb2Zmc2V0WSAtIHk7Ci0JfQotCXJldHVybiBwb2x5Z29uOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkvL1NoZWxsIG11c3QgYmUgY3JlYXRlZCB3aXRoIHN0eWxlIFNXVC5OT19UUklNCi0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0gfCBTV1QuT05fVE9QKTsKLQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCS8vZGVmaW5lIGEgcmVnaW9uIHRoYXQgbG9va3MgbGlrZSBhIGtleSBob2xlCi0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlyZWdpb24uYWRkKGNpcmNsZSg2NywgNjcsIDY3KSk7Ci0JcmVnaW9uLnN1YnRyYWN0KGNpcmNsZSgyMCwgNjcsIDUwKSk7Ci0JcmVnaW9uLnN1YnRyYWN0KG5ldyBpbnRbXXs2NywgNTAsIDU1LCAxMDUsIDc5LCAxMDV9KTsKLQkvL2RlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHNoZWxsIHVzaW5nIHNldFJlZ2lvbgotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCVJlY3RhbmdsZSBzaXplID0gcmVnaW9uLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCS8vYWRkIGFiaWxpdHkgdG8gbW92ZSBzaGVsbCBhcm91bmQKLQlMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotCQlQb2ludCBvcmlnaW47Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlvcmlnaW4gPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlvcmlnaW4gPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChvcmlnaW4gIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcCA9IGRpc3BsYXkubWFwKHNoZWxsLCBudWxsLCBlLngsIGUueSk7Ci0JCQkJCQlzaGVsbC5zZXRMb2NhdGlvbihwLnggLSBvcmlnaW4ueCwgcC55IC0gb3JpZ2luLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgbCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBjbG9zZSBzaGVsbAotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0QmFja2dyb3VuZChzaGVsbC5nZXRCYWNrZ3JvdW5kKCkpOwotCWIuc2V0VGV4dCgiY2xvc2UiKTsKLQliLnBhY2soKTsKLQliLnNldExvY2F0aW9uKDEwLCA2OCk7Ci0JYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlyZWdpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjhmNzE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZW1iZWQgU3dpbmcvQVdUIGluIFNXVAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzUgewotCi0Jc3RhdGljIGNsYXNzIEZpbGVUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsJCQotCQlGaWxlW10gZmlsZXM7ICAgICAgICAKLQkJU3RyaW5nW10gY29sdW1uc05hbWUgPSB7Ik5hbWUiLCAiU2l6ZSIsICJEYXRlIE1vZGlmaWVkIn07Ci0JCQotCQlwdWJsaWMgRmlsZVRhYmxlTW9kZWwgKEZpbGVbXSBmaWxlcykgewotCQkJdGhpcy5maWxlcyA9IGZpbGVzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQgKCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lLmxlbmd0aDsKLQkJfQotCQlwdWJsaWMgQ2xhc3MgZ2V0Q29sdW1uQ2xhc3MgKGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMSkgcmV0dXJuIExvbmcuY2xhc3M7Ci0JCQlpZiAoY29sID09IDIpIHJldHVybiBEYXRlLmNsYXNzOwotCQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQkJfQotCQlwdWJsaWMgaW50IGdldFJvd0NvdW50ICgpIHsKLQkJCXJldHVybiBmaWxlcyA9PSBudWxsID8gMCA6IGZpbGVzLmxlbmd0aDsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQgKGludCByb3csIGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMCkgcmV0dXJuIGZpbGVzW3Jvd10uZ2V0TmFtZSgpOwotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gbmV3IExvbmcoZmlsZXNbcm93XS5sZW5ndGgoKSk7Ci0JCQlpZiAoY29sID09IDIpIHJldHVybiBuZXcgRGF0ZShmaWxlc1tyb3ddLmxhc3RNb2RpZmllZCgpKTsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUgKGludCBjb2wpIHsKLQkJCXJldHVybiBjb2x1bW5zTmFtZVtjb2xdOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU1dUIGFuZCBTd2luZy9BV1QgRXhhbXBsZSIpOwotCi0JCUxpc3RlbmVyIGV4aXRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuQ0FOQ0VMIHwgU1dULklDT05fUVVFU1RJT04pOwotCQkJCWRpYWxvZy5zZXRUZXh0KCJRdWVzdGlvbiIpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKCJFeGl0PyIpOwotCQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKSBlLmRvaXQgPSBmYWxzZTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBTV1QuT0spIHJldHVybjsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07CQotCQlMaXN0ZW5lciBhYm91dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZpbmFsIFNoZWxsIHMgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQkJcy5zZXRUZXh0KCJBYm91dCIpOwotCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCQkJcy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzLCBTV1QuTk9ORSk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiU1dUIGFuZCBBV1QgRXhhbXBsZS4iKTsKLQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzLCBTV1QuUFVTSCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIk9LIik7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJcy5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlzLnBhY2soKTsKLQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHMuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IHggPSBwYXJlbnRCb3VuZHMueCArIChwYXJlbnRCb3VuZHMud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMjsKLQkJCQlpbnQgeSA9IHBhcmVudEJvdW5kcy55ICsgKHBhcmVudEJvdW5kcy5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSAvIDI7Ci0JCQkJcy5zZXRMb2NhdGlvbih4LCB5KTsKLQkJCQlzLm9wZW4oKTsKLQkJCQl3aGlsZSAoIXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBleGl0TGlzdGVuZXIpOwotCQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbShtYiwgU1dULkNBU0NBREUpOwotCQlmaWxlSXRlbS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlmaWxlSXRlbS5zZXRNZW51KGZpbGVNZW51KTsKLQkJTWVudUl0ZW0gZXhpdEl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJZXhpdEl0ZW0uc2V0VGV4dCgiJkV4aXRcdEN0cmwrWCIpOwotCQlleGl0SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ09OVFJPTCArICdYJyk7Ci0JCWV4aXRJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnVJdGVtIGFib3V0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlhYm91dEl0ZW0uc2V0VGV4dCgiJkFib3V0XHRDdHJsK0EiKTsKLQkJYWJvdXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ0EnKTsKLQkJYWJvdXRJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGFib3V0TGlzdGVuZXIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQotCQlSR0IgY29sb3IgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUxhYmVsIGxvY2F0aW9uTGIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYi5zZXRUZXh0KCJMb2NhdGlvbjoiKTsKLQkJQ29tcG9zaXRlIGxvY2F0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0JCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuRkxBVCk7Ci0JCVRvb2xJdGVtIGV4aXRUb29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWV4aXRUb29sSXRlbS5zZXRUZXh0KCImRXhpdCIpOwotCQlleGl0VG9vbEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJVG9vbEl0ZW0gYWJvdXRUb29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWFib3V0VG9vbEl0ZW0uc2V0VGV4dCgiJkFib3V0Iik7Ci0JCWFib3V0VG9vbEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCUxhYmVsIHNlcGFyYXRvcjIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBUcmVlIGZpbGVUcmVlID0gbmV3IFRyZWUoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlTYXNoIHNhc2ggPSBuZXcgU2FzaChjb21wLCBTV1QuVkVSVElDQUwpOwotCQlDb21wb3NpdGUgdGFibGVDb21wID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuRU1CRURERUQpOwotCQlMYWJlbCBzZXBhcmF0b3IzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3RhdHVzQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0KLQkJamF2YS5hd3QuRnJhbWUgbG9jYXRpb25GcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGxvY2F0aW9uQ29tcCk7Ci0JCWZpbmFsIGphdmEuYXd0LlRleHRGaWVsZCBsb2NhdGlvblRleHQgPSBuZXcgamF2YS5hd3QuVGV4dEZpZWxkKCk7Ci0JCWxvY2F0aW9uRnJhbWUuYWRkKGxvY2F0aW9uVGV4dCk7Ci0KLQkJamF2YS5hd3QuRnJhbWUgZmlsZVRhYmxlRnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZSh0YWJsZUNvbXApOwotCQlqYXZhLmF3dC5QYW5lbCBwYW5lbCA9IG5ldyBqYXZhLmF3dC5QYW5lbChuZXcgamF2YS5hd3QuQm9yZGVyTGF5b3V0KCkpOwotCQlmaWxlVGFibGVGcmFtZS5hZGQocGFuZWwpOwotCQlmaW5hbCBKVGFibGUgZmlsZVRhYmxlID0gbmV3IEpUYWJsZShuZXcgRmlsZVRhYmxlTW9kZWwobnVsbCkpOwotCQlmaWxlVGFibGUuc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCWZpbGVUYWJsZS5zZXRTaG93R3JpZChmYWxzZSk7Ci0JCWZpbGVUYWJsZS5jcmVhdGVEZWZhdWx0Q29sdW1uc0Zyb21Nb2RlbCgpOwotCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKGZpbGVUYWJsZSk7Ci0JCXBhbmVsLmFkZChzY3JvbGxQYW5lKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBzdGF0dXNGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHN0YXR1c0NvbXApOwotCQlzdGF0dXNGcmFtZS5zZXRCYWNrZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcihjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKSk7Ci0JCWZpbmFsIGphdmEuYXd0LkxhYmVsIHN0YXR1c0xhYmVsID0gbmV3IGphdmEuYXd0LkxhYmVsKCk7Ci0JCXN0YXR1c0ZyYW1lLmFkZChzdGF0dXNMYWJlbCk7Ci0JCXN0YXR1c0xhYmVsLnNldFRleHQoIlNlbGVjdCBhIGZpbGUiKTsKLQotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULkRSQUcpIHJldHVybjsKLQkJCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKWZpbGVUcmVlLmdldExheW91dERhdGEoKTsKLQkJCQlSZWN0YW5nbGUgdHJpbSA9IGZpbGVUcmVlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJCWRhdGEud2lkdGhIaW50ID0gZS54IC0gdHJpbS53aWR0aDsKLQkJCQljb21wLmxheW91dCgpOwotCQkJfQotCQl9KTsKLQotCQlGaWxlW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSByb290c1tpXTsKLQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGZpbGVUcmVlLCBTV1QuTk9ORSk7Ci0JCQl0cmVlSXRlbS5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQl9Ci0JCWZpbGVUcmVlLmFkZExpc3RlbmVyKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWUuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaWYgKGl0ZW0uZ2V0SXRlbUNvdW50KCkgPT0gMSkgewotCQkJCQlUcmVlSXRlbSBmaXJzdEl0ZW0gPSBpdGVtLmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChmaXJzdEl0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHJldHVybjsKLQkJCQkJZmlyc3RJdGVtLmRpc3Bvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUZpbGUgcm9vdCA9IChGaWxlKWl0ZW0uZ2V0RGF0YSgpOwotCQkJCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQl0cmVlSXRlbS5zZXRUZXh0KGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCXRyZWVJdGVtLnNldERhdGEoZmlsZSk7Ci0JCQkJCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGVUcmVlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWUuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJZmluYWwgRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN0YXR1c0xhYmVsLnNldFRleHQocm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlsb2NhdGlvblRleHQuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWZpbGVUYWJsZS5zZXRNb2RlbChuZXcgRmlsZVRhYmxlTW9kZWwocm9vdC5saXN0RmlsZXMoKSkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGE7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbG9jYXRpb25MYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBsb2NhdGlvblRleHQuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJbG9jYXRpb25Db21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCXNlcGFyYXRvcjMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gc3RhdHVzTGFiZWwuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJc3RhdHVzQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7CQkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlmaWxlVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCXNhc2guc2V0TGF5b3V0RGF0YShkYXRhKTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXRhYmxlQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjZmY2VmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogcmVuZGVyIEhUTUwgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNiB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgVGVzdDwvVElUTEU+PC9IRUFEPjxCT0RZPiI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGh0bWwgKz0gIjxQPlRoaXMgaXMgbGluZSAiK2krIjwvUD4iOwotCQlodG1sICs9ICI8L0JPRFk+PC9IVE1MPiI7Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNTk5ZDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiByZW5kZXIgSFRNTCB0aGF0IGluY2x1ZGVzIHJlbGF0aXZlIGxpbmtzIGZyb20gbWVtb3J5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCS8qIFJlbGF0aXZlIGxpbmtzOiB1c2UgdGhlIEhUTUwgYmFzZSB0YWcgKi8KLQlTdHJpbmcgaHRtbCA9ICI8aHRtbD48aGVhZD4iKwotCQkiPGJhc2UgaHJlZj1cImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L1wiID4iKwotCQkiPHRpdGxlPkhUTUwgVGVzdDwvdGl0bGU+PC9oZWFkPiIrCi0JCSI8Ym9keT48YSBocmVmPVwiZmFxLnBocFwiPmxvY2FsIGxpbms8L2E+PC9ib2R5PjwvaHRtbD4iOwotCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNGVjY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHNldCBpY29ucyB3aXRoIGRpZmZlcmVudCByZXNvbHV0aW9ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQotCQlJbWFnZSBzbWFsbCA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCQlHQyBnYyA9IG5ldyBHQyhzbWFsbCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMTYsIDE2LCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJSW1hZ2UgbGFyZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzIsIDMyKTsKLQkJZ2MgPSBuZXcgR0MobGFyZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5maWxsQXJjKDAsIDAsIDMyLCAzMiwgNDUsIDI3MCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJCi0JCS8qIFByb3ZpZGUgZGlmZmVyZW50IHJlc29sdXRpb25zIGZvciBpY29ucyB0byBnZXQKLQkJICogaGlnaCBxdWFsaXR5IHJlbmRlcmluZyB3aGVyZXZlciB0aGUgT1MgbmVlZHMgCi0JCSAqIGxhcmdlIGljb25zLiBGb3IgZXhhbXBsZSwgdGhlIEFMVCtUQUIgd2luZG93IAotCQkgKiBvbiBjZXJ0YWluIHN5c3RlbXMgdXNlcyBhIGxhcmdlciBpY29uLgotCQkgKi8KLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIlNtYWxsIGFuZCBMYXJnZSBpY29ucyIpOwotCQlzaGVsbC5zZXRJbWFnZXMobmV3IEltYWdlW10ge3NtYWxsLCBsYXJnZX0pOwotCi0JCS8qIE5vIGxhcmdlIGljb246IHRoZSBPUyB3aWxsIHNjYWxlIHVwIHRoZQotCQkgKiBzbWFsbCBpY29uIHdoZW4gaXQgbmVlZHMgYSBsYXJnZSBvbmUuCi0JCSAqLwotCQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRUZXh0KCJTbWFsbCBpY29uIik7Ci0JCXNoZWxsMi5zZXRJbWFnZShzbWFsbCk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsMi5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MWY3NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUaGlzIHNuaXBwZXQgd2FzIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VVdGlsaXRpZXMgaW4gCi0gKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmRyYXcyZC8/Y3Zzcm9vdD1Ub29sc19Qcm9qZWN0Ci0gKiBieSBQcmF0aWsgU2hhaC4KLSAqCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHJvdGF0ZSBhbmQgZmxpcCBhbiBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzkgewkKLQotc3RhdGljIEltYWdlRGF0YSByb3RhdGUoSW1hZ2VEYXRhIHNyY0RhdGEsIGludCBkaXJlY3Rpb24pIHsKLQlpbnQgYnl0ZXNQZXJQaXhlbCA9IHNyY0RhdGEuYnl0ZXNQZXJMaW5lIC8gc3JjRGF0YS53aWR0aDsKLQlpbnQgZGVzdEJ5dGVzUGVyTGluZSA9IChkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbCA6IHNyY0RhdGEuaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlWyhkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLmhlaWdodCAqIGRlc3RCeXRlc1BlckxpbmUgOiBzcmNEYXRhLndpZHRoICogZGVzdEJ5dGVzUGVyTGluZV07Ci0JaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQlmb3IgKGludCBzcmNZID0gMDsgc3JjWSA8IHNyY0RhdGEuaGVpZ2h0OyBzcmNZKyspIHsKLQkJZm9yIChpbnQgc3JjWCA9IDA7IHNyY1ggPCBzcmNEYXRhLndpZHRoOyBzcmNYKyspIHsKLQkJCWludCBkZXN0WCA9IDAsIGRlc3RZID0gMCwgZGVzdEluZGV4ID0gMCwgc3JjSW5kZXggPSAwOwotCQkJc3dpdGNoIChkaXJlY3Rpb24pewotCQkJCWNhc2UgU1dULkxFRlQ6IC8vIGxlZnQgOTAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY1k7Ci0JCQkJCWRlc3RZID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEuaGVpZ2h0OwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLndpZHRoOyAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUklHSFQ6IC8vIHJpZ2h0IDkwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQlkZXN0WSA9IHNyY1g7Ci0JCQkJCXdpZHRoID0gc3JjRGF0YS5oZWlnaHQ7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEud2lkdGg7IAotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5ET1dOOiAvLyAxODAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQkJZGVzdFkgPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEud2lkdGg7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEuaGVpZ2h0OyAKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCBzcmNEYXRhLmRlcHRoLCBzcmNEYXRhLnBhbGV0dGUsIGRlc3RCeXRlc1BlckxpbmUsIG5ld0RhdGEpOwotfQotc3RhdGljIEltYWdlRGF0YSBmbGlwKEltYWdlRGF0YSBzcmNEYXRhLCBib29sZWFuIHZlcnRpY2FsKSB7Ci0JaW50IGJ5dGVzUGVyUGl4ZWwgPSBzcmNEYXRhLmJ5dGVzUGVyTGluZSAvIHNyY0RhdGEud2lkdGg7Ci0JaW50IGRlc3RCeXRlc1BlckxpbmUgPSBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW3NyY0RhdGEuZGF0YS5sZW5ndGhdOwotCWZvciAoaW50IHNyY1kgPSAwOyBzcmNZIDwgc3JjRGF0YS5oZWlnaHQ7IHNyY1krKykgewotCQlmb3IgKGludCBzcmNYID0gMDsgc3JjWCA8IHNyY0RhdGEud2lkdGg7IHNyY1grKykgewotCQkJaW50IGRlc3RYID0gMCwgZGVzdFkgPSAwLCBkZXN0SW5kZXggPSAwLCBzcmNJbmRleCA9IDA7Ci0JCQlpZiAodmVydGljYWwpewotCQkJCWRlc3RYID0gc3JjWDsKLQkJCQlkZXN0WSA9IHNyY0RhdGEuaGVpZ2h0IC0gc3JjWSAtIDE7Ci0JCQl9IGVsc2UgewotCQkJCWRlc3RYID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCWRlc3RZID0gc3JjWTsgCi0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YShzcmNEYXRhLndpZHRoLCBzcmNEYXRhLmhlaWdodCwgc3JjRGF0YS5kZXB0aCwgc3JjRGF0YS5wYWxldHRlLCBkZXN0Qnl0ZXNQZXJMaW5lLCBuZXdEYXRhKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCi0JLy8gY3JlYXRlIGFuIGltYWdlIHdpdGggdGhlIHdvcmQgImhlbGxvIiBvbiBpdAotCWZpbmFsIEltYWdlIGltYWdlMCA9IG5ldyBJbWFnZShkaXNwbGF5LCA1MCwgMzApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlMC5nZXRCb3VuZHMoKSk7Ci0JZ2MuZHJhd1N0cmluZygiaGVsbG8iLAk1LCA1LCB0cnVlKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZTAuZ2V0SW1hZ2VEYXRhKCk7Ci0JLy8gcm90YXRlIGFuZCBmbGlwIHRoaXMgaW1hZ2UKLQlmaW5hbCBJbWFnZSBpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5MRUZUKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UyID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuUklHSFQpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTMgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5ET1dOKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2U0ID0gbmV3IEltYWdlKGRpc3BsYXksIGZsaXAoZGF0YSwgdHJ1ZSkpOwotCWZpbmFsIEltYWdlIGltYWdlNSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmbGlwKGRhdGEsIGZhbHNlKSk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkvLyBkcmF3IHRoZSByZXN1bHRzIG9uIHRoZSBzaGVsbAotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3VGV4dCgiT3JpZ2luYWwgSW1hZ2U6IiwgMTAsIDEwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMCwgMTAsIDQwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkxlZnQsIFJpZ2h0LCAxODA6IiwgMTAsIDgwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMSwgMTAsIDExMCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTIsIDUwLCAxMTApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UzLCA5MCwgMTEwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkZsaXBwZWQgVmVydGljYWwsIEhvcml6b250YWw6IiwgMTAsIDE3MCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTQsIDEwLCAyMDApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2U1LCA3MCwgMjAwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWltYWdlMC5kaXNwb3NlKCk7Ci0JaW1hZ2UxLmRpc3Bvc2UoKTsKLQlpbWFnZTIuZGlzcG9zZSgpOwotCWltYWdlMy5kaXNwb3NlKCk7Ci0JaW1hZ2U0LmRpc3Bvc2UoKTsKLQlpbWFnZTUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzZiYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBtb3VzZSBlbnRlciwgZXhpdCBhbmQgaG92ZXIgZXZlbnRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVOVEVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVYSVQiKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkhPVkVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2U4Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBkcm9wLWRvd24gYSBjaGV2cm9uIG1lbnUgY29udGFpbmluZyBoaWRkZW4gdG9vbCBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQwIHsKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgQ29vbEJhciBjb29sQmFyOwotCXN0YXRpYyBNZW51IGNoZXZyb25NZW51ID0gbnVsbDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQljb29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUIHwgU1dULldSQVApOwotCWludCBtaW5XaWR0aCA9IDA7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJaW50IHdpZHRoID0gMDsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQiIgKyBqKTsKLQkJd2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCS8qIGZpbmQgdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3QgdG9vbCAqLwotCQlpZiAod2lkdGggPiBtaW5XaWR0aCkgbWluV2lkdGggPSB3aWR0aDsKLQl9Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbCh0b29sQmFyKTsKLQlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KTsKLQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZShtaW5XaWR0aCwgY29vbFNpemUueSk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCUNvb2xJdGVtIGl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGl0ZW1Cb3VuZHMueCwgaXRlbUJvdW5kcy55KSk7Ci0JCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCVRvb2xCYXIgYmFyID0gKFRvb2xCYXIpIGl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCQlUb29sSXRlbVtdIHRvb2xzID0gYmFyLmdldEl0ZW1zICgpOwotCQkJCQotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHRvb2xzLmxlbmd0aCkgewotCQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQkJcHQgPSBiYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCQl0b29sQm91bmRzLnkgPSBwdC55OwotCQkJCQkKLQkJCQkJLyogRmlndXJlIG91dCB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB0b29sIGJ5IGxvb2tpbmcgYXQgdGhlCi0JCQkJCSAqIGludGVyc2VjdGlvbiBvZiB0aGUgdG9vbCBib3VuZHMgd2l0aCB0aGUgY29vbCBpdGVtIGJvdW5kcy4gKi8KLQkJCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkJICAJCQotCQkJCQkvKiBJZiB0aGUgdG9vbCBpcyBub3QgY29tcGxldGVseSB3aXRoaW4gdGhlIGNvb2wgaXRlbSBib3VuZHMsIHRoZW4gaXQKLQkJCQkJICogaXMgcGFydGlhbGx5IGhpZGRlbiwgYW5kIGFsbCByZW1haW5pbmcgdG9vbHMgYXJlIGNvbXBsZXRlbHkgaGlkZGVuLiAqLwotCQkJICAJCWlmICghaW50ZXJzZWN0aW9uLmVxdWFscyAodG9vbEJvdW5kcykpIGJyZWFrOwotCQkJICAJCWkrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogQ3JlYXRlIGEgbWVudSB3aXRoIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSBjb21wbGV0ZWx5IGhpZGRlbiBidXR0b25zLiAqLwotCQkJCWlmIChjaGV2cm9uTWVudSAhPSBudWxsKSBjaGV2cm9uTWVudS5kaXNwb3NlKCk7Ci0JCQkJY2hldnJvbk1lbnUgPSBuZXcgTWVudSAoY29vbEJhcik7Ci0JCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29scy5sZW5ndGg7IGorKykgewotCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAoY2hldnJvbk1lbnUsIFNXVC5QVVNIKTsKLQkJCQkJbWVudUl0ZW0uc2V0VGV4dCAodG9vbHNbal0uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogRHJvcCBkb3duIHRoZSBtZW51IGJlbG93IHRoZSBjaGV2cm9uLCB3aXRoIHRoZSBsZWZ0IGVkZ2VzIGFsaWduZWQuICovCi0JCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCWNoZXZyb25NZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQljaGV2cm9uTWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMWU2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBhbmltYXRlZCBHSUYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDEgewotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBHQyBzaGVsbEdDOwotCXN0YXRpYyBDb2xvciBzaGVsbEJhY2tncm91bmQ7Ci0Jc3RhdGljIEltYWdlTG9hZGVyIGxvYWRlcjsKLQlzdGF0aWMgSW1hZ2VEYXRhW10gaW1hZ2VEYXRhQXJyYXk7Ci0Jc3RhdGljIFRocmVhZCBhbmltYXRlVGhyZWFkOwotCXN0YXRpYyBJbWFnZSBpbWFnZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VHSUZCYWNrZ3JvdW5kID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsR0MgPSBuZXcgR0Moc2hlbGwpOwotCQlzaGVsbEJhY2tncm91bmQgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouZ2lmIn0pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQl0cnkgewotCQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCWFuaW1hdGVUaHJlYWQgPSBuZXcgVGhyZWFkKCJBbmltYXRpb24iKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLyogQ3JlYXRlIGFuIG9mZi1zY3JlZW4gaW1hZ2UgdG8gZHJhdyBvbiwgYW5kIGZpbGwgaXQgd2l0aCB0aGUgc2hlbGwgYmFja2dyb3VuZC4gKi8KLQkJCQkJCQlJbWFnZSBvZmZTY3JlZW5JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKDAsIDAsIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCQkJCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLyogQ3JlYXRlIHRoZSBmaXJzdCBpbWFnZSBhbmQgZHJhdyBpdCBvbiB0aGUgb2ZmLXNjcmVlbiBpbWFnZS4gKi8KLQkJCQkJCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsJCi0JCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQotCQkJCQkJCQkvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBpbWFnZXMsIGNyZWF0aW5nIGFuZCBkcmF3aW5nIGVhY2ggb25lCi0JCQkJCQkJCSAqIG9uIHRoZSBvZmYtc2NyZWVuIGltYWdlIGJlZm9yZSBkcmF3aW5nIGl0IG9uIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJaW50IHJlcGVhdENvdW50ID0gbG9hZGVyLnJlcGVhdENvdW50OwotCQkJCQkJCQl3aGlsZSAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSB7Ci0JCQkJCQkJCQlzd2l0Y2ggKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCkgewotCQkJCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9CQUNLR1JPVU5EOgotCQkJCQkJCQkJCS8qIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJCQkJCQlpZiAodXNlR0lGQmFja2dyb3VuZCAmJiBsb2FkZXIuYmFja2dyb3VuZFBpeGVsICE9IC0xKSB7Ci0JCQkJCQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZShpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFNXVC5ETV9GSUxMX1BSRVZJT1VTOgotCQkJCQkJCQkJCS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIGltYWdlIGJlZm9yZSBkcmF3aW5nLiAqLwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCQkJCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQkJCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBEcmF3IHRoZSBvZmYtc2NyZWVuIGltYWdlIHRvIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJCXNoZWxsR0MuZHJhd0ltYWdlKG9mZlNjcmVlbkltYWdlLCAwLCAwKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSAoYWRkaW5nIGNvbW1vbmx5LXVzZWQgc2xvdy1kb3duIGZ1ZGdlIGZhY3RvcnMpLiAqLwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpbnQgbXMgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCQkJCQkJCQkJaWYgKG1zIDwgMjApIG1zICs9IDMwOwotCQkJCQkJCQkJCWlmIChtcyA8IDMwKSBtcyArPSAxMDsKLQkJCQkJCQkJCQlUaHJlYWQuc2xlZXAobXMpOwotCQkJCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBJZiB3ZSBoYXZlIGp1c3QgZHJhd24gdGhlIGxhc3QgaW1hZ2UsIGRlY3JlbWVudCB0aGUgcmVwZWF0IGNvdW50IGFuZCBzdGFydCBhZ2Fpbi4gKi8KLQkJCQkJCQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSBpbWFnZURhdGFBcnJheS5sZW5ndGggLSAxKSByZXBlYXRDb3VudC0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGFuaW1hdGluZyB0aGUgR0lGIik7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlICE9IG51bGwgJiYgIW9mZlNjcmVlbkltYWdlLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpZiAob2ZmU2NyZWVuSW1hZ2VHQyAhPSBudWxsICYmICFvZmZTY3JlZW5JbWFnZUdDLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2VHQy5kaXNwb3NlKCk7Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCWFuaW1hdGVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgR0lGIik7Ci0JCQl9Ci0JCX0KLQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FmMTRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IG1vdXNlIGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsU1dULk5PTkUpOwotCWJ1dHRvbi5zZXRTaXplKDEwMCwxMDApOwotCWJ1dHRvbi5zZXRUZXh0KCJDbGljayIpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIERvd24gKGJ1dHRvbjogIiArIGUuYnV0dG9uICsgIiB4OiAiICsgZS54ICsgIiB5OiAiICsgZS55ICsgIikiKTsKLQkJfQotCX0pOwotCWZpbmFsIFBvaW50IHB0ID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIDUwLCA1MCk7Ci0JbmV3IFRocmVhZCgpewotCQlFdmVudCBldmVudDsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgzMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLQkJCWV2ZW50LnggPSBwdC54OwotCQkJZXZlbnQueSA9IHB0Lnk7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLQkJCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQl9CQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGE5MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVHJheSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFuIGljb24gd2l0aCBhIHBvcHVwIG1lbnUgb24gdGhlIHN5c3RlbSB0cmF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCWZpbmFsIFRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSAoKTsKLQlpZiAodHJheSA9PSBudWxsKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRoZSBzeXN0ZW0gdHJheSBpcyBub3QgYXZhaWxhYmxlIik7Ci0JfSBlbHNlIHsKLQkJZmluYWwgVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSAodHJheSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QgVHJheUl0ZW0iKTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNob3ciKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5IaWRlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJoaWRlIik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0IHNlbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCU1lbnVJdGVtIG1pID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQltaS5zZXRUZXh0ICgiSXRlbSIgKyBpKTsKLQkJCW1pLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiAiICsgZXZlbnQud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChpID09IDApIG1lbnUuc2V0RGVmYXVsdEl0ZW0obWkpOwotCQl9Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0Jc2hlbGwuc2V0Qm91bmRzKDUwLCA1MCwgMzAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY5NjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCAxLDAwMCwwMDAgaXRlbXMgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ0IHsKLQotc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YgKGl0ZW0pOwotCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaW5kZXgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtLmdldFRleHQgKCkpOwotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIik7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNjUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgaW50ZXJuYXRpb25hbGl6ZWQgc3R5bGVkIHRleHQgb24gYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ1IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQkKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIk1TIE1pbmNobyIsIDIwLCBTV1QuSVRBTElDKTsKLQkJRm9udCBmb250MyA9IG5ldyBGb250KGRpc3BsYXksICJBcmFiaWMgVHJhbnNwYXJlbnQiLCAxOCwgU1dULk5PUk1BTCk7Ci0JCQotCQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQlDb2xvciBncmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JCQotCQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQlUZXh0U3R5bGUgc3R5bGUxID0gbmV3IFRleHRTdHlsZShmb250MSwgeWVsbG93LCBibHVlKTsKLQkJVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGdyZWVuLCBudWxsKTsKLQkJVGV4dFN0eWxlIHN0eWxlMyA9IG5ldyBUZXh0U3R5bGUoZm9udDMsIGJsdWUsIGdyYXkpOwotCQkKLQkJbGF5b3V0LnNldFRleHQoIkVuZ2xpc2ggXHU2NUU1XHU2NzJDXHU4QTlFICBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2NTFcdTA2MjkiKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMCwgNik7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTIsIDgsIDEwKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMTMsIDIxKTsKLQkJCQkJCi0JCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXlvdXQuZHJhdyhldmVudC5nYywgMTAsIDEwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJZm9udDMuZGlzcG9zZSgpOwotCQlsYXlvdXQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjI5YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3Qga2V5IGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0U2l6ZSh0ZXh0LmNvbXB1dGVTaXplKDE1MCwgU1dULkRFRkFVTFQpKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCW5ldyBUaHJlYWQoKXsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIkxvdmUgdGhlIG1ldGhvZC4iOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KGkpOwotCQkJCWJvb2xlYW4gc2hpZnQgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpOwotCQkJCWNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKTsKLQkJCQlpZiAoc2hpZnQpIHsKLQkJCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQkJCQlldmVudC5rZXlDb2RlID0gU1dULlNISUZUOwotCQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwkKLQkJCQl9Ci0JCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCQkJZXZlbnQuY2hhcmFjdGVyID0gY2g7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJaWYgKHNoaWZ0KSB7Ci0JCQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSBTV1QuU0hJRlQ7Ci0JCQkJCWRpc3BsYXkucG9zdChldmVudCk7CQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9LnN0YXJ0KCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI5ZDViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc3RvcCBDUiBmcm9tIGdvaW5nIHRvIHRoZSBkZWZhdWx0IGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ3ICB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIFNXVC5OT05FKTsKLQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQljb21iby5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21ibyBkZWZhdWx0IHNlbGVjdGVkIChvdmVycmlkZXMgZGVmYXVsdCBidXR0b24pIik7Ci0JCX0KLQl9KTsKLQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTVjMjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogY2hlY2sgaWYgdGhlIGJyb3dzZXIgaXMgYXZhaWxhYmxlIG9yIG5vdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ4IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQkvKiBUaGUgQnJvd3NlciB3aWRnZXQgdGhyb3dzIGFuIFNXVEVycm9yIGlmIGl0IGZhaWxzIHRvCi0JCQkgKiBpbnN0YW50aWF0ZSBwcm9wZXJseS4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgY2F0Y2gKLQkJCSAqIHRoaXMgU1dURXJyb3IgYW5kIGRpc2FibGUgYW55IGZlYXR1cmUgcmVxdWlyaW5nIHRoZQotCQkJICogQnJvd3NlciB3aWRnZXQuCi0JCQkgKiBQbGF0Zm9ybSByZXF1aXJlbWVudHMgZm9yIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgYXJlIGF2YWlsYWJsZQotCQkJICogZnJvbSB0aGUgU1dUIEZBUSB3ZWJzaXRlLiAKLQkJCSAqLwotCQl9Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCS8qIFRoZSBCcm93c2VyIHdpZGdldCBjYW4gYmUgdXNlZCAqLwotCQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJfQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDg1NTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBwcm9ncmVzcyBiYXIgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSAodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewotCQkJbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JCXRhYmxlLmdldENvbHVtbiAoMCkuc2V0VGV4dCAoIlRhc2siKTsKLQkJdGFibGUuZ2V0Q29sdW1uICgxKS5zZXRUZXh0ICgiUHJvZ3Jlc3MiKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIlRhc2sgIiArIGkpOwotCQkJaWYgKCBpICUgNSA9PSAwKSB7Ci0JCQkJUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWJhci5zZXRTZWxlY3Rpb24gKGkpOwotCQkJCVRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQkJCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCQkJCWVkaXRvci5zZXRFZGl0b3IgKGJhciwgaXRlbSwgMSk7Ci0JCQl9Ci0JCX0KLQkJdGFibGUuZ2V0Q29sdW1uICgwKS5wYWNrICgpOwotCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnNldFdpZHRoICgxMjgpOwotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA4ZmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdHJlZS5zZXRTaXplICgxMDAsIDEwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVHJlZUl0ZW0gaUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlpSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDApIC0iICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajw0OyBqKyspIHsKLQkJCVRyZWVJdGVtIGpJdGVtID0gbmV3IFRyZWVJdGVtIChpSXRlbSwgMCk7Ci0JCQlqSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDEpIC0iICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0ga0l0ZW0gPSBuZXcgVHJlZUl0ZW0gKGpJdGVtLCAwKTsKLQkJCQlrSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDIpIC0iICsgayk7Ci0JCQkJZm9yIChpbnQgbD0wOyBsPDQ7IGwrKykgewotCQkJCQlUcmVlSXRlbSBsSXRlbSA9IG5ldyBUcmVlSXRlbSAoa0l0ZW0sIDApOwotCQkJCQlsSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDMpIC0iICsgbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmMTJmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2xiYXIgKHJlbGF5b3V0IHdoZW4gcmVzaXplZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTAgewotCi1zdGF0aWMgaW50IGl0ZW1Db3VudDsKLXN0YXRpYyBDb29sSXRlbSBjcmVhdGVJdGVtKENvb2xCYXIgY29vbEJhciwgaW50IGNvdW50KSB7Ci0gICAgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1Db3VudCsrICsiIik7Ci0gICAgfQotICAgIHRvb2xCYXIucGFjaygpOwotICAgIFBvaW50IHNpemUgPSB0b29sQmFyLmdldFNpemUoKTsKLSAgICBDb29sSXRlbSBpdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldENvbnRyb2wodG9vbEJhcik7Ci0gICAgUG9pbnQgcHJlZmVycmVkID0gaXRlbS5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0gICAgaXRlbS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZCk7Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIENvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAzKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDIpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMyk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCA0KTsKLSAgICBpbnQgc3R5bGUgPSBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMOwotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBzdHlsZSk7Ci0gICAgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotICAgIHNoZWxsLnNldExheW91dChsYXlvdXQpOwotICAgIEZvcm1EYXRhIGNvb2xEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgY29vbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBjb29sRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIGNvb2xEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBjb29sQmFyLnNldExheW91dERhdGEoY29vbERhdGEpOwotICAgIGNvb2xCYXIuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgc2hlbGwubGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBGb3JtRGF0YSB0ZXh0RGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIHRleHREYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgdGV4dERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICB0ZXh0RGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29vbEJhcik7Ci0gICAgdGV4dERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKHRleHREYXRhKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiMmRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSB2aXJ0dWFsIHRhYmxlIGFuZCBhZGQgMTAwMCBlbnRyaWVzIHRvIGl0IGV2ZXJ5IDUwMCBtcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTEgewotCi1zdGF0aWMgaW50W10gZGF0YSA9IG5ldyBpbnRbMF07Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVklSVFVBTCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQlpdGVtLnNldFRleHQoIkl0ZW0gIitkYXRhW2luZGV4XSk7Ci0JCX0KLQl9KTsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaW50IGNvdW50ID0gMDsKLQkJCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JCQl3aGlsZSAoY291bnQrKyA8IDUwMCkgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkvLyBhZGQgMTAgcmFuZG9tIG51bWJlcnMgdG8gYXJyYXkgYW5kIHNvcnQKLQkJCQlpbnQgZ3JvdyA9IDEwOwotCQkJCWludFtdIG5ld0RhdGEgPSBuZXcgaW50W2RhdGEubGVuZ3RoICsgZ3Jvd107Ci0JCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCQkJaW50IGluZGV4ID0gZGF0YS5sZW5ndGg7Ci0JCQkJZGF0YSA9IG5ld0RhdGE7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBncm93OyBqKyspIHsKLQkJCQkJZGF0YVtpbmRleCsrXSA9IHJhbmRvbS5uZXh0SW50KCk7Ci0JCQkJfQotCQkJCUFycmF5cy5zb3J0KGRhdGEpOwotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQl0YWJsZS5zZXRJdGVtQ291bnQoZGF0YS5sZW5ndGgpOwotCQkJCQkJdGFibGUuY2xlYXJBbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDUwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9Ci0JCQl9Ci0JCX0KLQl9OwotCXRocmVhZC5zdGFydCgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkgfHwgdGhyZWFkLmlzQWxpdmUoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTJkNTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBzdGF0dXMgbGluZSB3aGVuIGFuIGl0ZW0gaXMgYXJtZWQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgTGlzdGVuZXIgYXJtTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGl0ZW0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBzaG93TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSAoTWVudSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG1lbnUuZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQoaXRlbS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBoaWRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBGb3JtRGF0YSBsYWJlbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBsYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOwotICAgIE1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLSAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotICAgIE1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBmaWxlSXRlbS5zZXRUZXh0KCJGaWxlIik7Ci0gICAgZmlsZUl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBlZGl0SXRlbS5zZXRUZXh0KCJFZGl0Iik7Ci0gICAgZWRpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgZmlsZUl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0gICAgU3RyaW5nW10gZmlsZVN0cmluZ3MgPSB7ICJOZXciLCAiQ2xvc2UiLCAiRXhpdCIgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGZpbGVTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIE1lbnUgZWRpdE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgU3RyaW5nW10gZWRpdFN0cmluZ3MgPSB7ICJDdXQiLCAiQ29weSIsICJQYXN0ZSIgfTsKLSAgICBlZGl0SXRlbS5zZXRNZW51KGVkaXRNZW51KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGVkaXRTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2ODYyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHN0YXR1cyBsaW5lIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIGEgVG9vbEl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUzIHsKLQkKLXN0YXRpYyBTdHJpbmcgc3RhdHVzVGV4dCA9ICIiOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotICAgIGZpbmFsIFRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIGJhci5zZXRCb3VuZHMoMTAsIDEwLCAxNTAsIDUwKTsKLSAgICBmaW5hbCBMYWJlbCBzdGF0dXNMaW5lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICBzdGF0dXNMaW5lLnNldEJvdW5kcygxMCwgOTAsIDE1MCwgMzApOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDEiKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAyIik7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMyIpOwotICAgIGJhci5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIFRvb2xJdGVtIGl0ZW0gPSBiYXIuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGl0ZW0uZ2V0VGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdGF0dXNUZXh0LmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c0xpbmUuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0pOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5N2NhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZW1iZWQgYSBKVGFibGUgaW4gU1dUIChubyBmbGlja2VyKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5QYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBTV1QuRU1CRURERUQpOwotCQkKLQkJLyoKLQkJKiBTZXQgYSBXaW5kb3dzIHNwZWNpZmljIEFXVCBwcm9wZXJ0eSB0aGF0IHByZXZlbnRzIGhlYXZ5d2VpZ2h0Ci0JCSogY29tcG9uZW50cyBmcm9tIGVyYXNpbmcgdGhlaXIgYmFja2dyb3VuZC4gTm90ZSB0aGF0IHRoaXMKLQkJKiBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBhbmQgY2Fubm90IGJlIHNjb3BlZC4gSXQgbWlnaHQgbm90IGJlCi0JCSogc3VpdGFibGUgZm9yIHlvdXIgYXBwbGljYXRpb24uCi0JCSovCi0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoInN1bi5hd3Qubm9lcmFzZWJhY2tncm91bmQiLCJ0cnVlIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGVycm9yKSB7fQotCi0JCS8qIENyZWF0ZSBhbmQgc2V0dGluZyB1cCBmcmFtZSAqLwotCQlGcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXBvc2l0ZSk7Ci0JCVBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSkgewotCQkJcHVibGljIHZvaWQgdXBkYXRlKGphdmEuYXd0LkdyYXBoaWNzIGcpIHsKLQkJCQkvKiBEbyBub3QgZXJhc2UgdGhlIGJhY2tncm91bmQgKi8gCi0JCQkJcGFpbnQoZyk7Ci0JCQl9Ci0JCX07Ci0JCWZyYW1lLmFkZChwYW5lbCk7Ci0JCUpSb290UGFuZSByb290ID0gbmV3IEpSb290UGFuZSgpOwotCQlwYW5lbC5hZGQocm9vdCk7Ci0JCWphdmEuYXd0LkNvbnRhaW5lciBjb250ZW50UGFuZSA9IHJvb3QuZ2V0Q29udGVudFBhbmUoKTsKLQotCQkvKiBDcmVhdGluZyBjb21wb25lbnRzICovCi0JCWludCBucm93cyA9IDEwMDAsIG5jb2x1bW5zID0gMTA7Ci0JCVZlY3RvciByb3dzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5yb3dzOyBpKyspIHsKLQkJCVZlY3RvciByb3cgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG5jb2x1bW5zOyBqKyspIHsKLQkJCQlyb3cuYWRkRWxlbWVudCgiSXRlbSAiICsgaSArICItIiArIGopOwotCQkJfQotCQkJcm93cy5hZGRFbGVtZW50KHJvdyk7Ci0JCX0KLQkJVmVjdG9yIGNvbHVtbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbHVtbnM7IGkrKykgewotCQkJY29sdW1ucy5hZGRFbGVtZW50KCJDb2x1bW4gIiArIGkpOwotCQl9Ci0JCUpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUocm93cywgY29sdW1ucyk7Ci0JCXRhYmxlLnNldEF1dG9SZXNpemVNb2RlKEpUYWJsZS5BVVRPX1JFU0laRV9PRkYpOwotCQl0YWJsZS5jcmVhdGVEZWZhdWx0Q29sdW1uc0Zyb21Nb2RlbCgpOwotCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRhYmxlKTsKLQkJY29udGVudFBhbmUuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWNvbnRlbnRQYW5lLmFkZChzY3JvbGxQYW5lKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjNkOGVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYW4gWCB1c2luZyBBV1QgR3JhcGhpY3MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5DYW52YXM7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRU1CRURERUQpOwotCQkKLQkJLyogRHJhdyBhbiBYIHVzaW5nIEFXVCAqLwotCQlGcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXBvc2l0ZSk7Ci0JCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnQgKEdyYXBoaWNzIGcpIHsKLQkJCQlEaW1lbnNpb24gZCA9IGdldFNpemUoKTsKLQkJCQlnLmRyYXdMaW5lKDAsIDAsIGQud2lkdGgsIGQuaGVpZ2h0KTsKLQkJCQlnLmRyYXdMaW5lKGQud2lkdGgsIDAsIDAsIGQuaGVpZ2h0KTsKLQkJCX0KLQkJfTsKLQkJZnJhbWUuYWRkKGNhbnZhcyk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NWUzOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGNvbnZlcnQgYmV0d2VlbiBTV1QgSW1hZ2UgYW5kIEFXVCBCdWZmZXJlZEltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuRGlyZWN0Q29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbmRleENvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NiB7Ci0JCi1zdGF0aWMgQnVmZmVyZWRJbWFnZSBjb252ZXJ0VG9BV1QoSW1hZ2VEYXRhIGRhdGEpIHsKLQlDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSBudWxsOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBkYXRhLnBhbGV0dGU7Ci0JaWYgKHBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJY29sb3JNb2RlbCA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHBhbGV0dGUucmVkTWFzaywgcGFsZXR0ZS5ncmVlbk1hc2ssIHBhbGV0dGUuYmx1ZU1hc2spOwotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShjb2xvck1vZGVsLCBjb2xvck1vZGVsLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihkYXRhLndpZHRoLCBkYXRhLmhlaWdodCksIGZhbHNlLCBudWxsKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbM107Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcGl4ZWwgPSBkYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJCVJHQiByZ2IgPSBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci0JCQkJcGl4ZWxBcnJheVswXSA9IHJnYi5yZWQ7Ci0JCQkJcGl4ZWxBcnJheVsxXSA9IHJnYi5ncmVlbjsKLQkJCQlwaXhlbEFycmF5WzJdID0gcmdiLmJsdWU7Ci0JCQkJcmFzdGVyLnNldFBpeGVscyh4LCB5LCAxLCAxLCBwaXhlbEFycmF5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9IGVsc2UgewotCQlSR0JbXSByZ2JzID0gcGFsZXR0ZS5nZXRSR0JzKCk7Ci0JCWJ5dGVbXSByZWQgPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWJ5dGVbXSBncmVlbiA9IG5ldyBieXRlW3JnYnMubGVuZ3RoXTsKLQkJYnl0ZVtdIGJsdWUgPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmdicy5sZW5ndGg7IGkrKykgewotCQkJUkdCIHJnYiA9IHJnYnNbaV07Ci0JCQlyZWRbaV0gPSAoYnl0ZSlyZ2IucmVkOwotCQkJZ3JlZW5baV0gPSAoYnl0ZSlyZ2IuZ3JlZW47Ci0JCQlibHVlW2ldID0gKGJ5dGUpcmdiLmJsdWU7Ci0JCX0KLQkJaWYgKGRhdGEudHJhbnNwYXJlbnRQaXhlbCAhPSAtMSkgewotCQkJY29sb3JNb2RlbCA9IG5ldyBJbmRleENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcmdicy5sZW5ndGgsIHJlZCwgZ3JlZW4sIGJsdWUsIGRhdGEudHJhbnNwYXJlbnRQaXhlbCk7Ci0JCX0gZWxzZSB7Ci0JCQljb2xvck1vZGVsID0gbmV3IEluZGV4Q29sb3JNb2RlbChkYXRhLmRlcHRoLCByZ2JzLmxlbmd0aCwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCX0JCQotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShjb2xvck1vZGVsLCBjb2xvck1vZGVsLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihkYXRhLndpZHRoLCBkYXRhLmhlaWdodCksIGZhbHNlLCBudWxsKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbMV07Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcGl4ZWwgPSBkYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJCXBpeGVsQXJyYXlbMF0gPSBwaXhlbDsKLQkJCQlyYXN0ZXIuc2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfQotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIGNvbnZlcnRUb1NXVChCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UpIHsKLQlpZiAoYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCkgaW5zdGFuY2VvZiBEaXJlY3RDb2xvck1vZGVsKSB7Ci0JCURpcmVjdENvbG9yTW9kZWwgY29sb3JNb2RlbCA9IChEaXJlY3RDb2xvck1vZGVsKWJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOwotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKGNvbG9yTW9kZWwuZ2V0UmVkTWFzaygpLCBjb2xvck1vZGVsLmdldEdyZWVuTWFzaygpLCBjb2xvck1vZGVsLmdldEJsdWVNYXNrKCkpOwotCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoYnVmZmVyZWRJbWFnZS5nZXRXaWR0aCgpLCBidWZmZXJlZEltYWdlLmdldEhlaWdodCgpLCBjb2xvck1vZGVsLmdldFBpeGVsU2l6ZSgpLCBwYWxldHRlKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbM107Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlyYXN0ZXIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKHBpeGVsQXJyYXlbMF0sIHBpeGVsQXJyYXlbMV0sIHBpeGVsQXJyYXlbMl0pKTsKLQkJCQlkYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBkYXRhOwkJCi0JfSBlbHNlIGlmIChidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKSBpbnN0YW5jZW9mIEluZGV4Q29sb3JNb2RlbCkgewotCQlJbmRleENvbG9yTW9kZWwgY29sb3JNb2RlbCA9IChJbmRleENvbG9yTW9kZWwpYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCk7Ci0JCWludCBzaXplID0gY29sb3JNb2RlbC5nZXRNYXBTaXplKCk7Ci0JCWJ5dGVbXSByZWRzID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWJ5dGVbXSBncmVlbnMgPSBuZXcgYnl0ZVtzaXplXTsKLQkJYnl0ZVtdIGJsdWVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWNvbG9yTW9kZWwuZ2V0UmVkcyhyZWRzKTsKLQkJY29sb3JNb2RlbC5nZXRHcmVlbnMoZ3JlZW5zKTsKLQkJY29sb3JNb2RlbC5nZXRCbHVlcyhibHVlcyk7Ci0JCVJHQltdIHJnYnMgPSBuZXcgUkdCW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCXJnYnNbaV0gPSBuZXcgUkdCKHJlZHNbaV0gJiAweEZGLCBncmVlbnNbaV0gJiAweEZGLCBibHVlc1tpXSAmIDB4RkYpOwotCQl9Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShidWZmZXJlZEltYWdlLmdldFdpZHRoKCksIGJ1ZmZlcmVkSW1hZ2UuZ2V0SGVpZ2h0KCksIGNvbG9yTW9kZWwuZ2V0UGl4ZWxTaXplKCksIHBhbGV0dGUpOwotCQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSBjb2xvck1vZGVsLmdldFRyYW5zcGFyZW50UGl4ZWwoKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbMV07Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlyYXN0ZXIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQkJZGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbEFycmF5WzBdKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXN0YXRpYyBJbWFnZURhdGEgY3JlYXRlU2FtcGxlSW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAwLCAxMDApOwotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShib3VuZHMpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQlnYy5maWxsT3ZhbCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZHJhd0xpbmUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5kcmF3TGluZShib3VuZHMud2lkdGgsIDAsIDAsIGJvdW5kcy5oZWlnaHQpOwotCWdjLmRpc3Bvc2UoKTsKLQlJbWFnZURhdGEgZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU1dUIEltYWdlIik7Ci0JSW1hZ2VEYXRhIGRhdGE7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBhcmdzWzBdOwotCQlkYXRhID0gbmV3IEltYWdlRGF0YShmaWxlTmFtZSk7Ci0JfSBlbHNlIHsKLQkJZGF0YSA9IGNyZWF0ZVNhbXBsZUltYWdlKGRpc3BsYXkpOwotCX0KLQlmaW5hbCBJbWFnZSBzd3RJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlmaW5hbCBCdWZmZXJlZEltYWdlIGF3dEltYWdlID0gY29udmVydFRvQVdUKGRhdGEpOwotCWZpbmFsIEltYWdlIHN3dEltYWdlMiA9IG5ldyBJbWFnZShkaXNwbGF5LCBjb252ZXJ0VG9TV1QoYXd0SW1hZ2UpKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaW50IHkgPSAxMDsKLQkJCWlmIChzd3RJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZS5nYy5kcmF3SW1hZ2Uoc3d0SW1hZ2UsIDEwLCB5KTsKLQkJCQl5ICs9IHN3dEltYWdlLmdldEJvdW5kcygpLmhlaWdodCArIDEwOwotCQkJfQotCQkJaWYgKHN3dEltYWdlMiAhPSBudWxsKSB7Ci0JCQkJZS5nYy5kcmF3SW1hZ2Uoc3d0SW1hZ2UyLCAxMCwgeSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZSgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotCQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQkJaWYgKGF3dEltYWdlICE9IG51bGwpIHsKLQkJCQlnLmRyYXdJbWFnZShhd3RJbWFnZSwgMTAgKyBpbnNldHMubGVmdCwgMTAgKyBpbnNldHMudG9wLCBudWxsKTsKLQkJCX0KLQkJfQotCX07Ci0JZnJhbWUuc2V0VGl0bGUoIkFXVCBJbWFnZSIpOwotCXNoZWxsLnNldExvY2F0aW9uKDUwLCA1MCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHN3dEltYWdlLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoYm91bmRzLndpZHRoICsgNTAsIGJvdW5kcy5oZWlnaHQgKiAyICsgMTAwKTsKLQlQb2ludCBzaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCVBvaW50IGxvY2F0aW9uID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQlJbnNldHMgaW5zZXRzID0gZnJhbWUuZ2V0SW5zZXRzKCk7Ci0JZnJhbWUuc2V0TG9jYXRpb24obG9jYXRpb24ueCArIHNpemUueCArIDEwLCBsb2NhdGlvbi55KTsKLQlmcmFtZS5zZXRTaXplKHNpemUueCAtIChpbnNldHMubGVmdCArIGluc2V0cy5yaWdodCksIHNpemUueSAtIChpbnNldHMudG9wICsgaW5zZXRzLmJvdHRvbSkpOwotCWZyYW1lLnNldFZpc2libGUodHJ1ZSk7CQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaWYgKHN3dEltYWdlICE9IG51bGwpIHN3dEltYWdlLmRpc3Bvc2UoKTsKLQlpZiAoc3d0SW1hZ2UyICE9IG51bGwpIHN3dEltYWdlLmRpc3Bvc2UoKTsKLQlmcmFtZS5kaXNwb3NlKCk7Ci0JU3lzdGVtLmV4aXQoMCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWRhNjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogRW1iZWQgV29yZCBpbiBhbiBhcHBsZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQkKLWltcG9ydCBqYXZhLmFwcGxldC4qOwotCSAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU3IGV4dGVuZHMgQXBwbGV0IHsKLQkKLQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5IGRpc3BsYXk7Ci0Jb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgc3d0UGFyZW50OwotCWphdmEuYXd0LkNhbnZhcyBhd3RQYXJlbnQ7Ci0KLXB1YmxpYyB2b2lkIGluaXQgKCkgewotCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkIChuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJc2V0TGF5b3V0KG5ldyBqYXZhLmF3dC5HcmlkTGF5b3V0ICgxLCAxKSk7Ci0JCQlhd3RQYXJlbnQgPSBuZXcgamF2YS5hd3QuQ2FudmFzICgpOwotCQkJYWRkIChhd3RQYXJlbnQpOwotCQkJZGlzcGxheSA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5ICgpOwotCQkJc3d0UGFyZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdULm5ld19TaGVsbCAoZGlzcGxheSwgYXd0UGFyZW50KTsKLQkJCXN3dFBhcmVudC5zZXRMYXlvdXQgKG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQgKCkpOwotCQkJb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZSBmcmFtZSA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lIChzd3RQYXJlbnQsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9ORSk7Ci0JCQlvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUgc2l0ZTsKLQkJCXRyeSB7Ci0JCQkJc2l0ZSA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUgKGZyYW1lLCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PTkUsICJXb3JkLkRvY3VtZW50Iik7Ci0JCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgc3RyID0gIkNyZWF0ZSBPbGVDbGllbnRTaXRlIEVycm9yIiArIGUudG9TdHJpbmcgKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuIChzdHIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXNldFNpemUgKDUwMCwgNTAwKTsKLQkJCXZhbGlkYXRlICgpOwotCQkJc2l0ZS5kb1ZlcmIgKG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFLk9MRUlWRVJCX1NIT1cpOwotCQkJCi0JCQl3aGlsZSAoc3d0UGFyZW50ICE9IG51bGwgJiYgIXN3dFBhcmVudC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsJCQotCQkJfQkKLQkJfQotCX0pOwotCXRocmVhZC5zdGFydCAoKTsKLX0KLSBwdWJsaWMgdm9pZCBzdG9wICgpewotIAlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQgKCkpewotIAkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUgKCkgewotIAkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0gCQkJCWlmIChzd3RQYXJlbnQgIT0gbnVsbCAmJiAhc3d0UGFyZW50LmlzRGlzcG9zZWQgKCkpIHN3dFBhcmVudC5kaXNwb3NlICgpOwotIAkJCQlzd3RQYXJlbnQgPSBudWxsOwotIAkJCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0gCQkJCWRpc3BsYXkgPSBudWxsOwotIAkJCX0KLSAJCX0pOwotIAkJcmVtb3ZlIChhd3RQYXJlbnQpOwotIAkJYXd0UGFyZW50ID0gbnVsbDsKLSAJfQotIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGU4M2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRldGVybWluZSBuYXRpdmUgZGF0YSB0eXBlcyBhdmFpbGFibGUgKG1vdGlmIG9ubHkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTggZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXByaXZhdGUgc3RhdGljIFNuaXBwZXQxNTggX2luc3RhbmNlID0gbmV3IFNuaXBwZXQxNTgoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0MTU4LmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewkJCQotCQkJU3RyaW5nIG9wcyA9ICIiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgb3BzICs9ICJDb3B5OyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSBvcHMgKz0gIk1vdmU7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIG9wcyArPSAiTGluazsiOwotCQkJY29udHJvbC5yZW1vdmVBbGwoKTsKLQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQlpdGVtMS5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbnMgYXJlICIrb3BzKTsKLQkJCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVRyYW5zZmVyRGF0YVtdIGRhdGEgPSBldmVudC5kYXRhVHlwZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaWQgPSBkYXRhW2ldLnR5cGU7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lRnJvbUlkKGlkKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJCWl0ZW0yLnNldFRleHQoIkRhdGEgdHlwZSBpcyAiK2lkKyIgIituYW1lKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFNuaXBwZXQxNTggZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1TbmlwcGV0MTU4KCkgewotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsKLQlyZXR1cm4gIkhlbGxvIFdvcmxkIjsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmFtZXM7Ci19Ci1zdGF0aWMgaW50IHNoZWxsSGFuZGxlOwotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlpZiAoaWRzID09IG51bGwpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWludCB3aWRnZXRDbGFzcyA9IE9TLnRvcExldmVsU2hlbGxXaWRnZXRDbGFzcyAoKTsKLQkJc2hlbGxIYW5kbGUgPSBPUy5YdEFwcENyZWF0ZVNoZWxsIChudWxsLCBudWxsLCB3aWRnZXRDbGFzcywgZGlzcGxheS54RGlzcGxheSwgbnVsbCwgMCk7Ci0JCU9TLlh0U2V0TWFwcGVkV2hlbk1hbmFnZWQgKHNoZWxsSGFuZGxlLCBmYWxzZSk7Ci0JCU9TLlh0UmVhbGl6ZVdpZGdldCAoc2hlbGxIYW5kbGUpOwotCQkKLQkJaWRzID0gbmV3IGludFs4NDBdOwotCQluYW1lcyA9IG5ldyBTdHJpbmdbODQwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlkc1tpXSA9IGkraTsKLQkJCW5hbWVzW2ldID0gZ2V0TmFtZUZyb21JZChpKzEpOwotCQl9Ci0JfQotCXJldHVybiBpZHM7Ci19Ci1zdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSWQoaW50IGlkKSB7Ci0JaW50IHhEaXNwbGF5ID0gT1MuWHREaXNwbGF5IChzaGVsbEhhbmRsZSk7Ci0JaW50IHB0ciA9IDA7Ci0JdHJ5IHsKLQkJcHRyID0gT1MuWG1HZXRBdG9tTmFtZSh4RGlzcGxheSwgaWQpOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JfQotCWlmIChwdHIgPT0gMCkgcmV0dXJuICJpbnZhbGlkICIraWQ7Ci0JaW50IGxlbmd0aCA9IE9TLnN0cmxlbihwdHIpOwotCWJ5dGVbXSBuYW1lQnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQlPUy5tZW1tb3ZlKG5hbWVCdWYsIHB0ciwgbGVuZ3RoKTsKLQlPUy5YRnJlZShwdHIpOwotCXJldHVybiBuZXcgU3RyaW5nKENvbnZlcnRlci5tYmNzVG9XY3MobnVsbCwgbmFtZUJ1ZikpLnRvTG93ZXJDYXNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDZkMGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgSFRNTCB0aXRsZSB0YWcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIG5ld1RpdGxlID0gIk5ldyBWYWx1ZSBmb3IgVGl0bGUiOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlRXZlbnQ6ICIrZXZlbnQudGl0bGUpOwotCQkJCXNoZWxsLnNldFRleHQoZXZlbnQudGl0bGUpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qIFNldCBIVE1MIHRpdGxlIHRhZyB1c2luZyBKYXZhU2NyaXB0IGFuZCBET00gd2hlbiBwYWdlIGhhcyBiZWVuIGxvYWRlZCAqLwotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKCJkb2N1bWVudC50aXRsZT0nIituZXdUaXRsZSsiJyIpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvKiBMb2FkIGFuIEhUTUwgZG9jdW1lbnQgKi8KLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2Y2EzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBvbmUgcmVwZWF0aW5nIHRpbWVyIChldmVyeSA1MDAgbXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgaW50IHRpbWUgPSA1MDA7Ci0JUnVubmFibGUgdGltZXIgPSBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJUG9pbnQgcG9pbnQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uICgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRCb3VuZHMgKCk7Ci0JCQlpZiAocmVjdC5jb250YWlucyAocG9pbnQpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiSW4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiT3V0Iik7Ci0JCQl9Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGhpcyk7Ci0JCX0KLQl9OwotCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aW1lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwkKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWU3ZmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBxdWVyeSBET00gbm9kZSB2YWx1ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgaHRtbCA9ICI8aHRtbD48dGl0bGU+U25pcHBldDwvdGl0bGU+PGJvZHk+PHAgaWQ9J215aWQnPkJlc3QgRnJpZW5kczwvcD48cCBpZD0nbXlpZDInPkNhdCBhbmQgRG9nPC9wPjwvYm9keT48L2h0bWw+IjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJxdWVyeSIsIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qIAotCQkJCSAqIFVzZSBKYXZhU2NyaXB0IHRvIHF1ZXJ5IHRoZSBkZXNpcmVkIG5vZGUgY29udGVudCB0aHJvdWdoIHRoZSBEb2N1bWVudCBPYmplY3QgTW9kZWwKLQkJCQkgKiAKLQkJCQkgKiBBc3NpZ24gcmVzdWx0IHRvIHRoZSB3aW5kb3cgcHJvcGVydHkgc3RhdHVzIHRvIHBhc3MgdGhlIHJlc3VsdCB0byB0aGUgU3RhdHVzVGV4dExpc3RlbmVyCi0JCQkJICogVGhpcyB0cmljayBpcyByZXF1aXJlZCBzaW5jZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBkb2VzIG5vdCByZXR1cm4gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KLQkJCQkgKiBkaXJlY3RseS4KLQkJCQkgKi8KLQkJCQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuZXhlY3V0ZSgid2luZG93LnN0YXR1cz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOyIpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWJyb3dzZXIuZ2V0RGF0YSgicXVlcnkiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgdmFsdWU6ICIrdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJLyogTG9hZCBhbiBIVE1MIGRvY3VtZW50ICovCi0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmY1ZTlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogbW9kaWZ5IERPTSAoZXhlY3V0aW5nIGphdmFzY3JpcHQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjEgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBodG1sID0gIjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4iOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULk1VTFRJKTsKLQkJdGV4dC5zZXRUZXh0KCJ2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTsgXHJcbiIrCi0JCQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0F0IGxlYXN0IHdoZW4gSSBhbSBhcm91bmQnKTtcclxuIisKLQkJCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuIisKLQkJCQkiXHJcbiIrCi0JCQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7Iik7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkV4ZWN1dGUgU2NyaXB0Iik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQkvKiBTY3JpcHQgbWF5IGZhaWwgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMuICovCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2NyaXB0IHdhcyBub3QgZXhlY3V0ZWQuIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDI4NmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBZGRpbmcgYW4gYWNjZXNzaWJsZSBsaXN0ZW5lciB0byBwcm92aWRlIHN0YXRlIGluZm9ybWF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYyIHsKLQotZmluYWwgc3RhdGljIFN0cmluZyBTVEFURSA9ICJDaGVja2VkSW5kaWNlcyI7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGNoZWNrZWRJbWFnZSA9IGdldENoZWNrZWRJbWFnZSAoZGlzcGxheSk7Ci0JSW1hZ2UgdW5jaGVja2VkSW1hZ2UgPSBnZXRVbmNoZWNrZWRJbWFnZSAoZGlzcGxheSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQlpdGVtMS5zZXRUZXh0IChuZXcgU3RyaW5nIFtdIHsiZmlyc3QgaXRlbSIsICJhIiwgImIifSk7Ci0JaXRlbTEuc2V0SW1hZ2UgKDEsIHVuY2hlY2tlZEltYWdlKTsKLQlpdGVtMS5zZXRJbWFnZSAoMiwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0xLnNldERhdGEgKFNUQVRFLCBudWxsKTsKLQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0yLnNldFRleHQgKG5ldyBTdHJpbmcgW10geyJzZWNvbmQgaXRlbSIsICJjIiwgImQifSk7Ci0JaXRlbTIuc2V0SW1hZ2UgKDEsIHVuY2hlY2tlZEltYWdlKTsKLQlpdGVtMi5zZXRJbWFnZSAoMiwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMi5zZXREYXRhIChTVEFURSwgbmV3IGludCBbXSB7Mn0pOwotCVRhYmxlSXRlbSBpdGVtMyA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbTMuc2V0VGV4dCAobmV3IFN0cmluZyBbXSB7InRoaXJkIiwgImUiLCAiZiJ9KTsKLQlpdGVtMy5zZXRJbWFnZSAoMSwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMy5zZXRJbWFnZSAoMiwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMy5zZXREYXRhIChTVEFURSwgbmV3IGludCBbXSB7MSwgMn0pOwotCWNvbHVtbjEucGFjayAoKTsKLQljb2x1bW4yLnBhY2sgKCk7Ci0JY29sdW1uMy5wYWNrICgpOwotCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IHRhYmxlLmdldEFjY2Vzc2libGUgKCk7Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQlzdXBlci5nZXROYW1lIChlKTsKLQkJCWlmIChlLmNoaWxkSUQgPj0gMCAmJiBlLmNoaWxkSUQgPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGUuY2hpbGRJRCk7Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uICgpOwotCQkJCXB0ID0gZGlzcGxheS5tYXAgKG51bGwsIHRhYmxlLCBwdCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCQkJCWlmIChpdGVtLmdldEJvdW5kcyAoaSkuY29udGFpbnMgKHB0KSkgewotCQkJCQkJaW50IFtdIGRhdGEgPSAoaW50IFtdKSBpdGVtLmdldERhdGEgKFNUQVRFKTsKLQkJCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGZhbHNlOwotCQkJCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykgewotCQkJCQkJCQlpZiAoZGF0YSBbal0gPT0gaSkgewotCQkJCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWUucmVzdWx0ID0gaXRlbS5nZXRUZXh0IChpKSArICIgIiArIChjaGVja2VkID8gImNoZWNrZWQiIDogInVuY2hlY2tlZCIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlzdXBlci5nZXRTdGF0ZSAoZSk7Ci0JCQlpZiAoZS5jaGlsZElEID49IDAgJiYgZS5jaGlsZElEIDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChlLmNoaWxkSUQpOwotCQkJCWludCBbXSBkYXRhID0gKGludCBbXSkgaXRlbS5nZXREYXRhIChTVEFURSk7Ci0JCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJCXB0ID0gZGlzcGxheS5tYXAgKG51bGwsIHRhYmxlLCBwdCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzIChkYXRhIFtpXSkuY29udGFpbnMgKHB0KSkgewotCQkJCQkJCWUuZGV0YWlsIHw9IEFDQy5TVEFURV9DSEVDS0VEOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2hlY2tlZEltYWdlLmRpc3Bvc2UgKCk7Ci0JdW5jaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXN0YXRpYyBJbWFnZSBnZXRDaGVja2VkSW1hZ2UgKERpc3BsYXkgZGlzcGxheSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxPdmFsICgwLCAwLCAxNiwgMTYpOwotCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9EQVJLX0dSRUVOKSk7Ci0JZ2MuZHJhd0xpbmUgKDAsIDAsIDE2LCAxNik7Ci0JZ2MuZHJhd0xpbmUgKDE2LCAwLCAwLCAxNik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLXN0YXRpYyBJbWFnZSBnZXRVbmNoZWNrZWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdmZDRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTZXR0aW5nIHRoZSBmb250IHN0eWxlLCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyBvZiBTdHlsZWRUZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkgQUJDREVGR0hJSktMTSBOT1BRUlNUVVZXWFlaIik7Ci0JLy8gbWFrZSAwMTIzNDU2Nzg5IGFwcGVhciBib2xkCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5zdGFydCA9IDA7Ci0Jc3R5bGUxLmxlbmd0aCA9IDEwOwotCXN0eWxlMS5mb250U3R5bGUgPSBTV1QuQk9MRDsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUxKTsKLQkvLyBtYWtlIEFCQ0RFRkdISUpLTE0gaGF2ZSBhIHJlZCBmb250Ci0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5zdGFydCA9IDExOwotCXN0eWxlMi5sZW5ndGggPSAxMzsKLQlzdHlsZTIuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMik7Ci0JLy8gbWFrZSBOT1BRUlNUVVZXWFlaIGhhdmUgYSBibHVlIGJhY2tncm91bmQKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLnN0YXJ0ID0gMjU7Ci0Jc3R5bGUzLmxlbmd0aCA9IDEzOwotCXN0eWxlMy5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMyk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5NDVmNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogT3ZlcnJpZGUgdGhlIHRleHQgdGhhdCBpcyBzcG9rZW4gZm9yIGEgbmF0aXZlIEJ1dHRvbi4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLQotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQoIiZUeXBpY2FsIGJ1dHRvbiIpOwotCWJ1dHRvbjEuc2V0Qm91bmRzKDEwLDEwLDE4MCwzMCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCgiJk92ZXJpZGRlbiBidXR0b24iKTsKLQlidXR0b24yLnNldEJvdW5kcygxMCw1MCwxODAsMzApOwotCWJ1dHRvbjIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gIlNwZWFrIHRoaXMgaW5zdGVhZCBvZiB0aGUgYnV0dG9uIHRleHQiOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjYjE4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgQ1RhYkZvbGRlciB3aXRoIG1pbiBhbmQgbWF4IGJ1dHRvbnMsIGFzIHdlbGwgYXMgY2xvc2UgYnV0dG9uIGFuZCAKLSAqIGltYWdlIG9ubHkgb24gc2VsZWN0ZWQgdGFiLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDE2LCAxNik7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDMsIDMsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQlmb2xkZXIuc2V0U2ltcGxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZShmYWxzZSk7Ci0JZm9sZGVyLnNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUoZmFsc2UpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuQ0xPU0UpOwotCQlpdGVtLnNldFRleHQoIkl0ZW0gIitpKTsKLQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdGV4dC5zZXRUZXh0KCJUZXh0IGZvciBpdGVtICIraSsiXG5cbm9uZSwgdHdvLCB0aHJlZVxuXG5hYmNkZWZnaGlqa2xtbm9wIik7Ci0JCWl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQl9Ci0JZm9sZGVyLnNldE1pbmltaXplVmlzaWJsZSh0cnVlKTsKLQlmb2xkZXIuc2V0TWF4aW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5hZGRDVGFiRm9sZGVyMkxpc3RlbmVyKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1pbmltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZCh0cnVlKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtYXhpbWl6ZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWZvbGRlci5zZXRNYXhpbWl6ZWQodHJ1ZSk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVzdG9yZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWZvbGRlci5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotCQkJZm9sZGVyLnNldE1heGltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3MjdmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgU2Nyb2xsZWRDb21wb3NpdGUgd2l0aCB3cmFwcGluZyBjb250ZW50LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UxID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XT1JLSU5HKTsKLQlJbWFnZSBpbWFnZTIgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKTsKLQlJbWFnZSBpbWFnZTMgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcG9zaXRlID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQotCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWZvcihpbnQgaSA9IDA7IGkgPD0gNTA7IGkrKykgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJaWYgKGkgJSAzID09IDApIGxhYmVsLnNldEltYWdlKGltYWdlMSk7Ci0JCWlmIChpICUgMyA9PSAxKSBsYWJlbC5zZXRJbWFnZShpbWFnZTIpOwotCQlpZiAoaSAlIDMgPT0gMikgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UzKTsKLQl9Ci0JUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0Jc2Nyb2xsQ29tcG9zaXRlLnNldENvbnRlbnQocGFyZW50KTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0Jc2Nyb2xsQ29tcG9zaXRlLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Nyb2xsQ29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgciA9IHNjcm9sbENvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlzY3JvbGxDb21wb3NpdGUuc2V0TWluU2l6ZShwYXJlbnQuY29tcHV0ZVNpemUoci53aWR0aCwgU1dULkRFRkFVTFQpKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyMTFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgdHdvIFNjcm9sbGVkQ29tcG9zaXRlcyB0aGF0IHNjcm9sbCBpbiB0YW5kZW0uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzYzEsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWJ1dHRvbjEuc2V0U2l6ZSAoNDAwLCAzMDApOwotCXNjMS5zZXRDb250ZW50IChidXR0b24xKTsKLQotCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMiA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzYzIsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJCdXR0b24gMiIpOwotCWJ1dHRvbjIuc2V0U2l6ZSAoMzAwLCA0MDApOwotCXNjMi5zZXRDb250ZW50IChidXR0b24yKTsKLQotCWZpbmFsIFNjcm9sbEJhciB2QmFyMSA9IHNjMS5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhcjIgPSBzYzIuZ2V0VmVydGljYWxCYXIgKCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIxID0gc2MxLmdldEhvcml6b250YWxCYXIgKCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIyID0gc2MyLmdldEhvcml6b250YWxCYXIgKCk7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHggPSAgaEJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAoaEJhcjIuZ2V0TWF4aW11bSgpIC0gaEJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCBoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKTsKLQkJCWludCB5ID0gIHZCYXIxLmdldFNlbGVjdGlvbigpICogKHZCYXIyLmdldE1heGltdW0oKSAtIHZCYXIyLmdldFRodW1iKCkpIC8gTWF0aC5tYXgoMSwgdkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSk7Ci0JCQlzYzIuc2V0T3JpZ2luICh4LCB5KTsKLQkJfQotCX07Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHggPSAgaEJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAoaEJhcjEuZ2V0TWF4aW11bSgpIC0gaEJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCBoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKTsKLQkJCWludCB5ID0gIHZCYXIyLmdldFNlbGVjdGlvbigpICogKHZCYXIxLmdldE1heGltdW0oKSAtIHZCYXIxLmdldFRodW1iKCkpIC8gTWF0aC5tYXgoMSwgdkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSk7Ci0JCQlzYzEuc2V0T3JpZ2luICh4LCB5KTsKLQkJfQotCX07Ci0JdkJhcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMSk7Ci0JaEJhcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMSk7Ci0JdkJhcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMik7Ci0JaEJhcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMik7Ci0KLQlzaGVsbC5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTcyNmQzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmF3IGxpbmVzIGFuZCBwb2x5Z29ucyB3aXRoIGRpZmZlcmVudCBjYXAgYW5kIGpvaW4gc3R5bGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IHggPSAyMCwgeSA9IDIwLCB3ID0gMTIwLCBoID0gNjA7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQlnYy5zZXRMaW5lV2lkdGgoMTApOwotCQkJaW50W10gY2FwcyA9IHtTV1QuQ0FQX0ZMQVQsIFNXVC5DQVBfUk9VTkQsIFNXVC5DQVBfU1FVQVJFfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2Fwcy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVDYXAoY2Fwc1tpXSk7Ci0JCQkJZ2MuZHJhd0xpbmUoeCwgeSwgeCArIHcsIHkpOwotCQkJCXkgKz0gMjA7Ci0JCQl9Ci0JCQlpbnRbXSBqb2lucyA9IHtTV1QuSk9JTl9CRVZFTCwgU1dULkpPSU5fTUlURVIsIFNXVC5KT0lOX1JPVU5EfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlnYy5zZXRMaW5lSm9pbihqb2luc1tpXSk7Ci0JCQkJZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHt4LCB5LCB4ICsgdy8yLCB5ICsgaCwgeCArIHcsIHl9KTsKLQkJCQl5ICs9IGggKyAyMDsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9CQkKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTMyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIHRvZ2dsZSBidXR0b24gaGF2ZSByYWRpbyBiZWhhdmlvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IHNoZWxsLmdldENoaWxkcmVuICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtpXTsKLQkJCQlpZiAoZS53aWRnZXQgIT0gY2hpbGQgJiYgY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24gJiYgKGNoaWxkLmdldFN0eWxlICgpICYgU1dULlRPR0dMRSkgIT0gMCkgewotCQkJCQkoKEJ1dHRvbikgY2hpbGQpLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCSgoQnV0dG9uKSBlLndpZGdldCkuc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX07Ci0JZm9yIChpbnQgaT0wOyBpPDIwOyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaWYgKGkgPT0gMCkgYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmY4M2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2xpZGVyIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2Nyb2xsIGV2ZW50IGRldGFpbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlciAoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQlzbGlkZXIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMzIpOwotCXNsaWRlci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlNXVC5OT05FIjsKLQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuRFJBRzogc3RyaW5nID0gIlNXVC5EUkFHIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuSE9NRTogc3RyaW5nID0gIlNXVC5IT01FIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRU5EOiBzdHJpbmcgPSAiU1dULkVORCI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX0RPV046IHN0cmluZyA9ICJTV1QuQVJST1dfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX1VQOiBzdHJpbmcgPSAiU1dULkFSUk9XX1VQIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUEFHRV9ET1dOOiBzdHJpbmcgPSAiU1dULlBBR0VfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBBR0VfVVA6IHN0cmluZyA9ICJTV1QuUEFHRV9VUCI7IGJyZWFrOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2Nyb2xsIGRldGFpbCAtPiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3YjllNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgVHJlZSB3aXRoIGNvbHVtbnMKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzAgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQkJY29sdW1uMy5zZXRUZXh0KCJDb2x1bW4gMyIpOwotCQljb2x1bW4zLnNldFdpZHRoKDIwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyAiaXRlbSAiICsgaSwgImFiYyIsICJkZWZnaGkiIH0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgInN1Yml0ZW0gIiArIGosICJqa2xtbm9wIiwgInFycyIgfSk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKLQkJCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyAic3Vic3ViaXRlbSAiICsgaywgInR1diIsICJ3eHl6IiB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3YmFlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZWZpbmUgZGF0YSB0cmFuc2ZlciB0eXBlcyB0aGF0IHN1YmNsYXNzIGVhY2gKLSAqIG90aGVyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzEgewotCi0vKgotICogVGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgaXMgYW4gPGJvbGQ+YXJyYXkgb2YgdHlwZSBNeVR5cGU8L2JvbGQ+IHdoZXJlCi0gKiBNeVR5cGUgaXMgZGVmaW5lIGFzOgotICovCi1zdGF0aWMgY2xhc3MgTXlUeXBlIHsKLQlTdHJpbmcgZmlsZU5hbWU7Ci0JbG9uZyBmaWxlTGVuZ3RoOwotCWxvbmcgbGFzdE1vZGlmaWVkOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIk15dHlwZVRyYW5zZmVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUcmFuc2ZlcigpOwotCi0JcHVibGljIHN0YXRpYyBUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlieXRlW10gamF2YVRvQnl0ZUFycmF5KE9iamVjdCBvYmplY3QpIHsKLQkJTXlUeXBlIGRhdGEgPSAoTXlUeXBlKSBvYmplY3Q7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCQlieXRlW10gYnVmZmVyID0gZGF0YS5maWxlTmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEuZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5sYXN0TW9kaWZpZWQpOwotCQkJYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCQl3cml0ZU91dC5jbG9zZSgpOwotCQkJcmV0dXJuIGJ1ZmZlcjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCU9iamVjdCBieXRlQXJyYXlUb0phdmEoYnl0ZVtdIGJ5dGVzKSB7Ci0JCU15VHlwZSBkYXRhID0gbmV3IE15VHlwZSgpOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJcmVhZEluLnJlYWQoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZU5hbWUgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCWRhdGEubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlyZWFkSW4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlieXRlW10gYnVmZmVyID0gamF2YVRvQnl0ZUFycmF5KG9iamVjdCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShidWZmZXIsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCWJ5dGVbXSBidWZmZXIgPSAoYnl0ZVtdKSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBieXRlQXJyYXlUb0phdmEoYnVmZmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgTVlUWVBFTkFNRSB9OwotCX0KLQotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgTVlUWVBFSUQgfTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja015VHlwZShvYmplY3QpOwotCX0KLX0KLQotLyoKLSAqIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlMjwvYm9sZD4KLSAqIHdoZXJlIE15VHlwZTIgaXMgZGVmaW5lIGFzOgotICovCi1zdGF0aWMgY2xhc3MgTXlUeXBlMiBleHRlbmRzIE15VHlwZSB7Ci0JU3RyaW5nIHZlcnNpb247Ci19Ci0KLXN0YXRpYyBjbGFzcyBNeVRyYW5zZmVyMiBleHRlbmRzIE15VHJhbnNmZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRTJOQU1FID0gIk15dHlwZTJUcmFuc2ZlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRTJJRCA9IHJlZ2lzdGVyVHlwZShNWVRZUEUyTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUcmFuc2ZlcjIoKTsKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1ZVFlQRTJOQU1FIH07Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBNWVRZUEUySUQgfTsKLQl9Ci0KLQlieXRlW10gamF2YVRvQnl0ZUFycmF5KE9iamVjdCBvYmplY3QpIHsKLQkJTXlUeXBlMiBkYXRhID0gKE15VHlwZTIpIG9iamVjdDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBkYXRhLmZpbGVOYW1lLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5maWxlTGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmxhc3RNb2RpZmllZCk7Ci0JCQlidWZmZXIgPSBkYXRhLnZlcnNpb24uZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCWJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJCXJldHVybiBidWZmZXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlPYmplY3QgYnl0ZUFycmF5VG9KYXZhKGJ5dGVbXSBieXRlcykgewotCQlNeVR5cGUyIGRhdGEgPSBuZXcgTXlUeXBlMigpOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJcmVhZEluLnJlYWQoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZU5hbWUgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCWRhdGEubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJcmVhZEluLnJlYWQoYnVmZmVyKTsKLQkJCWRhdGEudmVyc2lvbiA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFjaGVja015VHlwZTIob2JqZWN0KSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShvYmplY3QsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCi0JYm9vbGVhbiBjaGVja015VHlwZTIoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGUyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrTXlUeXBlMihvYmplY3QpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDEuc2V0VGV4dCgiRHJhZyBTb3VyY2UgZm9yIE15RGF0YSBhbmQgTXlEYXRhMiIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDIuc2V0VGV4dCgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YSIpOwotCWZpbmFsIExhYmVsIGxhYmVsMyA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDMuc2V0VGV4dCgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YTIiKTsKLQotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UobGFiZWwxLCBETkQuRFJPUF9DT1BZKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0JCQlNeVRyYW5zZmVyMi5nZXRJbnN0YW5jZSgpIH0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCU15VHlwZTIgbXlUeXBlID0gbmV3IE15VHlwZTIoKTsKLQkJCW15VHlwZS5maWxlTmFtZSA9ICJDOlxcYWJjLnR4dCI7Ci0JCQlteVR5cGUuZmlsZUxlbmd0aCA9IDEwMDA7Ci0JCQlteVR5cGUubGFzdE1vZGlmaWVkID0gMTIzMTIzMTM7Ci0JCQlteVR5cGUudmVyc2lvbiA9ICJ2ZXJzaW9uIDIiOwotCQkJZXZlbnQuZGF0YSA9IG15VHlwZTsKLQkJfQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0TXlUeXBlID0gbmV3IERyb3BUYXJnZXQobGFiZWwyLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0TXlUeXBlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCXRhcmdldE15VHlwZS5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZSBteVR5cGUgPSAoTXlUeXBlKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk15VHlwZTogIiArIG15VHlwZS5maWxlTmFtZTsKLQkJCQkJbGFiZWwyLnNldFRleHQoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0TXlUeXBlMiA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsMywgRE5ELkRST1BfQ09QWQl8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldE15VHlwZTIuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyMi5nZXRJbnN0YW5jZSgpIH0pOwotCXRhcmdldE15VHlwZTIuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUyIG15VHlwZSA9IChNeVR5cGUyKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk15VHlwZTI6ICIgKyBteVR5cGUuZmlsZU5hbWUgKyAiOiIKLQkJCQkJCQkrIG15VHlwZS52ZXJzaW9uOwotCQkJCQlsYWJlbDMuc2V0VGV4dChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzFlZmY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHcmlkTGF5b3V0IHNuaXBwZXQ6IGFsaWduIHdpZGdldHMgaW4gYSBHcmlkTGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjNiZWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyIChwb3AtdXAgYmxvY2tlcikKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIFdpbmRvdyIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0Jc2hlbGwub3BlbigpOwotCS8qIGFueSB3ZWJzaXRlIHdpdGggcG9wdXBzICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuY25uLmNvbSIpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLS8qIHJlZ2lzdGVyIFdpbmRvd0V2ZW50IGxpc3RlbmVycyAqLwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBEaXNwbGF5IGRpc3BsYXksIEJyb3dzZXIgYnJvd3NlcikgewotCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJc2hlbGwuc2V0VGV4dCgiTmV3IFdpbmRvdyIpOwotCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0JCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkvKiBwb3B1cCBibG9ja2VyIC0gaWdub3JlIHdpbmRvd3Mgd2l0aCBubyBzdHlsZSAqLwotCQkJaWYgKCFldmVudC5hZGRyZXNzQmFyICYmICFldmVudC5tZW51QmFyICYmICFldmVudC5zdGF0dXNCYXIgJiYgIWV2ZW50LnRvb2xCYXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvcHVwIGJsb2NrZWQuIik7Ci0JCQkJZXZlbnQuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpIHNoZWxsLnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLQkJCWlmIChldmVudC5zaXplICE9IG51bGwpIHsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCQl9Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDE0YTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIElCTSBDb3Jwb3JhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogZHJhdyBhIHNxdWFyZQotICogCi0gKiBUaGlzIHNuaXBwZXQgcmVxdWlyZXMgdGhlIGV4cGVyaW1lbnRhbCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsIHBsdWdpbiwgd2hpY2gKLSAqIGlzIG5vdCBpbmNsdWRlZCBpbiBzd3QgYnkgZGVmYXVsdC4gIEZvciBpbmZvcm1hdGlvbiBvbiB0aGlzIHBsdWdpbiBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L29wZW5nbC9vcGVuZ2wuaHRtbCAgCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRUZXh0KCJPcGVuR0wgaW4gU1dUIik7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIEdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSgpOwotICAgIGRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLSAgICBmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoc2hlbGwsIFNXVC5OT19CQUNLR1JPVU5ELCBkYXRhKTsKLSAgICBjYW52YXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgIHJlc2l6ZShjYW52YXMpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgaW5pdChjYW52YXMpOwotICAgIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLSAgICAgICAgICAgIHJlbmRlcigpOwotICAgICAgICAgICAgY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0gICAgICAgICAgICBjYW52YXMuZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyg1MCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9LnJ1bigpOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXQoR0xDYW52YXMgY2FudmFzKSB7Ci0gICAgY2FudmFzLnNldEN1cnJlbnQoKTsKLSAgICByZXNpemUoY2FudmFzKTsKLSAgICBHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0gICAgR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDAuMGYpOwotICAgIEdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLSAgICBHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLSAgICBHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotfQotCi1zdGF0aWMgdm9pZCByZW5kZXIoKSB7Ci0gICAgR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTYuMGYpOwotICAgIEdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotICAgIEdMLmdsVmVydGV4M2YoLTEuMGYsIDEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigxLjBmLCAtMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigtMS4wZiwgLTEuMGYsIDAuMGYpOwotICAgIEdMLmdsRW5kKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2l6ZShHTENhbnZhcyBjYW52YXMpIHsKLSAgICBjYW52YXMuc2V0Q3VycmVudCgpOwotICAgIFJlY3RhbmdsZSByZWN0ID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLSAgICBpbnQgd2lkdGggPSByZWN0LndpZHRoOwotICAgIGludCBoZWlnaHQgPSBNYXRoLm1heChyZWN0LmhlaWdodCwgMSk7Ci0gICAgR0wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0gICAgR0xVLmdsdVBlcnNwZWN0aXZlKDQ1LjBmLCBhc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0gICAgR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYzk3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBFeGNsdWRlIGEgd2lkZ2V0IGZyb20gYSBHcmlkTGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAwIik7Ci0KLQlmaW5hbCBCdXR0b24gYkhpZGRlbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliSGlkZGVuLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JYkhpZGRlbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiA0Iik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoImhpZGUiKTsKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGJIaWRkZW4uZ2V0TGF5b3V0RGF0YSgpOwotCQkJZGF0YS5leGNsdWRlID0gYi5nZXRTZWxlY3Rpb24oKTsKLQkJCWJIaWRkZW4uc2V0VmlzaWJsZSghZGF0YS5leGNsdWRlKTsKLQkJCXNoZWxsLmxheW91dChmYWxzZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2MzBkYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR3JpZExheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgaG9yaXpvbnRhbCByb3cKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKTsKLQlsYXlvdXQud3JhcCA9IHRydWU7Ci0JbGF5b3V0LmZpbGwgPSBmYWxzZTsKLQlsYXlvdXQuanVzdGlmeSA9IHRydWU7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQotCWIuc2V0VGV4dCgiQnV0dG9uIDIiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMyIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIk5vdCBzaG93biIpOwotCWIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JUm93RGF0YSBkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIGhpZ2giKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLmhlaWdodCA9IDIwMDsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCB3aWRlIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS53aWR0aCA9IDIwMDsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWI0OWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdyaWRMYXlvdXQgc25pcHBldDogYWxpZ24gd2lkZ2V0cyBpbiBhIHZlcnRpY2FsIGNvbHVtbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlsYXlvdXQuZmlsbCA9IHRydWU7Ci0JbGF5b3V0Lmp1c3RpZnkgPSBmYWxzZTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTm90IHNob3duIik7Ci0JYi5zZXRWaXNpYmxlKGZhbHNlKTsKLQlSb3dEYXRhIGRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgaGlnaCIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuaGVpZ2h0ID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIHdpZGUiKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLndpZHRoID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTRiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEhvdyB0byBhY2Nlc3MgQWJvdXQsIFByZWZlcmVuY2VzIGFuZCBRdWl0IG1lbnVzIG9uIGNhcmJvbi4KLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc4IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kUHJlZmVyZW5jZXMgPSAoJ3AnIDw8IDI0KSArICgncicgPDwgMTYpCi0JCQkrICgnZScgPDwgOCkgKyAnZic7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZEFib3V0ID0gKCdhJyA8PCAyNCkgKyAoJ2InIDw8IDE2KQotCQkJKyAoJ28nIDw8IDgpICsgJ3UnOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRTZXJ2aWNlcyA9ICgncycgPDwgMjQpICsgKCdlJyA8PCAxNikKLQkJCSsgKCdyJyA8PCA4KSArICd2JzsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKSB7Ci0JRGlzcGxheS5zZXRBcHBOYW1lKCJBcHBNZW51Iik7IC8vIHNldHMgbmFtZSBpbiBEb2NrCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlob29rQXBwbGljYXRpb25NZW51KGRpc3BsYXksICJBYm91dCBBcHBNZW51Iik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBob29rQXBwbGljYXRpb25NZW51KERpc3BsYXkgZGlzcGxheSwgZmluYWwgU3RyaW5nIGFib3V0TmFtZSkgewotCS8vIENhbGxiYWNrIHRhcmdldAotCU9iamVjdCB0YXJnZXQgPSBuZXcgT2JqZWN0KCkgewotCQlpbnQgY29tbWFuZFByb2MoaW50IG5leHRIYW5kbGVyLCBpbnQgdGhlRXZlbnQsIGludCB1c2VyRGF0YSkgewotCQkJaWYgKE9TLkdldEV2ZW50S2luZCh0aGVFdmVudCkgPT0gT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQpIHsKLQkJCQlISUNvbW1hbmQgY29tbWFuZCA9IG5ldyBISUNvbW1hbmQoKTsKLQkJCQlPUy5HZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwgT1Mua0V2ZW50UGFyYW1EaXJlY3RPYmplY3QsCi0JCQkJCQlPUy50eXBlSElDb21tYW5kLCBudWxsLCBISUNvbW1hbmQuc2l6ZW9mLCBudWxsLAotCQkJCQkJY29tbWFuZCk7Ci0JCQkJc3dpdGNoIChjb21tYW5kLmNvbW1hbmRJRCkgewotCQkJCWNhc2Uga0hJQ29tbWFuZFByZWZlcmVuY2VzOgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZCgiUHJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2Uga0hJQ29tbWFuZEFib3V0OgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZChhYm91dE5hbWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0JCX0KLQotCQlpbnQgaGFuZGxlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCU1lc3NhZ2VCb3ggcHJlZmVyZW5jZXMgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyk7Ci0JCQlwcmVmZXJlbmNlcy5zZXRUZXh0KGNvbW1hbmQpOwotCQkJcHJlZmVyZW5jZXMub3BlbigpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJcmV0dXJuIE9TLm5vRXJyOwotCQl9Ci0JfTsKLQotCWZpbmFsIENhbGxiYWNrIGNvbW1hbmRDYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0YXJnZXQsICJjb21tYW5kUHJvYyIsIDMpOyAvLyROT04tTkxTLTEkCi0JaW50IGNvbW1hbmRQcm9jID0gY29tbWFuZENhbGxiYWNrLmdldEFkZHJlc3MoKTsKLQlpZiAoY29tbWFuZFByb2MgPT0gMCkgewotCQljb21tYW5kQ2FsbGJhY2suZGlzcG9zZSgpOwotCQlyZXR1cm47IC8vIGdpdmUgdXAKLQl9Ci0KLQkvLyBJbnN0YWxsIGV2ZW50IGhhbmRsZXIgZm9yIGNvbW1hbmRzCi0JaW50W10gbWFzayA9IG5ldyBpbnRbXSB7IE9TLmtFdmVudENsYXNzQ29tbWFuZCwgT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQgfTsKLQlPUy5JbnN0YWxsRXZlbnRIYW5kbGVyKE9TLkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKSwgY29tbWFuZFByb2MsCi0JCQltYXNrLmxlbmd0aCAvIDIsIG1hc2ssIDAsIG51bGwpOwotCi0JLy8gY3JlYXRlIEFib3V0IC4uLiBtZW51IGNvbW1hbmQKLQlpbnRbXSBvdXRNZW51ID0gbmV3IGludFsxXTsKLQlzaG9ydFtdIG91dEluZGV4ID0gbmV3IHNob3J0WzFdOwotCWlmIChPUy5HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoMCwga0hJQ29tbWFuZFByZWZlcmVuY2VzLCAxLAotCQkJb3V0TWVudSwgb3V0SW5kZXgpID09IE9TLm5vRXJyCi0JCQkmJiBvdXRNZW51WzBdICE9IDApIHsKLQkJaW50IG1lbnUgPSBvdXRNZW51WzBdOwotCi0JCWludCBsID0gYWJvdXROYW1lLmxlbmd0aCgpOwotCQljaGFyIGJ1ZmZlcltdID0gbmV3IGNoYXJbbF07Ci0JCWFib3V0TmFtZS5nZXRDaGFycygwLCBsLCBidWZmZXIsIDApOwotCQlpbnQgc3RyID0gT1MuQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyhPUy5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAotCQkJCWJ1ZmZlciwgbCk7Ci0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCBzdHIsIChzaG9ydCkgMCwgMCwKLQkJCQlrSElDb21tYW5kQWJvdXQpOwotCQlPUy5DRlJlbGVhc2Uoc3RyKTsKLQotCQkvLyBhZGQgc2VwYXJhdG9yIGJldHdlZW4gQWJvdXQgJiBQcmVmZXJlbmNlcwotCQlPUy5JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcobWVudSwgMCwgKHNob3J0KSAxLAotCQkJCU9TLmtNZW51SXRlbUF0dHJTZXBhcmF0b3IsIDApOwotCi0JCS8vIGVuYWJsZSBwcmVmIG1lbnUKLQkJT1MuRW5hYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFByZWZlcmVuY2VzKTsKLQotCQkvLyBkaXNhYmxlIHNlcnZpY2VzIG1lbnUKLQkJT1MuRGlzYWJsZU1lbnVDb21tYW5kKG1lbnUsIGtISUNvbW1hbmRTZXJ2aWNlcyk7Ci0JfQotCi0JLy8gc2NoZWR1bGUgZGlzcG9zYWwgb2YgY2FsbGJhY2sgb2JqZWN0Ci0JZGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4MDVmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKGZvcm1hdCBmb3IgZGF0ZSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIllZWVkvTU0vREQiKTs7CQotCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2J1ZmZlci5sZW5ndGgoKV07Ci0JCQlidWZmZXIuZ2V0Q2hhcnMoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogLyogW1ldWVlZICovCi0JCQkJCQljYXNlIDE6IC8qIFlbWV1ZWSAqLwotCQkJCQkJY2FzZSAyOiAvKiBZWVtZXVkgKi8KLQkJCQkJCWNhc2UgMzogLyogWVlZW1ldICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdZJyk7IAlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgNTogLyogW01dTSovCi0JCQkJCQljYXNlIDY6IC8qIE1bTV0gKi97Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnTScpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgODogLyogW0RdRCAqLwotCQkJCQkJY2FzZSA5OiAvKiBEW0RdICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdEJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA0OiAvKiBZWVlZWy9dTU0gKi8KLQkJCQkJCWNhc2UgNzogLyogTU1bL11ERCAqLyB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnLycpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCi0JCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJaWYgKHN0YXJ0ID4gOSkgcmV0dXJuOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA0IHx8IHN0YXJ0ICsgaW5kZXggPT0gNykgewotCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy8nKSB7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLmluc2VydChpbmRleCsrLCAnLycpOwotCQkJCX0KLQkJCQlpZiAoY2hhcnNbaV0gPCAnMCcgfHwgJzknIDwgY2hhcnNbaV0pIHJldHVybjsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA1ICYmICAnMScgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbTV1NICovCi0JCQkJaWYgKHN0YXJ0ICsgaW5kZXggPT0gOCAmJiAgJzMnIDwgY2hhcnNbaV0pIHJldHVybjsgLyogW0RdRCAqLwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IGxlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgZGF0ZSA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJZGF0ZS5yZXBsYWNlKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgsIG5ld1RleHQpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIDE5MDEpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5KQU5VQVJZKTsKLQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCAxKTsKLQkJCVN0cmluZyB5eXl5ID0gZGF0ZS5zdWJzdHJpbmcoMCwgNCk7Ci0JCQlpZiAoeXl5eS5pbmRleE9mKCdZJykgPT0gLTEpIHsKLQkJCQlpbnQgeWVhciA9IEludGVnZXIucGFyc2VJbnQoeXl5eSk7Ci0JCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotCQkJfQotCQkJU3RyaW5nIG1tID0gZGF0ZS5zdWJzdHJpbmcoNSwgNyk7Ci0JCQlpZiAobW0uaW5kZXhPZignTScpID09IC0xKSB7Ci0JCQkJaW50IG1vbnRoID0gIEludGVnZXIucGFyc2VJbnQobW0pIC0gMTsKLQkJCQlpbnQgbWF4TW9udGggPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLk1PTlRIKTsKLQkJCQlpZiAoMCA+IG1vbnRoIHx8IG1vbnRoID4gbWF4TW9udGgpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKTsKLQkJCX0KLQkJCVN0cmluZyBkZCA9IGRhdGUuc3Vic3RyaW5nKDgsMTApOwotCQkJaWYgKGRkLmluZGV4T2YoJ0QnKSA9PSAtMSkgewotCQkJCWludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KGRkKTsKLQkJCQlpbnQgbWF4RGF5ID0gY2FsZW5kYXIuZ2V0QWN0dWFsTWF4aW11bShDYWxlbmRhci5EQVRFKTsKLQkJCQlpZiAoMSA+IGRheSB8fCBkYXkgPiBtYXhEYXkpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuREFURSwgZGF5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgID09IENhbGVuZGFyLkZFQlJVQVJZKSB7Ci0JCQkJCWNoYXIgZmlyc3RDaGFyID0gZGF0ZS5jaGFyQXQoOCk7Ci0JCQkJCWlmIChmaXJzdENoYXIgIT0gJ0QnICYmICcyJyA8IGZpcnN0Q2hhcikgcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgpOwotCQkJaWdub3JlID0gdHJ1ZTsKLQkJCXRleHQuaW5zZXJ0KG5ld1RleHQpOwotCQkJaWdub3JlID0gZmFsc2U7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhiZmI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0b29sIGJhciAodGV4dCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsICgpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0gCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2YzMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIG5vbi1yZWN0YW5ndWxhciBzaGVsbCB0byBzaW11bGF0ZSB0cmFuc3BhcmVuY3kKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gCi0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgMjAwOyB5Kz0yKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IDIwMDsgeCs9MikgewotCQkJCXBpeGVsLnggPSB4OwotCQkJCXBpeGVsLnkgPSB5OwotCQkJCXJlZ2lvbi5hZGQocGl4ZWwpOwotCQkJfQotCQl9Ci0JLy9kZWZpbmUgdGhlIHNoYXBlIG9mIHRoZSBzaGVsbCB1c2luZyBzZXRSZWdpb24KLQlzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQlSZWN0YW5nbGUgc2l6ZSA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQlzaGVsbC5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBzaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgMTAsIDEwLCBzaXplLngtMjAsIHNpemUueS0yMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlyZWdpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxNTg4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBbGxvdyB1c2VyIHRvIHJlb3JkZXIgY29sdW1ucyBhbmQgcmVvcmRlciBjb2x1bW5zIHByb2dyYW1tYXRpY2FsbHkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IFJvd0RhdGEoLTEsIDMwMCkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gNCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIHRleHQgPSBuZXcgU3RyaW5nW117aSsiIDAiLCBpKyIgMSIsIGkrIiAyIiwgaSsiIDMiLCBpKyIgNCJ9OwotCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW92ZSAiK2Uud2lkZ2V0KTsKLQkJCX0KLQkJfTsKLQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0ucGFjaygpOwotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbaV0uYWRkTGlzdGVuZXIoU1dULk1vdmUsIGxpc3RlbmVyKTsKLQkJfQotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZlcnQgY29sdW1uIG9yZGVyIik7Ci0JCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludFtdIG9yZGVyID0gdGFibGUuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aCAvIDI7IGkrKykgewotCQkJCQlpbnQgdGVtcCA9IG9yZGVyW2ldOwotCQkJCQlvcmRlcltpXSA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXTsKLQkJCQkJb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdID0gdGVtcDsKLQkJCQl9Ci0JCQkJdGFibGUuc2V0Q29sdW1uT3JkZXIob3JkZXIpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxMGYyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluayBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxpbmsgd2lkZ2V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJbGluay5zZXRUZXh0KCJUaGlzIGEgdmVyeSBzaW1wbGUgPEE+bGluazwvQT4gd2lkZ2V0LiIpOwotCQlsaW5rLnNldFNpemUoMTQwLCA0MCk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjNWExZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluayBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBzZWxlY3Rpb24gZXZlbnRzIGluIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MyB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OT05FKTsKLQkJU3RyaW5nIHRleHQgPSAiVGhlIFNXVCBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSA8YT5lZmZpY2llbnQ8L2E+LCA8YT5wb3J0YWJsZTwvYT4gPGEgaHJlZj1cIm5hdGl2ZVwiPmFjY2VzcyB0byB0aGUgdXNlci1pbnRlcmZhY2UgZmFjaWxpdGllcyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbXM8L2E+IG9uIHdoaWNoIGl0IGlzIGltcGxlbWVudGVkLiI7Ci0JCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJbGluay5zZXRTaXplKDQwMCwgNDAwKTsKLQkJbGluay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWxlY3Rpb246ICIgKyBldmVudC50ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxODk1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU3Bpbm5lciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNwaW5uZXIgd2lkZ2V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCXNwaW5uZXIuc2V0TWluaW11bSgwKTsKLQkJc3Bpbm5lci5zZXRNYXhpbXVtKDEwMDApOwotCQlzcGlubmVyLnNldFNlbGVjdGlvbig1MDApOwotCQlzcGlubmVyLnNldEluY3JlbWVudCgxKTsKLQkJc3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50KDEwMCk7Ci0JCXNwaW5uZXIucGFjaygpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjMzFhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyb3BwZWQgZGF0YSB0eXBlIGRlcGVuZHMgb24gdGFyZ2V0IGl0ZW0gaW4gdGFibGUKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwxLnNldFRleHQoIkRyYWcgU291cmNlIik7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpZiAoaSAlIDIgPT0gMCkgaXRlbS5zZXRUZXh0KCJEcm9wIGEgZmlsZSIpOwotCQlpZiAoaSAlIDIgPT0gMSkgaXRlbS5zZXRUZXh0KCJEcm9wIHRleHQiKTsKLQl9Ci0JRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UobGFiZWwxLCBETkQuRFJPUF9DT1BZKTsKLQlkcmFnU291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgidGVtcCIpOwotCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9OwotCQkJfQotCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gIm9uY2UgdXBvbiBhIHRpbWUiOwotCQkJfQotCQl9IAotCX0pOwotCURyb3BUYXJnZXQgZHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRhYmxlLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVCk7Ci0JZHJvcFRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlGaWxlVHJhbnNmZXIgZmlsZVRyYW5zZmVyID0gRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCVRleHRUcmFuc2ZlciB0ZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGl0ZW1JbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQlpZiAoaXRlbUluZGV4ICUgMiA9PSAwKSB7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQl3aGlsZSAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWlmIChmaWxlVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlc1tpbmRleF0pKSBicmVhazsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlldmVudC5jdXJyZW50RGF0YVR5cGUgPSBldmVudC5kYXRhVHlwZXNbaW5kZXhdOwotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRleHRUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2luZGV4XSkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQlpZiAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IGV2ZW50LmRhdGFUeXBlc1tpbmRleF07Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZmlsZVRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJU3RyaW5nW10gZmlsZXMgPSAoU3RyaW5nW10pZXZlbnQuZGF0YTsKLQkJCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dChmaWxlc1swXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRleHRUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMTUwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY4ODAzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxIVE1MPgotICA8SEVBRD4KLSAgICA8VElUTEU+UG9zdDwvVElUTEU+Ci0JPHA+VGVzdCBmb3IgUG9zdGluZyBEYXRhIGluIElFPC9wPgotCi0gIDwvSEVBRD4KLQotICA8Qk9EWT4KLSAgICA8Rk9STSBNRVRIT0Q9InBvc3QiCi0gICAgICAgQUNUSU9OPSJodHRwOi8vaG9zdC9jZ2ktYmluL21hc19mb3JtIj4KLSAgICA8SU5QVVQgVFlQRT0idGV4dCIgTkFNRT0ibmFtZSIKLSAgICAgICBTSVpFPTIwIFZBTFVFPSJUcnkgaXQgKHBvc3QpIj4KLSA8L0ZPUk0+Ci0gCi0gIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjN2M5NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gYSBTQUZFQVJSQVkKLSAqIAotICogVGhpcyBleGFtcGxlIHJlYWRzIGZyb20gYSBQb3N0RGF0YSBvYmplY3QgaW4gYSBCZWZvcmVOYXZpZ2F0ZTIgZXZlbnQgYW5kCi0gKiBjcmVhdGVzIGEgUG9zdERhdGEgb2JqZWN0IGluIGEgY2FsbCB0byBOYXZpZ2F0ZS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODYgewotCi1zdGF0aWMgaW50IENvZGVQYWdlID0gT1MuR2V0QUNQKCk7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQlCdXR0b24gZ28gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JZ28uc2V0VGV4dCgiR28iKTsKLQlPbGVGcmFtZSBvbGVGcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCW9sZUZyYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCU9sZUF1dG9tYXRpb24gYXV0b21hdGlvbjsKLQl0cnkgewotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShvbGVGcmFtZSwgU1dULk5PTkUsICJTaGVsbC5FeHBsb3JlciIpOwotCQlhdXRvbWF0aW9uID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JZmluYWwgT2xlQXV0b21hdGlvbiBhdXRvID0gYXV0b21hdGlvbjsKLQlnby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVN0cmluZyB1cmwgPSB0ZXh0LmdldFRleHQoKTsKLQkJCWludFtdIHJnZGlzcGlkID0gYXV0by5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQkJCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFsxXTsKLQkJCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHVybCk7Ci0JCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCQlyZ2Rpc3BpZE5hbWVkQXJnc1swXSA9IHJnZGlzcGlkWzFdOwotCQkJYXV0by5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQkJfQotCX0pOwotCQotCQotCS8vIFJlYWQgUG9zdERhdGEgd2hlbmV2ZXIgd2UgbmF2aWdhdGUgdG8gYSBzaXRlIHRoYXQgdXNlcyBpdAotCWludCBCZWZvcmVOYXZpZ2F0ZTIgPSAweGZhOwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoQmVmb3JlTmF2aWdhdGUyLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQlWYXJpYW50IHVybCA9IGV2ZW50LmFyZ3VtZW50c1sxXTsKLQkJCVZhcmlhbnQgcG9zdERhdGEgPSBldmVudC5hcmd1bWVudHNbNF07Ci0JCQlpZiAocG9zdERhdGEgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUG9zdERhdGEgPSAiK3JlYWRTYWZlQXJyYXkocG9zdERhdGEpKyIsIFVSTCA9ICIrdXJsLmdldFN0cmluZygpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIE5hdmlnYXRlIHRvIHRoaXMgd2ViIHNpdGUgd2hpY2ggdXNlcyBwb3N0IGRhdGEgdG8gZmlsbCBpbiB0aGUgdGV4dCBmaWVsZAotCS8vIGFuZCBwdXQgdGhlIHN0cmluZyAiaGVsbG8gd29ybGQiIGludG8gdGhlIHRleHQgYm94Ci0JdGV4dC5zZXRUZXh0KCJmaWxlOi8vIitTbmlwcGV0MTg2LmNsYXNzLmdldFJlc291cmNlKCJTbmlwcGV0MTg2Lmh0bWwiKS5nZXRGaWxlKCkpOwotCWludFtdIHJnZGlzcGlkID0gYXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIiwgIlBvc3REYXRhIn0pOyAKLQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07CQotCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFsyXTsKLQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh0ZXh0LmdldFRleHQoKSk7Ci0Jcmd2YXJnWzFdID0gd3JpdGVTYWZlQXJyYXkoImhlbGxvIHdvcmxkIik7Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50WzJdOwotCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07Ci0JcmdkaXNwaWROYW1lZEFyZ3NbMV0gPSByZ2Rpc3BpZFsyXTsKLQlhdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQkKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgc3RydWN0cyBhcmUgYWNjZXNzZWQgaW4gdGhlIHJlYWRTYWZlQXJyYXkgYW5kIHdyaXRlU2FmZUFycmF5Ci0vLyBmdW5jdGlvbnM6Ci0vLwotLy8gVkFSSUFOVDoKLS8vIAkJc2hvcnQgdnQKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMQotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQyCi0vLyAJCXNob3J0IHdSZXNlcnZlZDMKLS8vIAkJaW50IHBhcnJheQotLy8KLS8vIFNBRkVBUlJBWToKLS8vICAgICAgc2hvcnQgY0RpbXMgICAgICAvLyBDb3VudCBvZiBkaW1lbnNpb25zIGluIHRoaXMgYXJyYXkKLS8vICAgICAgc2hvcnQgZkZlYXR1cmVzICAvLyBGbGFncyB1c2VkIGJ5IHRoZSBTYWZlQXJyYXkKLS8vICAgICAgaW50IGNiRWxlbWVudHMgICAvLyBTaXplIG9mIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5Ci0vLyAgICAgIGludCBjTG9ja3MgICAgICAgLy8gTnVtYmVyIG9mIHRpbWVzIHRoZSBhcnJheSBoYXMgYmVlbiBsb2NrZWQgd2l0aG91dCBjb3JyZXNwb25kaW5nIHVubG9jawotLy8gICAgICBpbnQgcHZEYXRhICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGRhdGEKLS8vICAgICAgU0FGRUFSUkFZQk9VTkRbXSByZ3NhYm91bmQgLy8gT25lIGJvdW5kIGZvciBlYWNoIGRpbWVuc2lvbgotLy8KLS8vIFNBRkVBUlJBWUJPVU5EOgotLy8gICAgICBpbnQgY0VsZW1lbnRzICAgIC8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGRpbWVuc2lvbgotLy8gICAgICBpbnQgbExib3VuZCAgICAgIC8vIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgZGltZW5zaW9uIAotCi1zdGF0aWMgU3RyaW5nIHJlYWRTYWZlQXJyYXkoVmFyaWFudCB2YXJpYW50QnlSZWYpIHsKLQkvLyBSZWFkIGEgc2FmZWFycmF5IHRoYXQgY29udGFpbnMgZGF0YSBvZiAKLQkvLyB0eXBlIFZUX1VJMSAodW5zaWduZWQgc2hvcnRzKSB3aGljaCBjb250YWlucwotCS8vIGEgdGV4dCBzdHJlYW0uCi0gICAgaW50IHBQb3N0RGF0YSA9IHZhcmlhbnRCeVJlZi5nZXRCeVJlZigpOwotICAgIHNob3J0W10gdnRfdHlwZSA9IG5ldyBzaG9ydFsxXTsKLSAgICBPUy5Nb3ZlTWVtb3J5KHZ0X3R5cGUsIHBQb3N0RGF0YSwgMik7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHZ0X3R5cGVbMF0gPT0gKHNob3J0KShPTEUuVlRfQllSRUYgfCBPTEUuVlRfVkFSSUFOVCkpIHsKLSAgICAgICAgaW50W10gcFZhcmlhbnQgPSBuZXcgaW50WzFdOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBWYXJpYW50LCBwUG9zdERhdGEgKyA4LCA0KTsKLSAgICAgICAgdnRfdHlwZSA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgT1MuTW92ZU1lbW9yeSh2dF90eXBlLCBwVmFyaWFudFswXSwgMik7Ci0gICAgICAgIGlmICh2dF90eXBlWzBdID09IChzaG9ydCkoT0xFLlZUX0FSUkFZIHwgT0xFLlZUX1VJMSkpIHsKLSAgICAgICAgICAgIGludFtdIHBTYWZlYXJyYXkgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwU2FmZWFycmF5LCBwVmFyaWFudFswXSArIDgsIDQpOwotICAgICAgICAgICAgc2hvcnRbXSBjRGltcyA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkoY0RpbXMsIHBTYWZlYXJyYXlbMF0sIDIpOwotICAgICAgICAgICAgaW50W10gcHZEYXRhID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocHZEYXRhLCBwU2FmZWFycmF5WzBdICsgMTIsIDQpOwotICAgICAgICAgICAgaW50IHNhZmVhcnJheWJvdW5kT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY0RpbXNbMF07IGkrKykgewotICAgICAgICAgICAgICAgIGludFtdIGNFbGVtZW50cyA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShjRWxlbWVudHMsIHBTYWZlYXJyYXlbMF0gKyAxNiArIHNhZmVhcnJheWJvdW5kT2Zmc2V0LCA0KTsKLSAgICAgICAgICAgICAgICBzYWZlYXJyYXlib3VuZE9mZnNldCArPSA4OwotICAgICAgICAgICAgICAgIGludCBjY2hXaWRlQ2hhciA9IE9TLk11bHRpQnl0ZVRvV2lkZUNoYXIgKENvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwgIHB2RGF0YVswXSwgLTEsIG51bGwsIDApOwotCQkJCWlmIChjY2hXaWRlQ2hhciA9PSAwKSByZXR1cm4gbnVsbDsKLQkJCQljaGFyW10gbHBXaWRlQ2hhclN0ciA9IG5ldyBjaGFyIFtjY2hXaWRlQ2hhciAtIDFdOwotCQkJCU9TLk11bHRpQnl0ZVRvV2lkZUNoYXIgKENvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwgIHB2RGF0YVswXSwgLTEsIGxwV2lkZUNoYXJTdHIsIGxwV2lkZUNoYXJTdHIubGVuZ3RoKTsKLQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGxwV2lkZUNoYXJTdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBWYXJpYW50IHdyaXRlU2FmZUFycmF5IChTdHJpbmcgc3RyaW5nKSB7Ci0JLy8gQ3JlYXRlIGEgb25lIGRpbWVuc2lvbmFsIHNhZmVhcnJheSBjb250YWluaW5nIHR3byBWVF9VSTEgdmFsdWVzCi0JLy8gd2hlcmUgVlRfVUkxIGlzIGFuIHVuc2lnbmVkIGNoYXIKLQkKLQkvLyBEZWZpbmUgY0RpbXMsIGZGZWF0dXJlcyBhbmQgY2JFbGVtZW50cwotCXNob3J0IGNEaW1zID0gMTsKLQlzaG9ydCBGQURGX0ZJWEVEU0laRSA9IDB4MTA7Ci0Jc2hvcnQgRkFERl9IQVZFVkFSVFlQRSA9IDB4ODA7Ci0Jc2hvcnQgZkZlYXR1cmVzID0gKHNob3J0KShGQURGX0ZJWEVEU0laRSB8IEZBREZfSEFWRVZBUlRZUEUpOwotCWludCBjYkVsZW1lbnRzID0gMTsKLQkvLyBDcmVhdGUgYSBwb2ludGVyIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gaXQKLQlpbnQgY291bnQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQlzdHJpbmcuZ2V0Q2hhcnMoMCwgY291bnQsIGNoYXJzLCAwKTsKLQlpbnQgY2NoTXVsdGlCeXRlID0gT1MuV2lkZUNoYXJUb011bHRpQnl0ZShDb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBudWxsLCAwLCBudWxsLCBudWxsKTsKLQlpZiAoY2NoTXVsdGlCeXRlID09IDApIHJldHVybiBudWxsOwotCWludCBwdkRhdGEgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgY2NoTXVsdGlCeXRlKTsKLQlPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBjaGFycywgLTEsIHB2RGF0YSwgY2NoTXVsdGlCeXRlLCBudWxsLCBudWxsKTsKLQlpbnQgY0VsZW1lbnRzMSA9IGNjaE11bHRpQnl0ZTsKLQlpbnQgbExib3VuZDEgPSAwOwotCS8vIENyZWF0ZSBhIHNhZmVhcnJheSBpbiBtZW1vcnkKLQkvLyAxMiBieXRlcyBmb3IgY0RpbXMsIGZGZWF0dXJlcyBhbmQgY2JFbGVtZW50cyArIDQgYnl0ZXMgZm9yIHB2RGF0YSArIG51bWJlciBvZiBkaW1lbnNpb25zICogKHNpemUgb2Ygc2FmZWFycmF5Ym91bmQpCi0JaW50IHNpemVvZlNhZmVBcnJheSA9IDEyICsgNCArIDEqODsKLQlpbnQgcFNhZmVBcnJheSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBzaXplb2ZTYWZlQXJyYXkpOwotCS8vIENvcHkgdGhlIGRhdGEgaW50byB0aGUgc2FmZSBhcnJheQotCWludCBvZmZzZXQgPSAwOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IHNob3J0W10ge2NEaW1zfSwgMik7IG9mZnNldCArPSAyOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IHNob3J0W10ge2ZGZWF0dXJlc30sIDIpOyBvZmZzZXQgKz0gMjsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7Y2JFbGVtZW50c30sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7MH0sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7cHZEYXRhfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtjRWxlbWVudHMxfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtsTGJvdW5kMX0sIDQpOyBvZmZzZXQgKz0gNDsKLQkvLyBDcmVhdGUgYSB2YXJpYW50IGluIG1lbW9yeSB0byBob2xkIHRoZSBzYWZlYXJyYXkKLQlpbnQgcFZhcmlhbnQgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgVmFyaWFudC5zaXplb2YpOwotCXNob3J0IHZ0ID0gKHNob3J0KShPTEUuVlRfQVJSQVkgfCBPTEUuVlRfVUkxKTsKLQlPUy5Nb3ZlTWVtb3J5KHBWYXJpYW50LCBuZXcgc2hvcnRbXSB7dnR9LCAyKTsKLQlPUy5Nb3ZlTWVtb3J5KHBWYXJpYW50ICsgOCwgbmV3IGludFtde3BTYWZlQXJyYXl9LCA0KTsKLQkvLyBDcmVhdGUgYSBieSByZWYgdmFyaWFudAotCVZhcmlhbnQgdmFyaWFudEJ5UmVmID0gbmV3IFZhcmlhbnQocFZhcmlhbnQsIChzaG9ydCkoT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQpKTsKLQlyZXR1cm4gdmFyaWFudEJ5UmVmOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIyNzYyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxIVE1MPgotICA8SEVBRD4KLSAgICA8VElUTEU+RXZhbHVhdGU8L1RJVExFPgotCTxwPlRlc3QgZm9yIElFIFNjcmlwdDwvcD4KLSAgICA8U0NSSVBUPgotICAgICAgZnVuY3Rpb24gZXZhbHVhdGUoeCkKLSAgICAgIHsKLSAgICAgICAgIGFsZXJ0KCJoZWxsbyIpCi0gICAgICAgICByZXR1cm4gZXZhbCh4KQotICAgICAgfQotICAgPC9TQ1JJUFQ+Ci0gIDwvSEVBRD4KLQotICA8Qk9EWT4KLSAgPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzIyNDc0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogUnVubmluZyBhIHNjcmlwdCB3aXRoaW4gSUUuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODcgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCXRyeSB7Ci0JCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gSVdlYkJyb3dzZXIKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIHdlYkJyb3dzZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkvLyBXaGVuIHRoZSBkb2N1bWVudCBpcyBsb2FkZWQsIGFjY2VzcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZvciB0aGUgbmV3IHBhZ2UKLQkvLyBhbmQgZXZhbHV0ZSBleHByZXNzaW9uIHVzaW5nIFNjcmlwdC4KLQlpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKERvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGh0bWxEb2N1bWVudElEID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiRG9jdW1lbnQifSk7IAotCQkJaWYgKGh0bWxEb2N1bWVudElEID09IG51bGwpIHJldHVybjsKLQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHdlYkJyb3dzZXIuZ2V0UHJvcGVydHkoaHRtbERvY3VtZW50SURbMF0pOwotCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkvL0lIVE1MRG9jdW1lbnQyCi0JCQlPbGVBdXRvbWF0aW9uIGh0bWxEb2N1bWVudCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWh0bWxEb2N1bWVudCA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCQkJCXBWYXJSZXN1bHQuZGlzcG9zZSgpOwotCQotCQkJCWludFtdIHNjcmlwdElEID0gaHRtbERvY3VtZW50LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJTY3JpcHQifSk7IAotCQkJCWlmIChzY3JpcHRJRCA9PSBudWxsKSByZXR1cm47Ci0JCQkJcFZhclJlc3VsdCA9IGh0bWxEb2N1bWVudC5nZXRQcm9wZXJ0eShzY3JpcHRJRFswXSk7Ci0JCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkJT2xlQXV0b21hdGlvbiBodG1sV2luZG93ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvL0lIVE1MV2luZG93MgotCQkJCQlodG1sV2luZG93ID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJCXBWYXJSZXN1bHQuZGlzcG9zZSgpOwotCQkJCQlpbnRbXSBldmFsdWF0ZUlEID0gaHRtbFdpbmRvdy5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ImV2YWx1YXRlIn0pOwotCQkJCQlpZiAoZXZhbHVhdGVJRCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCVN0cmluZyBleHByZXNzaW9uID0gIjUrTWF0aC5zaW4oOSkiOwotCQkJCQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZXhwcmVzc2lvbil9OwotCQkJCQlwVmFyUmVzdWx0ID0gaHRtbFdpbmRvdy5pbnZva2UoZXZhbHVhdGVJRFswXSwgcmd2YXJnLCBudWxsKTsKLQkJCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleHByZXNzaW9uKyIgPSIrcFZhclJlc3VsdC5nZXRTdHJpbmcoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaHRtbFdpbmRvdy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlodG1sRG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gYSB3ZWIgc2l0ZQotCWludFtdIGlkcyA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KCJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbCIpfTsKLQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbXXtpZHNbMV19OwotCXdlYkJyb3dzZXIuaW52b2tlKGlkc1swXSwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkvL1JlbWVtYmVyIHRvIHJlbGVhc2UgT2xlQXV0b21hdGlvbiBPYmplY3QKLQl3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2NiOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFNjcm9sbCB3aWRnZXRzIGludG8gdmlldyB3aGVuIHRoZXkgZ2V0IGZvY3VzCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBiMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliMS5zZXRUZXh0KCJ0b3AiKTsKLQliMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXNjLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEwLCB0cnVlKSk7Ci0JZm9yIChpbnQgaSA9IDAgOyBpIDwgMzAwOyBpKyspIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJCdXR0b24gIitpKTsKLQl9Ci0JQnV0dG9uIGIyID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIyLnNldFRleHQoImJvdHRvbSIpOwotCWIyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQkKLQlzYy5zZXRDb250ZW50KGMpOwotCXNjLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0Jc2Muc2V0TWluU2l6ZShjLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUNvbnRyb2wgY2hpbGQgPSAoQ29udHJvbCllLndpZGdldDsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjaGlsZC5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBhcmVhID0gc2MuZ2V0Q2xpZW50QXJlYSgpOwotCQkJUG9pbnQgb3JpZ2luID0gc2MuZ2V0T3JpZ2luKCk7Ci0JCQlpZiAob3JpZ2luLnggPiBib3VuZHMueCkgb3JpZ2luLnggPSBNYXRoLm1heCgwLCBib3VuZHMueCk7Ci0JCQlpZiAob3JpZ2luLnkgPiBib3VuZHMueSkgb3JpZ2luLnkgPSBNYXRoLm1heCgwLCBib3VuZHMueSk7Ci0JCQlpZiAob3JpZ2luLnggKyBhcmVhLndpZHRoIDwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpIG9yaWdpbi54ID0gTWF0aC5tYXgoMCwgYm91bmRzLnggKyBib3VuZHMud2lkdGggLSBhcmVhLndpZHRoKTsKLQkJCWlmIChvcmlnaW4ueSArIGFyZWEuaGVpZ2h0IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSBvcmlnaW4ueSA9IE1hdGgubWF4KDAsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIGFyZWEuaGVpZ2h0KTsKLQkJCXNjLnNldE9yaWdpbihvcmlnaW4pOwotCQl9Ci0JfTsKLQlDb250cm9sW10gY29udHJvbHMgPSBjLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQljb250cm9sc1tpXS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDUwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMzBiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogVGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2gKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTdHlsZWRUZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaCIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIHVuZGVybGluZWQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLnVuZGVybGluZSA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMSk7Ci0JLy8gbWFrZSBBQkNERUZHSElKS0xNIGhhdmUgYSBzdHJpa2UgdGhyb3VnaAotCVN0eWxlUmFuZ2Ugc3R5bGUyID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTIuc3RhcnQgPSAxMTsKLQlzdHlsZTIubGVuZ3RoID0gMTM7Ci0Jc3R5bGUyLnN0cmlrZW91dCA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMik7Ci0JLy8gbWFrZSBOT1BRUlNUVVZXWFlaIGFwcGVhciB1bmRlcmxpbmVkIGFuZCBoYXZlIGEgc3RyaWtlIHRocm91Z2gKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLnN0YXJ0ID0gMjU7Ci0Jc3R5bGUzLmxlbmd0aCA9IDEzOwotCXN0eWxlMy51bmRlcmxpbmUgPSB0cnVlOwotCXN0eWxlMy5zdHJpa2VvdXQgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTMpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY5MTY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKG9ubHkgYWxsb3cgZGlnaXRzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dC5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAyMDApOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZS50ZXh0OwotCQkJY2hhciBbXSBjaGFycyA9IG5ldyBjaGFyIFtzdHJpbmcubGVuZ3RoICgpXTsKLQkJCXN0cmluZy5nZXRDaGFycyAoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoISgnMCcgPD0gY2hhcnMgW2ldICYmIGNoYXJzIFtpXSA8PSAnOScpKSB7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGEzOTc0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluIFNwaW5uZXIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkwIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTcGlubmVyIHdpdGggZmxvYXQgdmFsdWVzIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JLy8gYWxsb3cgMyBkZWNpbWFsIHBsYWNlcwotCXNwaW5uZXIuc2V0RGlnaXRzKDMpOwotCS8vIHNldCB0aGUgbWluaW11bSB2YWx1ZSB0byAwLjAwMQotCXNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMjAKLQlzcGlubmVyLnNldE1heGltdW0oMjAwMDApOwotCS8vIHNldCB0aGUgaW5jcmVtZW50IHZhbHVlIHRvIDAuMDEwCi0Jc3Bpbm5lci5zZXRJbmNyZW1lbnQoMTApOwotCS8vIHNldCB0aGUgc2VsZXRpb24gdG8gMy40NTYKLQlzcGlubmVyLnNldFNlbGVjdGlvbigzNDU2KTsKLQlzcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgc2VsZWN0aW9uID0gc3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQkJCWludCBkaWdpdHMgPSBzcGlubmVyLmdldERpZ2l0cygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWxlY3Rpb24gaXMgIisoc2VsZWN0aW9uIC8gTWF0aC5wb3coMTAsIGRpZ2l0cykpKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhYzFhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBEZXRlY3Qgd2hlbiB0aGUgdXNlciBzY3JvbGxzIGEgdGV4dCBjb250cm9sCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTEgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwzMjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kIChpICsgIi1UaGlzIGlzIGEgbGluZSBvZiB0ZXh0IGluIGEgd2lkZ2V0LSIgKyBpICsgIlxuIik7Ci0JfQotCXRleHQuc2V0U2VsZWN0aW9uICgwKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCWludCBsYXN0SW5kZXggPSB0ZXh0LmdldFRvcEluZGV4ICgpOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IGluZGV4ID0gdGV4dC5nZXRUb3BJbmRleCAoKTsKLQkJCWlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHsKLQkJCQlsYXN0SW5kZXggPSBpbmRleDsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTY3JvbGxlZCwgdG9wSW5kZXg9IiArIGluZGV4KTsKLQkJCX0KLQkJfQotCX07Ci0JLyogTk9URTogT25seSBkZXRlY3RzIHNjcm9sbGluZyBieSB0aGUgdXNlciAqLwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlTY3JvbGxCYXIgaEJhciA9IHRleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotCWlmIChoQmFyICE9IG51bGwpIHsKLQkJaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQlTY3JvbGxCYXIgdkJhciA9IHRleHQuZ2V0VmVydGljYWxCYXIoKTsKLQlpZiAodkJhciAhPSBudWxsKSB7Ci0JCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci0Jc2hlbGwucGFjayAoKTsKLQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2l6ZS4geCAtIDMyLCBzaXplLnkgLyAyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhkNmQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFNob3cgYSBzb3J0IGluZGljYXRvciBpbiB0aGUgY29sdW1uIGhlYWRlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTIgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCS8vIGluaXRpYWxpemUgZGF0YSB3aXRoIGtleXMgYW5kIHJhbmRvbSB2YWx1ZXMKLQlpbnQgc2l6ZSA9IDEwMDsKLQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCWZpbmFsIGludFtdW10gZGF0YSA9IG5ldyBpbnRbc2l6ZV1bXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJZGF0YVtpXSA9IG5ldyBpbnRbXSB7aSwgcmFuZG9tLm5leHRJbnQoKX07Ci0JfQotCS8vIGNyZWF0ZSBhIHZpcnR1YWwgdGFibGUgdG8gZGlzcGxheSBkYXRhCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WSVJUVUFMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRJdGVtQ291bnQoc2l6ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiS2V5Iik7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlZhbHVlIik7Ci0JY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZS5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWludFtdIGRhdHVtID0gZGF0YVtpbmRleF07Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtJbnRlZ2VyLnRvU3RyaW5nKGRhdHVtWzBdKSwKLQkJCQkJSW50ZWdlci50b1N0cmluZyhkYXR1bVsxXSkgfSk7Ci0JCX0KLQl9KTsKLQkvLyBBZGQgc29ydCBpbmRpY2F0b3IgYW5kIHNvcnQgZGF0YSB3aGVuIGNvbHVtbiBzZWxlY3RlZAotCUxpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJLy8gZGV0ZXJtaW5lIG5ldyBzb3J0IGNvbHVtbiBhbmQgZGlyZWN0aW9uCi0JCQlUYWJsZUNvbHVtbiBzb3J0Q29sdW1uID0gdGFibGUuZ2V0U29ydENvbHVtbigpOwotCQkJVGFibGVDb2x1bW4gY3VycmVudENvbHVtbiA9IChUYWJsZUNvbHVtbikgZS53aWRnZXQ7Ci0JCQlpbnQgZGlyID0gdGFibGUuZ2V0U29ydERpcmVjdGlvbigpOwotCQkJaWYgKHNvcnRDb2x1bW4gPT0gY3VycmVudENvbHVtbikgewotCQkJCWRpciA9IGRpciA9PSBTV1QuVVAgPyBTV1QuRE9XTiA6IFNXVC5VUDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFibGUuc2V0U29ydENvbHVtbihjdXJyZW50Q29sdW1uKTsKLQkJCQlkaXIgPSBTV1QuVVA7Ci0JCQl9Ci0JCQkvLyBzb3J0IHRoZSBkYXRhIGJhc2VkIG9uIGNvbHVtbiBhbmQgZGlyZWN0aW9uCi0JCQlmaW5hbCBpbnQgaW5kZXggPSBjdXJyZW50Q29sdW1uID09IGNvbHVtbjEgPyAwIDogMTsKLQkJCWZpbmFsIGludCBkaXJlY3Rpb24gPSBkaXI7Ci0JCQlBcnJheXMuc29ydChkYXRhLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCWludFtdIGEgPSAoaW50W10pIGFyZzA7Ci0JCQkJCWludFtdIGIgPSAoaW50W10pIGFyZzE7Ci0JCQkJCWlmIChhW2luZGV4XSA9PSBiW2luZGV4XSkgcmV0dXJuIDA7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gU1dULlVQKSB7Ci0JCQkJCQlyZXR1cm4gYVtpbmRleF0gPCBiW2luZGV4XSA/IC0xIDogMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gYVtpbmRleF0gPCBiW2luZGV4XSA/IDEgOiAtMTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIHVwZGF0ZSBkYXRhIGRpc3BsYXllZCBpbiB0YWJsZQotCQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihkaXIpOwotCQkJdGFibGUuY2xlYXJBbGwoKTsKLQkJfQotCX07Ci0JY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotCWNvbHVtbjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLQl0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbjEpOwotCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDQxY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFsbG93IHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGFuZCByZW9yZGVyIGNvbHVtbnMgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBSb3dEYXRhKC0xLCAzMDApKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDQiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyI6MCIsIGkrIjoxIiwgaSsiOjIiLCBpKyI6MyIsIGkrIjo0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykgewotCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCXRleHQgPSBuZXcgU3RyaW5nW117aSsiLCIraisiOjAiLCBpKyIsIitqKyI6MSIsIGkrIiwiK2orIjoyIiwgaSsiLCIraisiOjMiLCBpKyIsIitqKyI6NCJ9OwotCQkJCXN1Ykl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IDU7IGsrKykgewotCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIsIitqKyIsIitrKyI6MCIsIGkrIiwiK2orIiwiK2srIjoxIiwgaSsiLCIraisiLCIraysiOjIiLCBpKyIsIitqKyIsIitrKyI6MyIsIGkrIiwiK2orIiwiK2srIjo0In07Ci0JCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgoMTAwKTsKLQkJCWNvbHVtbnNbaV0uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JCQljb2x1bW5zW2ldLmFkZExpc3RlbmVyKFNXVC5Nb3ZlLCBsaXN0ZW5lcik7Ci0JCX0KLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiaW52ZXJ0IGNvbHVtbiBvcmRlciIpOwotCQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpbnRbXSBvcmRlciA9IHRyZWUuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aCAvIDI7IGkrKykgewotCQkJCQlpbnQgdGVtcCA9IG9yZGVyW2ldOwotCQkJCQlvcmRlcltpXSA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXTsKLQkJCQkJb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdID0gdGVtcDsKLQkJCQl9Ci0JCQkJdHJlZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVlMmM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBXcml0ZSBhbiBhbmltYXRlZCBHSUYgdG8gYSBmaWxlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTQgewotCURpc3BsYXkgZGlzcGxheTsKLQlDb2xvciB3aGl0ZSwgcmVkLCBncmVlbiwgYmx1ZTsKLQlGb250IGZvbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBTbmlwcGV0MTk0KCkucnVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVJHQiB3aGl0ZVJHQiA9IG5ldyBSR0IoMHhmZiwgMHhmZiwgMHhmZik7Ci0JCVJHQiByZWRSR0IgPSBuZXcgUkdCKDB4ZmYsIDAsIDApOwotCQlSR0IgZ3JlZW5SR0IgPSBuZXcgUkdCKDAsIDB4ZmYsIDApOwotCQlSR0IgYmx1ZVJHQiA9IG5ldyBSR0IoMCwgMCwgMHhmZik7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHsKLQkJCQl3aGl0ZVJHQiwJLy8gMAotCQkJCXJlZFJHQiwJCS8vIDEKLQkJCQlncmVlblJHQiwJLy8gMgotCQkJCWJsdWVSR0IgfSk7CS8vIDMKLQkJd2hpdGUgPSBuZXcgQ29sb3IoZGlzcGxheSwgd2hpdGVSR0IpOwotCQlyZWQgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmVkUkdCKTsKLQkJZ3JlZW4gPSBuZXcgQ29sb3IoZGlzcGxheSwgZ3JlZW5SR0IpOwotCQlibHVlID0gbmV3IENvbG9yKGRpc3BsYXksIGJsdWVSR0IpOwotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIkNvbWljIFNhbnMgTVMiLCAyNCwgU1dULkJPTEQpOwotCQkKLQkJSW1hZ2VEYXRhW10gZGF0YSA9IG5ldyBJbWFnZURhdGFbNF07Ci0JCWRhdGFbMF0gPSBuZXdGcmFtZSgiIiwgIHdoaXRlLCBwYWxldHRlLCBmYWxzZSwgMCwgMCwgMTAxLCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzFdID0gbmV3RnJhbWUoIlMiLCByZWQsICAgcGFsZXR0ZSwgdHJ1ZSwgIDAsIDAsICAzMCwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVsyXSA9IG5ld0ZyYW1lKCJXIiwgZ3JlZW4sIHBhbGV0dGUsIHRydWUsIDI4LCAwLCAgMzksIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbM10gPSBuZXdGcmFtZSgiVCIsIGJsdWUsICBwYWxldHRlLCB0cnVlLCA2OSwgMCwgIDMyLCA1NSwgU1dULkRNX0ZJTExfQkFDS0dST1VORCwgMjAwKTsKLQkJCi0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQlsb2FkZXIuZGF0YSA9IGRhdGE7Ci0JCWxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwgPSAwOwotCQlsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCA9IGRhdGFbMF0uaGVpZ2h0OwotCQlsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoID0gZGF0YVswXS53aWR0aDsKLQkJbG9hZGVyLnJlcGVhdENvdW50ID0gMDsgLy8gcnVuIGZvcmV2ZXIKLQkJbG9hZGVyLnNhdmUoInN3dC5naWYiLCBTV1QuSU1BR0VfR0lGKTsKLQotCQl3aGl0ZS5kaXNwb3NlKCk7Ci0JCXJlZC5kaXNwb3NlKCk7Ci0JCWdyZWVuLmRpc3Bvc2UoKTsKLQkJYmx1ZS5kaXNwb3NlKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlJbWFnZURhdGEgbmV3RnJhbWUoU3RyaW5nIGxldHRlciwgQ29sb3IgY29sb3IsIFBhbGV0dGVEYXRhIHBhbGV0dGUsIGJvb2xlYW4gdHJhbnNwYXJlbnQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpIHsKLQkJSW1hZ2VEYXRhIHRlbXAgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIHBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCwgcGFsZXR0ZSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHRlbXApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2MuZHJhd1N0cmluZyhsZXR0ZXIsIDUsIDUpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCUltYWdlRGF0YSBmcmFtZSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpZiAodHJhbnNwYXJlbnQpIGZyYW1lLnRyYW5zcGFyZW50UGl4ZWwgPSAwOyAvLyB3aGl0ZQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZyYW1lLnggPSB4OwotCQlmcmFtZS55ID0geTsKLQkJZnJhbWUuZGlzcG9zYWxNZXRob2QgPSBkaXNwb3NhbE1ldGhvZDsKLQkJZnJhbWUuZGVsYXlUaW1lID0gZGVsYXlUaW1lOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhkMTUwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTERhdGE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTDExOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0xDb250ZXh0OwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuZ2x1LkdMVTsKLWltcG9ydCBvcmcubHdqZ2wuTFdKR0xFeGNlcHRpb247Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IHVzZSBMV0pHTCB0byBkcmF3IHRvIGFuIFNXVCBHTENhbnZhcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQxOTUgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTDExLmdsQmVnaW4oR0wxMS5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJR0wxMS5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQl0cnkgewotICAgICAgICAJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0gICAgICAgIH0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0gICAgICAgIAotICAgICAgICBjYW52YXMuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldEJvdW5kcygpOwotICAgICAgICAJCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIGJvdW5kcy53aWR0aCAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCQlHTDExLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOwotICAgICAgICAJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0gICAgICAgIAkJR0wxMS5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOwotICAgICAgICAJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0KLQkJR0wxMS5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMMTEuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTDExLmdsSGludChHTDExLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wxMS5HTF9OSUNFU1QpOwotCQlHTDExLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlHTDExLmdsTGluZVdpZHRoKDIpOwotCQlHTDExLmdsRW5hYmxlKEdMMTEuR0xfREVQVEhfVEVTVCk7Ci0KLQkJc2hlbGwuc2V0VGV4dCgiU1dUL0xXSkdMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCSAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JICAgIAlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkgICAgICAgIH0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJCUdMMTEuZ2xDbGVhcihHTDExLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDExLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlHTDExLmdsQ2xlYXJDb2xvciguM2YsIC41ZiwgLjhmLCAxLjBmKTsKLQkJCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlHTDExLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlHTDExLmdsUm90YXRlZigwLjE1ZiAqIHJvdCwgMi4wZiAqIGZyb3QsIDEwLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlHTDExLmdsUG9seWdvbk1vZGUoR0wxMS5HTF9GUk9OVF9BTkRfQkFDSywgR0wxMS5HTF9MSU5FKTsKLQkJCQkJR0wxMS5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cygxLCAxLjlmICsgKChmbG9hdCkgTWF0aC5zaW4oKDAuMDA0ZiAqIGZyb3QpKSksIDE1LCAxNSk7Ci0JCQkJCWNhbnZhcy5zd2FwQnVmZmVycygpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwODFkNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB1c2UgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmVyaWZ5IGlucHV0Ci0gKiBJbiB0aGlzIGNhc2UgYSBwaG9uZSBudW1iZXIgaXMgdXNlZC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk2IHsKLQkvKgotCSAqIFBob25lIG51bWJlcnMgZm9sbG93IHRoZSBydWxlIFsoXVsxLTldWzEtOV1bMS05XVspXVsxLTldWzEtOV1bMS05XVstXVsxLTldWzEtOV1bMS05XVsxLTldCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYID0gIlsoXVxcZHszfVspXVxcZHszfVstXVxcZHs0fSI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlbXBsYXRlID0gIigjIyMpIyMjLSMjIyMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRUZXh0ID0gIigwMDApMDAwLTAwMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb3VyaWVyIE5ldyIsIDEwLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JdGV4dC5zZXRUZXh0KHRlbXBsYXRlKTsJCi0JdGV4dC5hZGRMaXN0ZW5lcihTV1QuVmVyaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCS8vY3JlYXRlIHRoZSBwYXR0ZXJuIGZvciB2ZXJpZmljYXRpb24KLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKFJFR0VYKTsJCi0JCS8vaWdub3JlIGV2ZW50IHdoZW4gY2F1c2VkIGJ5IGluc2VydGluZyB0ZXh0IGluc2lkZSBldmVudCBoYW5kbGVyCi0JCWJvb2xlYW4gaWdub3JlOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlKSByZXR1cm47Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWlmIChlLnN0YXJ0ID4gMTMgfHwgZS5lbmQgPiAxNCkgcmV0dXJuOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCQotCQkJLy9oYW5kbGUgYmFja3NwYWNlCi0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQkvLyBza2lwIG92ZXIgc2VwYXJhdG9ycwotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogCi0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG5ldyBjaGFyIFtdIHsnIycsJyknfSk7Ci0JCQkJCQkJCWUuc3RhcnQtLTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA4OgotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG5ldyBjaGFyIFtdIHsnIycsJy0nfSk7Ci0JCQkJCQkJCWUuc3RhcnQtLTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCctJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDogYnVmZmVyLmFwcGVuZCgnIycpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCS8vIG1vdmUgY3Vyc29yIGJhY2t3YXJkcyBvdmVyIHNlcGFyYXRvcnMKLQkJCQlpZiAoZS5zdGFydCA9PSA1IHx8IGUuc3RhcnQgPT0gOSkgZS5zdGFydC0tOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGRlZmF1bHRUZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IGUudGV4dC50b0NoYXJBcnJheSgpOwotCQkJaW50IGluZGV4ID0gZS5zdGFydCAtIDE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGUudGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnKCcpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJyknKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA4OgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICctJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA+PSBuZXdUZXh0Lmxlbmd0aCgpKSByZXR1cm47Ci0JCQkJbmV3VGV4dC5zZXRDaGFyQXQoaW5kZXgsIGNoYXJzW2ldKTsKLQkJCX0KLQkJCS8vIGlmIHRleHQgaXMgc2VsZWN0ZWQsIGRvIG5vdCBwYXN0ZSBiZXlvbmQgcmFuZ2Ugb2Ygc2VsZWN0aW9uCi0JCQlpZiAoZS5zdGFydCA8IGUuZW5kICYmIGluZGV4ICsgMSAhPSBlLmVuZCkgcmV0dXJuOwotCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ld1RleHQpOwotCQkJaWYgKG1hdGNoZXIubG9va2luZ0F0KCkpIHsKLQkJCQl0ZXh0LnNldFNlbGVjdGlvbihlLnN0YXJ0LCBpbmRleCArIDEpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQobmV3VGV4dC5zdWJzdHJpbmcoZS5zdGFydCwgaW5kZXggKyAxKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQl9KTsKLQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYwOWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmF3IHdyYXBwZWQgdGV4dCB1c2luZyBUZXh0TGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk3IHsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdTdHJpbmcgPSAiVGhlIHByZWZlcnJlZCBzaXplIG9mIGEgd2lkZ2V0IGlzIHRoZSBtaW5pbXVtIHNpemUgbmVlZGVkIHRvIHNob3cgaXRzIGNvbnRlbnQuIEluIHRoZSBjYXNlIG9mIGEgQ29tcG9zaXRlLCB0aGUgcHJlZmVycmVkIHNpemUgaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiBpdHMgY2hpbGRyZW4uIElmIGNoaWxkcmVuIGhhdmUgYmVlbiBwb3NpdGlvbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgdGhlIENvbXBvc2l0ZSBjb21wdXRlcyBpdHMgb3duIHByZWZlcnJlZCBzaXplIGJhc2VkIG9uIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgY2hpbGRyZW4uIElmIGEgQ29tcG9zaXRlIGlzIHVzaW5nIGEgbGF5b3V0IGNsYXNzIHRvIHBvc2l0aW9uIGl0cyBjaGlsZHJlbiwgaXQgYXNrcyB0aGUgTGF5b3V0IHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgaXRzIGNsaWVudEFyZWEsIGFuZCB0aGVuIGl0IGFkZHMgaW4gdGhlIHRyaW0gdG8gZGV0ZXJtaW5lIGl0cyBwcmVmZXJyZWQgc2l6ZS4iOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQuc2V0VGV4dChsb25nU3RyaW5nKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULlBhaW50OgotCQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCAxMCwgMTApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCWxheW91dC5zZXRXaWR0aChzaGVsbC5nZXRTaXplKCkueCAtIDIwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYyMWZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBwYXRoIGZyb20gc29tZSB0ZXh0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk4IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUZvbnREYXRhIGRhdGEgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCA5NiwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQlmaW5hbCBDb2xvciBncmVlbiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JZmluYWwgUGF0aCBwYXRoOwotCXRyeSB7Ci0JCXBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJcGF0aC5hZGRTdHJpbmcoIlNXVCIsIDAsIDAsIGZvbnQpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCS8vQWR2YW5jZWQgR3JhcGhpY3Mgbm90IHN1cHBvcnRlZC4gIAotCQkvL1RoaXMgbmV3IEFQSSByZXF1aXJlcyB0aGUgQ2Fpcm8gVmVjdG9yIGVuZ2luZSBvbiBHVEsgYW5kIE1vdGlmIGFuZCBHREkrIG9uIFdpbmRvd3MuCi0JCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybjsKLQl9Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsJCQkKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLnNldEJhY2tncm91bmQoZ3JlZW4pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChibHVlKTsKLQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlwYXRoLmRpc3Bvc2UoKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwODAyMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGlzdGVuIGZvciBldmVudHMgaW4gRXhjZWwKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTkgewotCXN0YXRpYyBTdHJpbmcgSUlEX0FwcEV2ZW50cyA9ICJ7MDAwMjQ0MTMtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSI7Ci0JLy8gRXZlbnQgSUQKLQlzdGF0aWMgaW50IE5ld1dvcmtib29rICAgICAgICAgICAgPSAweDAwMDAwNjFkOwotCXN0YXRpYyBpbnQgU2hlZXRTZWxlY3Rpb25DaGFuZ2UgICA9IDB4MDAwMDA2MTY7Ci0Jc3RhdGljIGludCBTaGVldEJlZm9yZURvdWJsZUNsaWNrID0gMHgwMDAwMDYxNzsKLQlzdGF0aWMgaW50IFNoZWV0QmVmb3JlUmlnaHRDbGljayAgPSAweDAwMDAwNjE4OwotCXN0YXRpYyBpbnQgU2hlZXRBY3RpdmF0ZSAgICAgICAgICA9IDB4MDAwMDA2MTk7Ci0Jc3RhdGljIGludCBTaGVldERlYWN0aXZhdGUgICAgICAgID0gMHgwMDAwMDYxYTsKLQlzdGF0aWMgaW50IFNoZWV0Q2FsY3VsYXRlICAgICAgICAgPSAweDAwMDAwNjFiOwotCXN0YXRpYyBpbnQgU2hlZXRDaGFuZ2UgICAgICAgICAgICA9IDB4MDAwMDA2MWM7Ci0Jc3RhdGljIGludCBXb3JrYm9va09wZW4gICAgICAgICAgID0gMHgwMDAwMDYxZjsKLQlzdGF0aWMgaW50IFdvcmtib29rQWN0aXZhdGUgICAgICAgPSAweDAwMDAwNjIwOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tEZWFjdGl2YXRlICAgICA9IDB4MDAwMDA2MjE7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZUNsb3NlICAgID0gMHgwMDAwMDYyMjsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlU2F2ZSAgICAgPSAweDAwMDAwNjIzOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVQcmludCAgICA9IDB4MDAwMDA2MjQ7Ci0Jc3RhdGljIGludCBXb3JrYm9va05ld1NoZWV0ICAgICAgID0gMHgwMDAwMDYyNTsKLQlzdGF0aWMgaW50IFdvcmtib29rQWRkaW5JbnN0YWxsICAgPSAweDAwMDAwNjI2OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBZGRpblVuaW5zdGFsbCA9IDB4MDAwMDA2Mjc7Ci0Jc3RhdGljIGludCBXaW5kb3dSZXNpemUgICAgICAgICAgID0gMHgwMDAwMDYxMjsKLQlzdGF0aWMgaW50IFdpbmRvd0FjdGl2YXRlICAgICAgICAgPSAweDAwMDAwNjE0OwotCXN0YXRpYyBpbnQgV2luZG93RGVhY3RpdmF0ZSAgICAgICA9IDB4MDAwMDA2MTU7Ci0Jc3RhdGljIGludCBTaGVldEZvbGxvd0h5cGVybGluayAgID0gMHgwMDAwMDczZTsKLQotIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0KLQlPbGVBdXRvbWF0aW9uIGV4Y2VsU2hlZXQgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0JaW50W10gZGlzcElEcyA9IGV4Y2VsU2hlZXQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyJBcHBsaWNhdGlvbiJ9KTsKLQlWYXJpYW50IHBWYXJSZXN1bHQgPSBleGNlbFNoZWV0LmdldFByb3BlcnR5KGRpc3BJRHNbMF0pOwotCU9sZUF1dG9tYXRpb24gYXBwbGljYXRpb24gPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQlleGNlbFNoZWV0LmRpc3Bvc2UoKTsKLQkKLQlpbnQgZXZlbnRJRCA9IFNoZWV0U2VsZWN0aW9uQ2hhbmdlOwotCU9sZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoT2xlRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gaGFzIGNoYW5nZWQiKTsKLQkJCS8vIHR3byBhcmd1bWVudHMgd2hpY2ggbXVzdCBiZSByZWxlYXNlZCAocm93IGFuZCBjb2x1bW4pCi0JCQlWYXJpYW50W10gYXJncyA9IGUuYXJndW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGFyZ3NbaV0pOwotCQkJCWFyZ3MgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX07Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihhcHBsaWNhdGlvbiwgSUlEX0FwcEV2ZW50cywgZXZlbnRJRCwgbGlzdGVuZXIpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlhcHBsaWNhdGlvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU1YmQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzb3J0IGEgdGFibGUgYnkgY29sdW1uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgIGNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLSAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJhIiwgIjMifSk7Ci0gICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYiIsICIyIn0pOwotICAgIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImMiLCAiMSJ9KTsKLSAgICBjb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0gICAgY29sdW1uMi5zZXRXaWR0aCgxMDApOwotICAgIExpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IChUYWJsZUNvbHVtbillLndpZGdldDsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbHVtbiA9PSBjb2x1bW4xID8gMCA6IDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMSA9IGl0ZW1zW2ldLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMiA9IGl0ZW1zW2pdLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGF0b3IuY29tcGFyZSh2YWx1ZTEsIHZhbHVlMikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB7aXRlbXNbaV0uZ2V0VGV4dCgwKSwgaXRlbXNbaV0uZ2V0VGV4dCgxKX07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCh2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGNvbHVtbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLSAgICBjb2x1bW4yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0gICAgdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4xKTsKLSAgICB0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0gICAgc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLngsIDMwMCk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjBiZDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29vbEJhciBiYXIgPSBuZXcgQ29vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJQ29vbEl0ZW0gaXRlbSA9IG5ldyBDb29sSXRlbSAoYmFyLCBTV1QuTk9ORSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChiYXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpdGVtLnNldFByZWZlcnJlZFNpemUgKGl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCAoYnV0dG9uKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2MzE1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsbCBhIHNoYXBlIHdpdGggYSBwcmVkZWZpbmVkIHBhdHRlcm4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAwIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vZGVmaW5lIGEgcGF0dGVybiBvbiBhbiBpbWFnZQotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMDAsIDEwMDApOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKHllbGxvdyk7Ci0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDEwMDAsIDEwMDAsIHRydWUpOwotCWZvciAoaW50IGk9LTUwMDsgaTwxMDAwOyBpKz0xMCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQlnYy5kcmF3TGluZShpLCAwLCA1MDAgKyBpLCAxMDAwKTsKLQkJZ2MuZHJhd0xpbmUoNTAwICsgaSwgMCwgaSwgMTAwMCk7Ci0JfQkKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgUGF0dGVybiBwYXR0ZXJuOwotCXRyeSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkaXNwbGF5LCBpbWFnZSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQljLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIHIgPSAoKENvbXBvc2l0ZSlldmVudC53aWRnZXQpLmdldENsaWVudEFyZWEoKTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJCWdjLmZpbGxPdmFsKDUsIDUsIHIud2lkdGggLSAxMCwgci5oZWlnaHQgLSAxMCk7CQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NGY4MzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFZpcnR1YWwgVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSB3aXRoIDEsMDAwLDAwMCBpdGVtcyAobGF6eSwgcGFnZSBzaXplIDY0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDEgewotCi1zdGF0aWMgZmluYWwgaW50IFBBR0VfU0laRSA9IDY0Owotc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULlZJUlRVQUwgfCBTV1QuQk9SREVSKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZiAoaXRlbSk7Ci0JCQlpbnQgc3RhcnQgPSBNYXRoLm1heCAoMCwgaW5kZXggLSBQQUdFX1NJWkUgLyAyKTsKLQkJCWludCBlbmQgPSBNYXRoLm1pbiAodGFibGUuZ2V0SXRlbUNvdW50ICgpLCBpbmRleCArIFBBR0VfU0laRSAvIDIpOwotCQkJZm9yIChpbnQgaT1zdGFydDsgaTxlbmQ7IGkrKykgewotCQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpKTsKLQkJCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJCX0KLQkJfQotCX0pOwotCXRhYmxlLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhICgyMDAsIDIwMCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQWRkIEl0ZW1zIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCXRhYmxlLnNldEl0ZW1Db3VudCAoQ09VTlQpOwotCQkJbG9uZyB0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCWxhYmVsLnNldFRleHQgKCJJdGVtczogIiArIENPVU5UICsgIiwgVGltZTogIiArICh0MiAtIHQxKSArICIgKG1zKSBbcGFnZT0iICsgUEFHRV9TSVpFICsgIl0iKTsKLQkJCXNoZWxsLmxheW91dCAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViOTA0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUcmVlIGV4YW1wbGUgc25pcHBldDogcG9wdWxhdGUgdHJlZSBsYXppbHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULlZJUlRVQUwgfCBTV1QuQk9SREVSKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQlpZiAocGFyZW50SXRlbSA9PSBudWxsKSB7Ci0JCQkJdGV4dCA9ICJub2RlICIrdHJlZS5pbmRleE9mKGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0ZXh0ID0gcGFyZW50SXRlbS5nZXRUZXh0KCkrIiAtICIrcGFyZW50SXRlbS5pbmRleE9mKGl0ZW0pOwotCQkJfQotCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQkJaXRlbS5zZXRJdGVtQ291bnQoMTApOwotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRJdGVtQ291bnQoMjApOwotCXNoZWxsLnNldFNpemUoNDAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmEwMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2FudmFzIGV4YW1wbGUgc25pcHBldDogaW1wbGVtZW50IHRhYiB0cmF2ZXJzYWwgKGJlaGF2ZSBsaWtlIGEgdGFiIGdyb3VwKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMzIpOwotCWIuc2V0VGV4dCAoIkJ1dHRvbiIpOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGIpOwotCWZpbmFsIENhbnZhcyBjID0gbmV3IENhbnZhcyAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMuc2V0Qm91bmRzICgxMCwgNTAsIDEwMCwgMzIpOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkvKiBEbyB0YWIgZ3JvdXAgdHJhdmVyc2FsICovCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoJCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVDoJCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9QUkVWSU9VUzoKLQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuRm9jdXNJbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWMuc2V0QmFja2dyb3VuZCAocmVkKTsKLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWMuc2V0QmFja2dyb3VuZCAoYmx1ZSk7Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIktFWSIpOwotCQkJZm9yIChpbnQgaT0wOyBpPDY0OyBpKyspIHsKLQkJCQlDb2xvciBjMSA9IHJlZCwgYzIgPSBibHVlOwotCQkJCWlmIChjLmlzRm9jdXNDb250cm9sICgpKSB7Ci0JCQkJCWMxID0gYmx1ZTsgIGMyID0gcmVkOwotCQkJCX0KLQkJCQljLnNldEJhY2tncm91bmQgKGMxKTsKLQkJCQljLnVwZGF0ZSAoKTsKLQkJCQljLnNldEJhY2tncm91bmQgKGMyKTsKLQkJCX0KLQkJfQotCX0pOwotCVRleHQgdCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXQuc2V0Qm91bmRzICgxMCwgODUsIDEwMCwgMzIpOwotCi0JVGV4dCByID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlyLnNldEJvdW5kcyAoMTAsIDEyMCwgMTAwLCAzMik7Ci0JCi0JYy5zZXRGb2N1cyAoKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YjViYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc2VsZWN0IGFsbCB0aGUgdGV4dCBpbiB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgMCk7Ci0JdGV4dC5zZXRUZXh0ICgiQVNERiIpOwotCXRleHQuc2V0U2l6ZSAoNjQsIDMyKTsKLQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjM2OTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJhY2tlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyYWNrZXIgKGRyYWcgb24gbW91c2UgZG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVHJhY2tlciB0cmFja2VyID0gbmV3IFRyYWNrZXIgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQl0cmFja2VyLnNldFJlY3RhbmdsZXMgKG5ldyBSZWN0YW5nbGUgW10gewotCQkJCW5ldyBSZWN0YW5nbGUgKGUueCwgZS55LCAxMDAsIDEwMCksCi0JCQl9KTsKLQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEyMTdmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IENSIGluIGEgdGV4dCBvciBjb21ibyBjb250cm9sIChkZWZhdWx0IHNlbGVsZWN0aW9uKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQS0xIiwgIkItMSIsICJDLTEifSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0ICgic29tZSB0ZXh0Iik7Ci0JY29tYm8uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuIChlLndpZGdldCArICIgLSBEZWZhdWx0IFNlbGVjdGlvbiIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGUud2lkZ2V0ICsgIiAtIERlZmF1bHQgU2VsZWN0aW9uIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmM3ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJpbnQga2V5IHN0YXRlLCBjb2RlIGFuZCBjaGFyYWN0ZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1IHsKLQotc3RhdGljIFN0cmluZyBzdGF0ZU1hc2sgKGludCBzdGF0ZU1hc2spIHsKLQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMCkgc3RyaW5nICs9ICIgQ1RSTCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwKSBzdHJpbmcgKz0gIiBBTFQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSBzdHJpbmcgKz0gIiBTSElGVCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ09NTUFORCkgIT0gMCkgc3RyaW5nICs9ICIgQ09NTUFORCI7Ci0JcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIFN0cmluZyBjaGFyYWN0ZXIgKGNoYXIgY2hhcmFjdGVyKSB7Ci0Jc3dpdGNoIChjaGFyYWN0ZXIpIHsKLQkJY2FzZSAwOiAJCXJldHVybiAiJ1xcMCciOwotCQljYXNlIFNXVC5CUzoJcmV0dXJuICInXFxiJyI7Ci0JCWNhc2UgU1dULkNSOglyZXR1cm4gIidcXHInIjsKLQkJY2FzZSBTV1QuREVMOglyZXR1cm4gIkRFTCI7Ci0JCWNhc2UgU1dULkVTQzoJcmV0dXJuICJFU0MiOwotCQljYXNlIFNXVC5MRjoJcmV0dXJuICInXFxuJyI7Ci0JCWNhc2UgU1dULlRBQjoJcmV0dXJuICInXFx0JyI7Ci0JfQotCXJldHVybiAiJyIgKyBjaGFyYWN0ZXIgKyInIjsKLX0KLQotc3RhdGljIFN0cmluZyBrZXlDb2RlIChpbnQga2V5Q29kZSkgewotCXN3aXRjaCAoa2V5Q29kZSkgewotCQkKLQkJLyogS2V5Ym9hcmQgYW5kIE1vdXNlIE1hc2tzICovCi0JCWNhc2UgU1dULkFMVDogCQlyZXR1cm4gIkFMVCI7Ci0JCWNhc2UgU1dULlNISUZUOiAJcmV0dXJuICJTSElGVCI7Ci0JCWNhc2UgU1dULkNPTlRST0w6CXJldHVybiAiQ09OVFJPTCI7Ci0JCWNhc2UgU1dULkNPTU1BTkQ6CXJldHVybiAiQ09NTUFORCI7Ci0JCQkKLQkJLyogTm9uLU51bWVyaWMgS2V5cGFkIEtleXMgKi8KLQkJY2FzZSBTV1QuQVJST1dfVVA6CQlyZXR1cm4gIkFSUk9XX1VQIjsKLQkJY2FzZSBTV1QuQVJST1dfRE9XTjoJcmV0dXJuICJBUlJPV19ET1dOIjsKLQkJY2FzZSBTV1QuQVJST1dfTEVGVDoJcmV0dXJuICJBUlJPV19MRUZUIjsKLQkJY2FzZSBTV1QuQVJST1dfUklHSFQ6CXJldHVybiAiQVJST1dfUklHSFQiOwotCQljYXNlIFNXVC5QQUdFX1VQOgkJcmV0dXJuICJQQUdFX1VQIjsKLQkJY2FzZSBTV1QuUEFHRV9ET1dOOgkJcmV0dXJuICJQQUdFX0RPV04iOwotCQljYXNlIFNXVC5IT01FOgkJCXJldHVybiAiSE9NRSI7Ci0JCWNhc2UgU1dULkVORDoJCQlyZXR1cm4gIkVORCI7Ci0JCWNhc2UgU1dULklOU0VSVDoJCXJldHVybiAiSU5TRVJUIjsKLQotCQkvKiBWaXJ0dWFsIGFuZCBBc2NpaSBLZXlzICovCi0JCWNhc2UgU1dULkJTOglyZXR1cm4gIkJTIjsKLQkJY2FzZSBTV1QuQ1I6CXJldHVybiAiQ1IiOwkJCi0JCWNhc2UgU1dULkRFTDoJcmV0dXJuICJERUwiOwotCQljYXNlIFNXVC5FU0M6CXJldHVybiAiRVNDIjsKLQkJY2FzZSBTV1QuTEY6CXJldHVybiAiTEYiOwotCQljYXNlIFNXVC5UQUI6CXJldHVybiAiVEFCIjsKLQkKLQkJLyogRnVuY3Rpb25zIEtleXMgKi8KLQkJY2FzZSBTV1QuRjE6CXJldHVybiAiRjEiOwotCQljYXNlIFNXVC5GMjoJcmV0dXJuICJGMiI7Ci0JCWNhc2UgU1dULkYzOglyZXR1cm4gIkYzIjsKLQkJY2FzZSBTV1QuRjQ6CXJldHVybiAiRjQiOwotCQljYXNlIFNXVC5GNToJcmV0dXJuICJGNSI7Ci0JCWNhc2UgU1dULkY2OglyZXR1cm4gIkY2IjsKLQkJY2FzZSBTV1QuRjc6CXJldHVybiAiRjciOwotCQljYXNlIFNXVC5GODoJcmV0dXJuICJGOCI7Ci0JCWNhc2UgU1dULkY5OglyZXR1cm4gIkY5IjsKLQkJY2FzZSBTV1QuRjEwOglyZXR1cm4gIkYxMCI7Ci0JCWNhc2UgU1dULkYxMToJcmV0dXJuICJGMTEiOwotCQljYXNlIFNXVC5GMTI6CXJldHVybiAiRjEyIjsKLQkJY2FzZSBTV1QuRjEzOglyZXR1cm4gIkYxMyI7Ci0JCWNhc2UgU1dULkYxNDoJcmV0dXJuICJGMTQiOwotCQljYXNlIFNXVC5GMTU6CXJldHVybiAiRjE1IjsKLQkJCi0JCS8qIE51bWVyaWMgS2V5cGFkIEtleXMgKi8KLQkJY2FzZSBTV1QuS0VZUEFEX0FERDoJCXJldHVybiAiS0VZUEFEX0FERCI7Ci0JCWNhc2UgU1dULktFWVBBRF9TVUJUUkFDVDoJcmV0dXJuICJLRVlQQURfU1VCVFJBQ1QiOwotCQljYXNlIFNXVC5LRVlQQURfTVVMVElQTFk6CXJldHVybiAiS0VZUEFEX01VTFRJUExZIjsKLQkJY2FzZSBTV1QuS0VZUEFEX0RJVklERToJCXJldHVybiAiS0VZUEFEX0RJVklERSI7Ci0JCWNhc2UgU1dULktFWVBBRF9ERUNJTUFMOglyZXR1cm4gIktFWVBBRF9ERUNJTUFMIjsKLQkJY2FzZSBTV1QuS0VZUEFEX0NSOgkJCXJldHVybiAiS0VZUEFEX0NSIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzA6CQkJcmV0dXJuICJLRVlQQURfMCI7Ci0JCWNhc2UgU1dULktFWVBBRF8xOgkJCXJldHVybiAiS0VZUEFEXzEiOwotCQljYXNlIFNXVC5LRVlQQURfMjoJCQlyZXR1cm4gIktFWVBBRF8yIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzM6CQkJcmV0dXJuICJLRVlQQURfMyI7Ci0JCWNhc2UgU1dULktFWVBBRF80OgkJCXJldHVybiAiS0VZUEFEXzQiOwotCQljYXNlIFNXVC5LRVlQQURfNToJCQlyZXR1cm4gIktFWVBBRF81IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzY6CQkJcmV0dXJuICJLRVlQQURfNiI7Ci0JCWNhc2UgU1dULktFWVBBRF83OgkJCXJldHVybiAiS0VZUEFEXzciOwotCQljYXNlIFNXVC5LRVlQQURfODoJCQlyZXR1cm4gIktFWVBBRF84IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzk6CQkJcmV0dXJuICJLRVlQQURfOSI7Ci0JCWNhc2UgU1dULktFWVBBRF9FUVVBTDoJCXJldHVybiAiS0VZUEFEX0VRVUFMIjsKLQotCQkvKiBPdGhlciBrZXlzICovCi0JCWNhc2UgU1dULkNBUFNfTE9DSzoJCXJldHVybiAiQ0FQU19MT0NLIjsKLQkJY2FzZSBTV1QuTlVNX0xPQ0s6CQlyZXR1cm4gIk5VTV9MT0NLIjsKLQkJY2FzZSBTV1QuU0NST0xMX0xPQ0s6CXJldHVybiAiU0NST0xMX0xPQ0siOwotCQljYXNlIFNXVC5QQVVTRToJCQlyZXR1cm4gIlBBVVNFIjsKLQkJY2FzZSBTV1QuQlJFQUs6CQkJcmV0dXJuICJCUkVBSyI7Ci0JCWNhc2UgU1dULlBSSU5UX1NDUkVFTjoJcmV0dXJuICJQUklOVF9TQ1JFRU4iOwotCQljYXNlIFNXVC5IRUxQOgkJCXJldHVybiAiSEVMUCI7Ci0JfQotCXJldHVybiBjaGFyYWN0ZXIgKChjaGFyKSBrZXlDb2RlKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBlLnR5cGUgPT0gU1dULktleURvd24gPyAiRE9XTjoiIDogIlVQICA6IjsKLQkJCXN0cmluZyArPSAiIHN0YXRlTWFzaz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLnN0YXRlTWFzaykgKyBzdGF0ZU1hc2sgKGUuc3RhdGVNYXNrKSArICIsIjsKLQkJCXN0cmluZyArPSAiIGtleUNvZGU9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5rZXlDb2RlKSArICIgIiArIGtleUNvZGUgKGUua2V5Q29kZSkgKyAiLCI7Ci0JCQlzdHJpbmcgKz0gIiBjaGFyYWN0ZXI9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5jaGFyYWN0ZXIpICsgIiAiICsgY2hhcmFjdGVyIChlLmNoYXJhY3Rlcik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cmluZyk7Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuS2V5VXAsIGxpc3RlbmVyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjZTVlOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21ibyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvbWJvIGJveCAobm9uLWVkaXRhYmxlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChzaGVsbCwgU1dULlJFQURfT05MWSk7Ci0JY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJBIiwgIkIiLCAiQyJ9KTsKLQljb21iby5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNhOWMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogb3BlbiBhIHNoZWxsIG1pbmltaXplZCAoaWNvbmlmaWVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldE1pbmltaXplZCAodHJ1ZSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5MWZjYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IG9wZW4gYSBzaGVsbCBtYXhpbWl6ZWQgKGZ1bGwgc2NyZWVuKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldE1heGltaXplZCAodHJ1ZSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0N2ZmYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgYmFyIGFuZCBwdWxsIGRvd24gbWVudSAoYWNjZWxlcmF0b3JzLCBtbmVtb25pY3MpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0JTWVudUl0ZW0gZmlsZUl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCWZpbGVJdGVtLnNldFRleHQgKCJGaWxlIik7Ci0JTWVudSBzdWJtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlmaWxlSXRlbS5zZXRNZW51IChzdWJtZW51KTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdCBBbGwiKTsKLQkJfQotCX0pOwotCWl0ZW0uc2V0VGV4dCAoIlNlbGVjdCAmQWxsXHRDdHJsK0EiKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yIChTV1QuQ1RSTCArICdBJyk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWYxZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgYSB0YWJsZSBjZWxsIGZyb20gbW91c2UgZG93biAoU1dULkZVTExfU0VMRUNUSU9OKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTAotCQkJfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZpbmFsIGludCByb3dDb3VudCA9IDY0LCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChqLCAiSXRlbSAiICsgaSArICItIiArIGopOwotCQl9Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIDIwMCk7Ci0JdGFibGUuc2V0U2l6ZShzaXplKTsKLQlzaGVsbC5wYWNrKCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0ocHQpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzKGkpOwotCQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZW0gIiArIGluZGV4ICsgIi0iICsgaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODEzODkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGludm9rZSB0aGUgc3lzdGVtIHRleHQgZWRpdG9yIG9uIGF1dG9leGVjLmJhdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlQcm9ncmFtIHAgPSBQcm9ncmFtLmZpbmRQcm9ncmFtICgiLnR4dCIpOwotCWlmIChwICE9IG51bGwpIHAuZXhlY3V0ZSAoImM6XFxhdXRvZXhlYy5iYXQiKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk4YzFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyYWNrZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmFja2VyIChkcmFnIHdoZW4gInRvcm4gb2ZmIikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVBvaW50IHBvaW50ID0gbnVsbDsKLQkJc3RhdGljIGZpbmFsIGludCBKSVRURVIgPSA4OwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChwb2ludCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBkZWx0YVggPSBwb2ludC54IC0gZXZlbnQueCwgZGVsdGFZID0gcG9pbnQueSAtIGV2ZW50Lnk7Ci0JCQkJCWlmIChNYXRoLmFicyAoZGVsdGFYKSA8IEpJVFRFUiAmJiBNYXRoLmFicyAoZGVsdGFZKSA8IEpJVFRFUikgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVRyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyIChkaXNwbGF5LCBTV1QuTk9ORSk7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gZGlzcGxheS5tYXAgKHNoZWxsLCBudWxsLCBzaGVsbC5nZXRDbGllbnRBcmVhICgpKTsKLQkJCQkJcmVjdC54IC09IGRlbHRhWDsKLQkJCQkJcmVjdC55IC09IGRlbHRhWTsKLQkJCQkJdHJhY2tlci5zZXRSZWN0YW5nbGVzIChuZXcgUmVjdGFuZ2xlIFtdIHtyZWN0fSk7Ci0JCQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlwb2ludCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjYmRhOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmFtIGV4YW1wbGUgc25pcHBldDogZmluZCB0aGUgaWNvbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IGVkaXRzIC5ibXAgZmlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJDYW4ndCBmaW5kIGljb24gZm9yIC5ibXAiKTsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JUHJvZ3JhbSBwID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSAoIi5ibXAiKTsKLQlpZiAocCAhPSBudWxsKSB7Ci0JCUltYWdlRGF0YSBkYXRhID0gcC5nZXRJbWFnZURhdGEgKCk7Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBkYXRhKTsKLQkJCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JCX0KLQl9Ci0JbGFiZWwucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYzkxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXJlY3RvcnlEaWFsb2cgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgZGlyZWN0b3J5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyAoc2hlbGwpOwotCWRpYWxvZy5zZXRGaWx0ZXJQYXRoICgiYzpcXCIpOyAvL1dpbmRvd3Mgc3BlY2lmaWMKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJSRVNVTFQ9IiArIGRpYWxvZy5vcGVuICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc2NWNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBMYWJlbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhYmVsICh3aXRoIGFuIGltYWdlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JbGFiZWwucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7IAotCX0gCi0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4N2NlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChubyBjb2x1bW5zLCBubyBoZWFkZXJzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRTaXplICgxMDAsIDEwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNzI4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGZsYXQgdG9vbCBiYXIgKGltYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCX0KLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2Y2Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGFiZWwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYWJlbCAoYSBzZXBhcmF0b3IpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JbmV3IExhYmVsIChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5WRVJUSUNBTCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFlM2E1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKGNvbHVtbnMsIGhlYWRlcnMsIGxpbmVzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlTdHJpbmdbXSB0aXRsZXMgPSB7IiAiLCAiQyIsICIhIiwgIkRlc2NyaXB0aW9uIiwgIlJlc291cmNlIiwgIkluIEZvbGRlciIsICJMb2NhdGlvbiJ9OwotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAodGl0bGVzIFtpXSk7Ci0JfQkKLQlpbnQgY291bnQgPSAxMjg7Ci0JZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKDAsICJ4Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoMSwgInkiKTsKLQkJaXRlbS5zZXRUZXh0ICgyLCAiISIpOwotCQlpdGVtLnNldFRleHQgKDMsICJ0aGlzIHN0dWZmIGJlaGF2ZXMgdGhlIHdheSBJIGV4cGVjdCIpOwotCQlpdGVtLnNldFRleHQgKDQsICJhbG1vc3QgZXZlcnl3aGVyZSIpOwotCQlpdGVtLnNldFRleHQgKDUsICJzb21lLmZvbGRlciIpOwotCQlpdGVtLnNldFRleHQgKDYsICJsaW5lICIgKyBpICsgIiBpbiBub3doZXJlIik7Ci0JfQotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uIChpKS5wYWNrICgpOwotCX0JCi0JdGFibGUuc2V0U2l6ZSAodGFibGUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCAyMDApKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM0MmE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzOSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM4NDExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBlc2NhcGUgZnJvbSBjbG9zaW5nIGEgZGlhbG9nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiT3BlbiBEaWFsb2cgLi4uIik7Ci0JCWIucGFjaygpOwotCQliLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNKTsKLQkJCQlkaWFsb2cuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0JCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjU3NmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBwb3B1cCBtZW51IChzZXQgaW4gbXVsdGlwbGUgY29udHJvbHMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMxLnNldFNpemUgKDEwMCwgMTAwKTsKLQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzIuc2V0Qm91bmRzICgxMDAsIDAsIDEwMCwgMTAwKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJQb3B1cCIpOwotCWMxLnNldE1lbnUgKG1lbnUpOwotCWMyLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhMWM3MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCB0aXBzIGZvciBhIHRhYiBmb2xkZXIsIHRvb2wgYmFyIGFuZCBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlTdHJpbmcgc3RyaW5nID0gIlRoaXMgaXMgYSBzdHJpbmdcbndpdGggYSBuZXcgbGluZS4iOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9sZGVyLnNldFNpemUgKDIwMCwgMjAwKTsKLQlUYWJJdGVtIGl0ZW0wID0gbmV3IFRhYkl0ZW0gKGZvbGRlciwgMCk7Ci0JaXRlbTAuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJhci5zZXRCb3VuZHMgKDAsIDIwMCwgMjAwLCA2NCk7Ci0JVG9vbEl0ZW0gaXRlbTEgPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JaXRlbTEuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7Ci0Jc2hlbGwuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzI2OWY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBnZXQgdGhlIGJvdW5kcyBhbmQgY2xpZW50IGFyZWEgb2YgYSBkaXNwbGF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJCT1VORFM9IiArIGRpc3BsYXkuZ2V0Qm91bmRzICgpICsgIiBDTElFTlQ9IiArIGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTYzNDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2FyZXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjYXJldCAodXNpbmcgYW4gaW1hZ2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIDIwLCAyMCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCAod2hpdGUpOwotCWdjLmRyYXdMaW5lICgwLCAwLCAxOSwgMTkpOwotCWdjLmRyYXdMaW5lICgxOSwgMCwgMCwgMTkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JY2FyZXQuc2V0TG9jYXRpb24gKDEwLCAxMCk7Ci0JY2FyZXQuc2V0SW1hZ2UgKGltYWdlKTsKLQlnYyA9IG5ldyBHQyAoc2hlbGwpOwotCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIDEwLCA2NCk7Ci0JY2FyZXQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCWdjLmRyYXdTdHJpbmcgKCJUZXN0IiwgMTIsIDEyKTsKLQljYXJldC5zZXRWaXNpYmxlICh0cnVlKTsKLQlnYy5kaXNwb3NlICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2ODY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgaGFuZCBjdXJzb3IgaW50byBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yIChkaXNwbGF5LCBTV1QuQ1VSU09SX0hBTkQpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCWZpbmFsIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbiAoc2hlbGwsIDApOwotCWIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMjAwKTsKLQliLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJYi5zZXRDdXJzb3IgKGN1cnNvcik7Ci0JCX0KLQl9KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWNlZTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2NhbGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzY2FsZSAobWF4aW11bSA0MCwgcGFnZSBpbmNyZW1lbnQgNSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlTY2FsZSBzY2FsZSA9IG5ldyBTY2FsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXNjYWxlLnNldFNpemUgKDIwMCwgNjQpOwotCXNjYWxlLnNldE1heGltdW0gKDQwKTsKLQlzY2FsZS5zZXRQYWdlSW5jcmVtZW50ICg1KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhYzYyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogaW50ZXJjZXB0IG1vdXNlIGV2ZW50cyAoZHJhZyBhIGJ1dHRvbiB3aXRoIHRoZSBtb3VzZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDYgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULk5PTkUpOwotCWNvbXBvc2l0ZS5zZXRFbmFibGVkIChmYWxzZSk7Ci0JY29tcG9zaXRlLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiIpOwotCWNvbXBvc2l0ZS5wYWNrICgpOwotCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAoMTAsIDEwKTsKLQlmaW5hbCBQb2ludCBbXSBvZmZzZXQgPSBuZXcgUG9pbnQgWzFdOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldEJvdW5kcyAoKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKGV2ZW50LngsIGV2ZW50LnkpKSB7Ci0JCQkJCQlQb2ludCBwdDEgPSBjb21wb3NpdGUudG9EaXNwbGF5ICgwLCAwKTsKLQkJCQkJCVBvaW50IHB0MiA9IHNoZWxsLnRvRGlzcGxheSAoZXZlbnQueCwgZXZlbnQueSk7IAotCQkJCQkJb2Zmc2V0IFswXSA9IG5ldyBQb2ludCAocHQyLnggLSBwdDEueCwgcHQyLnkgLSBwdDEueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAob2Zmc2V0IFswXSAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwdCA9IG9mZnNldCBbMF07Ci0JCQkJCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGV2ZW50LnggLSBwdC54LCBldmVudC55IC0gcHQueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCQkJb2Zmc2V0IFswXSA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjA3MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0b29sIGJhciAobm9ybWFsLCBob3QgYW5kIGRpc2FibGVkIGltYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlJbWFnZSBkaXNhYmxlZEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCWNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKTsKLQlnYyA9IG5ldyBHQyAoZGlzYWJsZWRJbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGRpc2FibGVkSW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCQotCUltYWdlIGhvdEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCWNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZ2MgPSBuZXcgR0MgKGhvdEltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaG90SW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCQotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCWJhci5zZXRTaXplICgyMDAsIDMyKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JCWl0ZW0uc2V0RGlzYWJsZWRJbWFnZSAoZGlzYWJsZWRJbWFnZSk7Ci0JCWl0ZW0uc2V0SG90SW1hZ2UgKGhvdEltYWdlKTsKLQkJaWYgKGkgJSAzID09IDApIGl0ZW0uc2V0RW5hYmxlZCAoZmFsc2UpOwotCX0KLQkKLQlzaGVsbC5vcGVuICgpOwotCWJhci5nZXRJdGVtcyAoKSBbMV0uc2V0SW1hZ2UgKGRpc2FibGVkSW1hZ2UpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc2FibGVkSW1hZ2UuZGlzcG9zZSAoKTsKLQlob3RJbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFjNTNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ2FudmFzIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGFuIGltYWdlIChmbGlja2VyIGZyZWUsIG5vIGRvdWJsZSBidWZmZXJpbmcpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwKLQkJU1dULlNIRUxMX1RSSU0gfCBTV1QuTk9fQkFDS0dST1VORCB8Ci0JCVNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlJbWFnZSBvcmlnaW5hbEltYWdlID0gbnVsbDsKLQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULk9QRU4pOwotCWRpYWxvZy5zZXRUZXh0ICgiT3BlbiBhbiBpbWFnZSBmaWxlIG9yIGNhbmNlbCIpOwotCVN0cmluZyBzdHJpbmcgPSBkaWFsb2cub3BlbiAoKTsKLQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJb3JpZ2luYWxJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc3RyaW5nKTsKLQl9Ci0JaWYgKG9yaWdpbmFsSW1hZ2UgPT0gbnVsbCkgewotCQlpbnQgd2lkdGggPSAxNTAsIGhlaWdodCA9IDIwMDsKLQkJb3JpZ2luYWxJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCUdDIGdjID0gbmV3IEdDIChvcmlnaW5hbEltYWdlKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSAoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLmRyYXdMaW5lICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJZ2MuZHJhd0xpbmUgKDAsIGhlaWdodCwgd2lkdGgsIDApOwotCQlnYy5kcmF3VGV4dCAoIkRlZmF1bHQgSW1hZ2UiLCAxMCwgMTApOwotCQlnYy5kaXNwb3NlICgpOwotCX0KLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG9yaWdpbmFsSW1hZ2U7Ci0JZmluYWwgUG9pbnQgb3JpZ2luID0gbmV3IFBvaW50ICgwLCAwKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhciA9IHNoZWxsLmdldEhvcml6b250YWxCYXIgKCk7Ci0JaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgZGVzdFggPSAtaFNlbGVjdGlvbiAtIG9yaWdpbi54OwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQlzaGVsbC5zY3JvbGwgKGRlc3RYLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJb3JpZ2luLnggPSAtaFNlbGVjdGlvbjsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyID0gc2hlbGwuZ2V0VmVydGljYWxCYXIgKCk7Ci0JdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgZGVzdFkgPSAtdlNlbGVjdGlvbiAtIG9yaWdpbi55OwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQlzaGVsbC5zY3JvbGwgKDAsIGRlc3RZLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJb3JpZ2luLnkgPSAtdlNlbGVjdGlvbjsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIGNsaWVudCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQloQmFyLnNldE1heGltdW0gKHJlY3Qud2lkdGgpOwotCQkJdkJhci5zZXRNYXhpbXVtIChyZWN0LmhlaWdodCk7Ci0JCQloQmFyLnNldFRodW1iIChNYXRoLm1pbiAocmVjdC53aWR0aCwgY2xpZW50LndpZHRoKSk7Ci0JCQl2QmFyLnNldFRodW1iIChNYXRoLm1pbiAocmVjdC5oZWlnaHQsIGNsaWVudC5oZWlnaHQpKTsKLQkJCWludCBoUGFnZSA9IHJlY3Qud2lkdGggLSBjbGllbnQud2lkdGg7Ci0JCQlpbnQgdlBhZ2UgPSByZWN0LmhlaWdodCAtIGNsaWVudC5oZWlnaHQ7Ci0JCQlpbnQgaFNlbGVjdGlvbiA9IGhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IHZTZWxlY3Rpb24gPSB2QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWlmIChoU2VsZWN0aW9uID49IGhQYWdlKSB7Ci0JCQkJaWYgKGhQYWdlIDw9IDApIGhTZWxlY3Rpb24gPSAwOwotCQkJCW9yaWdpbi54ID0gLWhTZWxlY3Rpb247Ci0JCQl9Ci0JCQlpZiAodlNlbGVjdGlvbiA+PSB2UGFnZSkgewotCQkJCWlmICh2UGFnZSA8PSAwKSB2U2VsZWN0aW9uID0gMDsKLQkJCQlvcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQkJc2hlbGwucmVkcmF3ICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIG9yaWdpbi54LCBvcmlnaW4ueSk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJaW50IG1hcmdpbldpZHRoID0gY2xpZW50LndpZHRoIC0gcmVjdC53aWR0aDsKLQkJCWlmIChtYXJnaW5XaWR0aCA+IDApIHsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LndpZHRoLCAwLCBtYXJnaW5XaWR0aCwgY2xpZW50LmhlaWdodCk7Ci0JCQl9Ci0JCQlpbnQgbWFyZ2luSGVpZ2h0ID0gY2xpZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0OwotCQkJaWYgKG1hcmdpbkhlaWdodCA+IDApIHsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlICgwLCByZWN0LmhlaWdodCwgY2xpZW50LndpZHRoLCBtYXJnaW5IZWlnaHQpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAxNTApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmExMjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0b29sIGJhciAod3JhcCBvbiByZXNpemUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuV1JBUCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZSAocmVjdC53aWR0aCwgU1dULkRFRkFVTFQpOwotCQkJdG9vbEJhci5zZXRTaXplIChzaXplKTsKLQkJfQotCX0pOwotCXRvb2xCYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlYTk3OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNjcm9sbGVkQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGEgY29udHJvbCBpbiBhIHNjcm9sbGVkIGNvbXBvc2l0ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgCi17Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgIC8vIHRoaXMgYnV0dG9uIGlzIGFsd2F5cyA0MDAgeCA0MDAuIFNjcm9sbGJhcnMgYXBwZWFyIGlmIHRoZSB3aW5kb3cgaXMgcmVzaXplZCB0byBiZQotICAgIC8vIHRvbyBzbWFsbCB0byBzaG93IHBhcnQgb2YgdGhlIGJ1dHRvbgotICAgIFNjcm9sbGVkQ29tcG9zaXRlIGMxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBCdXR0b24gYjEgPSBuZXcgQnV0dG9uKGMxLCBTV1QuUFVTSCk7Ci0gICAgYjEuc2V0VGV4dCgiZml4ZWQgc2l6ZSBidXR0b24iKTsKLSAgICBiMS5zZXRTaXplKDQwMCwgNDAwKTsKLSAgICBjMS5zZXRDb250ZW50KGIxKTsKLQotICAgIC8vIHRoaXMgYnV0dG9uIGhhcyBhIG1pbmltdW0gc2l6ZSBvZiA0MDAgeCA0MDAuIElmIHRoZSB3aW5kb3cgaXMgcmVzaXplZCB0byBiZSBiaWcKLSAgICAvLyBlbm91Z2ggdG8gc2hvdyBtb3JlIHRoYW4gNDAwIHggNDAwLCB0aGUgYnV0dG9uIHdpbGwgZ3JvdyBpbiBzaXplLiBJZiB0aGUgd2luZG93Ci0gICAgLy8gaXMgbWFkZSB0b28gc21hbGwgdG8gc2hvdyA0MDAgeCA0MDAsIHNjcm9sbGJhcnMgd2lsbCBhcHBlYXIuCi0gICAgU2Nyb2xsZWRDb21wb3NpdGUgYzIgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIEJ1dHRvbiBiMiA9IG5ldyBCdXR0b24oYzIsIFNXVC5QVVNIKTsKLSAgICBiMi5zZXRUZXh0KCJleHBhbmRpbmcgYnV0dG9uIik7Ci0gICAgYzIuc2V0Q29udGVudChiMik7Ci0gICAgYzIuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLSAgICBjMi5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLSAgICBjMi5zZXRNaW5XaWR0aCg0MDApOwotICAgIGMyLnNldE1pbkhlaWdodCg0MDApOwotCi0gICAgc2hlbGwuc2V0U2l6ZSg2MDAsIDMwMCk7Ci0gICAgc2hlbGwub3BlbiAoKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZkMjk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGRpYWxvZyBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJTaGVsbCIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwpOwotCWRpYWxvZy5zZXRUZXh0ICgiRGlhbG9nIik7Ci0JZGlhbG9nLnNldFNpemUgKDIwMCwgMjAwKTsKLQlkaWFsb2cub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWJkNzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYSB0YWJsZSAoc2V0IHRoZSB0b3AgaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldFRvcEluZGV4ICg5NSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MjQ2MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNlbGVjdCBhbiBpbmRleCAoc2VsZWN0IGFuZCBzY3JvbGwpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldFNlbGVjdGlvbiAoOTUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2FlNDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcmVtb3ZlIHNlbGVjdGVkIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdGFibGUuc2V0TWVudSAobWVudSk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIkRlbGV0ZSBTZWxlY3Rpb24iKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXRhYmxlLnJlbW92ZSAodGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBiM2E0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTYXNoIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCAoYWxsb3cgaXQgdG8gYmUgbW92ZWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2ggKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZFUlRJQ0FMKTsKLQlzYXNoLnNldEJvdW5kcyAoMTAsIDEwLCAzMiwgMTAwKTsKLQlzYXNoLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJc2FzaC5zZXRCb3VuZHMgKGUueCwgZS55LCBlLndpZHRoLCBlLmhlaWdodCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXNhc2guc2V0Rm9jdXMgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZhODNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogcmVzaXplIGEgdGV4dCBjb250cm9sIChzaG93IGFib3V0IDEwIGNoYXJhY3RlcnMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlpbnQgY29sdW1ucyA9IDEwOwotCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzICgpOwotCWludCB3aWR0aCA9IGNvbHVtbnMgKiBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoICgpOwotCWludCBoZWlnaHQgPSBmbS5nZXRIZWlnaHQgKCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQl0ZXh0LnNldFNpemUgKHRleHQuY29tcHV0ZVNpemUgKHdpZHRoLCBoZWlnaHQpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWVhYmI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyZXNzQmFyIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgcHJvZ3Jlc3MgYmFyIChmcm9tIGFub3RoZXIgdGhyZWFkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWZpbmFsIFByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULlNNT09USCk7Ci0JCWJhci5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDMyKTsKLQkJc2hlbGwub3BlbigpOwotCQlmaW5hbCBpbnQgbWF4aW11bSA9IGJhci5nZXRNYXhpbXVtKCk7Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChmaW5hbCBpbnRbXSBpID0gbmV3IGludFsxXTsgaVswXSA8PSBtYXhpbXVtOyBpWzBdKyspIHsKLQkJCQl0cnkge1RocmVhZC5zbGVlcCAoMTAwKTt9IGNhdGNoIChUaHJvd2FibGUgdGgpIHt9Ci0JCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoYmFyLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJCQliYXIuc2V0U2VsZWN0aW9uKGlbMF0pOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyOTVmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmVzc0JhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHByb2dyZXNzIGJhciAoZnJvbSB0aGUgVUkgdGhyZWFkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhciAoc2hlbGwsIFNXVC5TTU9PVEgpOwotCWJhci5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAzMik7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmb3IgKGludCBpPTA7IGk8PWJhci5nZXRNYXhpbXVtICgpOyBpKyspIHsKLQkJdHJ5IHtUaHJlYWQuc2xlZXAgKDEwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7fQotCQliYXIuc2V0U2VsZWN0aW9uIChpKTsKLQl9Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE0NDE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhIGNvbWJvIGJveCBpbiBhIHRvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRvb2xJdGVtIHNlcCA9IG5ldyBUb29sSXRlbSAoYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQlpbnQgc3RhcnQgPSBiYXIuZ2V0SXRlbUNvdW50ICgpOwotCWZvciAoaW50IGk9c3RhcnQ7IGk8c3RhcnQrNDsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoYmFyLCBTV1QuUkVBRF9PTkxZKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCWNvbWJvLmFkZCAoIkl0ZW0gIiArIGkpOwotCX0KLQljb21iby5wYWNrICgpOwotCXNlcC5zZXRXaWR0aCAoY29tYm8uZ2V0U2l6ZSAoKS54KTsKLQlzZXAuc2V0Q29udHJvbCAoY29tYm8pOwotCWJhci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGRhY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGlzdCBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNlbGVjdGVkIGl0ZW1zIGluIGEgbGlzdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIExpc3QgbGlzdCA9IG5ldyBMaXN0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSBsaXN0LmFkZCAoIkl0ZW0gIiArIGkpOwotCWxpc3Quc2V0Qm91bmRzICgwLCAwLCAxMDAsIDEwMCk7Ci0JbGlzdC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCWludCBbXSBzZWxlY3Rpb24gPSBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCWludCBbXSBzZWxlY3Rpb24gPSBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRlZmF1bHRTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzI0NzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHcmlkTGF5b3V0IGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IHdpZGdldHMgaW50byBhIGdyaWQgbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgZmluYWwgQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjLnNldExheW91dChsYXlvdXQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgICAgICBiLnNldFRleHQoIkJ1dHRvbiAiK2kpOwotICAgIH0KLQotICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgIGIuc2V0VGV4dCgiYWRkIGEgbmV3IGJ1dHRvbiBhdCByb3cgMiBjb2x1bW4gMSIpOwotICAgIGZpbmFsIGludFtdIGluZGV4ID0gbmV3IGludFsxXTsKLSAgICBiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgQnV0dG9uIHMgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIHMuc2V0VGV4dCgiU3BlY2lhbCAiK2luZGV4WzBdKTsKLSAgICAgICAgICAgIGluZGV4WzBdKys7Ci0gICAgICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBjLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBzLm1vdmVBYm92ZShjaGlsZHJlblszXSk7Ci0gICAgICAgICAgICBzaGVsbC5sYXlvdXQobmV3IENvbnRyb2xbXSB7c30pOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBzaGVsbC5vcGVuICgpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmNlMTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0d28gb25lIHNob3QgdGltZXJzICg1MDAwIG1zLCAyMDAwIG1zKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCWRpc3BsYXkudGltZXJFeGVjICg1MDAwLCBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiNTAwMCIpOwotCQl9Ci0JfSk7Ci0JZGlzcGxheS50aW1lckV4ZWMgKDIwMDAsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCIyMDAwIik7Ci0JCX0KLQl9KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODI4ODAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNlbGVjdGVkIGl0ZW1zIGluIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWl0ZW0wLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0wLCAwKTsKLQkJCWl0ZW0xLnNldFRleHQgKCJTdWJJdGVtICIgKyBpICsgIiAiICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0xLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0ICgiU3ViSXRlbSAiICsgaSArICIgIiArIGogKyAiICIgKyBrKTsKLQkJCX0JCi0JCX0KLQl9Ci0JdHJlZS5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVHJlZUl0ZW0gW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRyZWVJdGVtIFtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJFeHBhbmQ9eyIgKyBlLml0ZW0gKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkNvbGxhcHNlLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ29sbGFwc2U9eyIgKyBlLml0ZW0gKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5nZXRJdGVtcyAoKSBbMF0uc2V0RXhwYW5kZWQgKHRydWUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmJlYzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBtb3VzZSBzdGF0ZSBhbmQgYnV0dG9uIChkb3duLCBtb3ZlLCB1cCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiVW5rbm93biI7Ci0JCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjogc3RyaW5nID0gIkRPV04iOyBicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6IHN0cmluZyA9ICJNT1ZFIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VVcDogc3RyaW5nID0gIlVQIjsgYnJlYWs7Ci0JCQl9Ci0JCQlzdHJpbmcgKz0iOiBidXR0b246ICIgKyBlLmJ1dHRvbiArICIsICI7Ci0JCQlzdHJpbmcgKz0gInN0YXRlTWFzaz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLnN0YXRlTWFzayk7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjEiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04yKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04yIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMykgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMyI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjQpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjQiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT041KSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT041IjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDc3MzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBkaWFsb2cgc2hlbGwgKHByb21wdCBmb3IgYSB2YWx1ZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCWZpbmFsIGJvb2xlYW4gW10gcmVzdWx0ID0gbmV3IGJvb2xlYW4gWzFdOwotCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JZGlhbG9nLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JZmluYWwgQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0Jb2suc2V0VGV4dCAoIk9rIik7Ci0JQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCWNhbmNlbC5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPW5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVzdWx0IFswXSA9IGV2ZW50LndpZGdldCA9PSBvazsKLQkJCWRpYWxvZy5jbG9zZSAoKTsKLQkJfQotCX07Ci0Jb2suYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQljYW5jZWwuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQlkaWFsb2cucGFjayAoKTsKLQlkaWFsb2cub3BlbiAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJQcm9tcHQgLi4uIik7Ci0Jd2hpbGUgKCFkaWFsb2cuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJSZXN1bHQ6ICIgKyByZXN1bHQgWzBdKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOGRiMTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRhYmxlSXRlbSBbXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUYWJsZUl0ZW0gW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYjY3YTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzaW1wbGUgZGlhbG9nIHVzaW5nIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULldSQVApOwotCWxhYmVsLnNldFRleHQgKCJUaGlzIGlzIGEgbG9uZyB0ZXh0IHN0cmluZyB0aGF0IHdpbGwgd3JhcCB3aGVuIHRoZSBkaWFsb2cgaXMgcmVzaXplZC4iKTsKLQlMaXN0IGxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWxpc3Quc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJJdGVtIDEiLCAiSXRlbTIifSk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIk9rIik7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkNhbmNlbCIpOwotCQotCWZpbmFsIGludCBpbnNldFggPSA0LCBpbnNldFkgPSA0OwotCUZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSBpbnNldFg7Ci0JZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSBpbnNldFk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChmb3JtTGF5b3V0KTsKLQkKLQlQb2ludCBzaXplID0gbGFiZWwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JZmluYWwgRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhIChzaXplLngsIFNXVC5ERUZBVUxUKTsKLQlsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JbGFiZWxEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWxhYmVsLnNldExheW91dERhdGEgKGxhYmVsRGF0YSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlsYWJlbERhdGEud2lkdGggPSByZWN0LndpZHRoIC0gaW5zZXRYICogMjsKLQkJCXNoZWxsLmxheW91dCAoKTsKLQkJfQotCX0pOwotCQkKLQlGb3JtRGF0YSBidXR0b24yRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlidXR0b24yRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtaW5zZXRYKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMURhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGJ1dHRvbjIsIC1pbnNldFgpOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQkKLQlGb3JtRGF0YSBsaXN0RGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsaXN0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlsaXN0RGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsaXN0RGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCBpbnNldFkpOwotCWxpc3REYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoYnV0dG9uMiwgLWluc2V0WSk7Ci0JbGlzdC5zZXRMYXlvdXREYXRhIChsaXN0RGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyOGY4Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCBhIHNpbXBsZSBzY3JpYmJsZSBwcm9ncmFtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlpbnQgbGFzdFggPSAwLCBsYXN0WSA9IDA7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSA9PSAwKSBicmVhazsKLQkJCQkJR0MgZ2MgPSBuZXcgR0MgKHNoZWxsKTsKLQkJCQkJZ2MuZHJhd0xpbmUgKGxhc3RYLCBsYXN0WSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlsYXN0WCA9IGV2ZW50Lng7Ci0JCQkJCWxhc3RZID0gZXZlbnQueTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxNGU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBkcm9wIGRvd24gbWVudSBpbiBhIHRvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCWZpbmFsIFRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChyZWN0LngsIHJlY3QueSArIHJlY3QuaGVpZ2h0KTsKLQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5IChwdCk7Ci0JCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCXRvb2xCYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCW1lbnUuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1MmIxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IHN0b3AgYSByZXBlYXRpbmcgdGltZXIgd2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIlN0b3AgVGltZXIiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JZmluYWwgaW50IHRpbWUgPSA1MDA7Ci0JZmluYWwgUnVubmFibGUgdGltZXIgPSBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJaWYgKGxhYmVsLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCUNvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZCAoKS5lcXVhbHMgKHJlZCkgPyBibHVlIDogcmVkOwotCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCQkJZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRoaXMpOwotCQl9Ci0JfTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGltZXIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAoLTEsIHRpbWVyKTsKLQkJfQotCX0pOwotCWJ1dHRvbi5wYWNrICgpOwotCWxhYmVsLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhIChidXR0b24uZ2V0U2l6ZSAoKSkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YmY5OTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNlbnRlciBhIGxhYmVsIGFuZCBzaW5nbGUgbGluZSB0ZXh0IHVzaW5nIGEgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSB8IFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQgKCJOYW1lIik7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0KLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQotCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzICgpOwotCWludCBjaGFyV2lkdGggPSBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoICgpOwotCWludCB3aWR0aCA9IHRleHQuY29tcHV0ZVNpemUgKGNoYXJXaWR0aCAqIDgsIFNXVC5ERUZBVUxUKS54OwotCWdjLmRpc3Bvc2UgKCk7Ci0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSAod2lkdGgsIFNXVC5ERUZBVUxUKTsKLQl0ZXh0LnNldExheW91dERhdGEgKGRhdGEpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjgzNjNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAobGF6eSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJMYXp5IFRhYmxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJZm9yIChpbnQgaT0wOyBpPDIwMDAwOyBpKyspIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCWZpbmFsIGludCBbXSBpbmRleCA9IG5ldyBpbnQgW10ge2l9OwotCQkJCWRpc3BsYXkuc3luY0V4ZWMgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJaXRlbS5zZXRUZXh0ICgiVGFibGUgSXRlbSAiICsgaW5kZXggWzBdKTsKLQkJCQkJCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQl0aHJlYWQuc3RhcnQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjMjc3OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbiBpY29uIChpbiBtZW1vcnkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAocmVkKTsKLQlnYy5maWxsUmVjdGFuZ2xlICg1LCA1LCAxMCwgMTApOwotCWdjLmRpc3Bvc2UgKCk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSAoKTsKLQkKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhICgKLQkJbmV3IFJHQiBbXSB7Ci0JCQluZXcgUkdCICgwLCAwLCAwKSwKLQkJCW5ldyBSR0IgKDB4RkYsIDB4RkYsIDB4RkYpLAotCQl9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCUltYWdlIG1hc2sgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIG1hc2tEYXRhKTsKLQlnYyA9IG5ldyBHQyAobWFzayk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIDIwLCAyMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAod2hpdGUpOwotCWdjLmZpbGxSZWN0YW5nbGUgKDUsIDUsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQltYXNrRGF0YSA9IG1hc2suZ2V0SW1hZ2VEYXRhICgpOwotCQotCUltYWdlIGljb24gPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlRGF0YSwgbWFza0RhdGEpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0SW1hZ2UgKGljb24pOwotCWJ1dHRvbi5zZXRTaXplICg2MCwgNjApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWljb24uZGlzcG9zZSAoKTsKLQlpbWFnZS5kaXNwb3NlICgpOwotCW1hc2suZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwZDRmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGb3JtTGF5b3V0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2ltcGxlIE9LL0NBTkNFTCBkaWFsb2cgdXNpbmcgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJFeGl0IHRoZSBhcHBsaWNhdGlvbj8iKTsKLQlCdXR0b24gb2tCdXR0b24gPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQlva0J1dHRvbi5zZXRUZXh0ICgiJk9LIik7Ci0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0ICgiJkNhbmNlbCIpOwotCQotCUZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWZvcm0ubWFyZ2luV2lkdGggPSBmb3JtLm1hcmdpbkhlaWdodCA9IDg7Ci0JZGlhbG9nLnNldExheW91dCAoZm9ybSk7Ci0JRm9ybURhdGEgb2tEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCW9rRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCA4KTsKLQlva0J1dHRvbi5zZXRMYXlvdXREYXRhIChva0RhdGEpOwotCUZvcm1EYXRhIGNhbmNlbERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JY2FuY2VsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChva0J1dHRvbiwgOCk7Ci0JY2FuY2VsRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKG9rQnV0dG9uLCAwLCBTV1QuVE9QKTsKLQljYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YSAoY2FuY2VsRGF0YSk7Ci0JCi0JZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rQnV0dG9uKTsKLQlkaWFsb2cucGFjayAoKTsKLQlkaWFsb2cub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmM4OWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsZURpYWxvZyBleGFtcGxlIHNuaXBwZXQ6IHByb21wdCBmb3IgYSBmaWxlIG5hbWUgKHRvIHNhdmUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULlNBVkUpOwotCWRpYWxvZy5zZXRGaWx0ZXJOYW1lcyAobmV3IFN0cmluZyBbXSB7IkJhdGNoIEZpbGVzIiwgIkFsbCBGaWxlcyAoKi4qKSJ9KTsKLQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyAobmV3IFN0cmluZyBbXSB7IiouYmF0IiwgIiouKiJ9KTsgLy9XaW5kb3dzIHdpbGQgY2FyZHMKLQlkaWFsb2cuc2V0RmlsdGVyUGF0aCAoImM6XFwiKTsgLy9XaW5kb3dzIHBhdGgKLQlkaWFsb2cuc2V0RmlsZU5hbWUgKCJmcmVkLmJhdCIpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNhdmUgdG86ICIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ4NTVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUgbWVudSBpdGVtcyBkeW5hbWljYWxseSAod2hlbiBtZW51IHNob3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0cmVlLnNldE1lbnUgKG1lbnUpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCXRyZWVJdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW0uZ2V0VGV4dCAoKSk7Ci0JfQotCW1lbnUuYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIFtdIG1lbnVJdGVtcyA9IG1lbnUuZ2V0SXRlbXMgKCk7Ci0JCQlUcmVlSXRlbSBbXSB0cmVlSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG1lbnVJdGVtcyBbaV0uZ2V0VGV4dCAoKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleDx0cmVlSXRlbXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0cmVlSXRlbXMgW2luZGV4XS5nZXRUZXh0ICgpLmVxdWFscyAodGV4dCkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQltZW51SXRlbXMgW2ldLnNldEVuYWJsZWQgKGluZGV4ICE9IHRyZWVJdGVtcy5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhcmV0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY2FyZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQljYXJldC5zZXRCb3VuZHMgKDEwLCAxMCwgMiwgMzIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTE3ODBmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgdGFiIHRyYXZlcnNhbCBvcmRlciBvZiBjaGlsZHJlbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCQotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjEuc2V0VGV4dCAoIkIxIik7Ci0JQnV0dG9uIFtdIHJhZGlvcyA9IG5ldyBCdXR0b24gWzNdOwotCWZvciAoaW50IGk9MDsgaTxyYWRpb3MubGVuZ3RoOyBpKyspIHsKLQkJcmFkaW9zIFtpXSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCQlyYWRpb3MgW2ldLnNldFRleHQgKCJSIiArIChpID09MSA/ICImIiA6ICIiKSArIGkpOwotCX0KLQlCdXR0b24gYjIgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIyLnNldFRleHQgKCJCMiIpOwotCUxpc3QgbDEgPSBuZXcgTGlzdCAoYzEsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwxIn0pOwotCUJ1dHRvbiBiMyA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjMuc2V0VGV4dCAoIkImMyIpOwotCUJ1dHRvbiBiM18xID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5QVVNIKTsKLQliM18xLnNldFRleHQgKCJCM18xIik7Ci0JCi0JQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMyLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGI0ID0gbmV3IEJ1dHRvbiAoYzIsIFNXVC5QVVNIKTsKLQliNC5zZXRUZXh0ICgiQiY0Iik7Ci0JQnV0dG9uIGI1ID0gbmV3IEJ1dHRvbiAoYzIsIFNXVC5QVVNIKTsKLQliNS5zZXRUZXh0ICgiQiY1Iik7Ci0JCi0JTGlzdCBsMiA9IG5ldyBMaXN0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCWwyLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiTDIifSk7Ci0JCi0JVG9vbEJhciB0YjEgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JVG9vbEl0ZW0gaTEgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlJBRElPKTsKLQlpMS5zZXRUZXh0ICgiSTEiKTsKLQlUb29sSXRlbSBpMiA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUkFESU8pOwotCWkyLnNldFRleHQgKCJJJjIiKTsKLQlDb21ibyBjb21ibzEgPSBuZXcgQ29tYm8gKHRiMSwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCWNvbWJvMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkMxIn0pOwotCWNvbWJvMS5zZXRUZXh0ICgiQzEiKTsKLQljb21ibzEucGFjayAoKTsKLQlUb29sSXRlbSBpMyA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuU0VQQVJBVE9SKTsKLQlpMy5zZXRXaWR0aCAoY29tYm8xLmdldFNpemUgKCkueCk7Ci0JaTMuc2V0Q29udHJvbCAoY29tYm8xKTsKLQlpMy5zZXRUZXh0ICgiSTMiKTsKLQlUb29sSXRlbSBpNCA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUFVTSCk7Ci0JaTQuc2V0VGV4dCAoIkk0Iik7Ci0JVG9vbEl0ZW0gaTUgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULkNIRUNLKTsKLQlpNS5zZXRUZXh0ICgiSTUiKTsKLQkKLQlCdXR0b24gYjYgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWI2LnNldFRleHQgKCJCJjYiKTsKLQkKLQlDb21wb3NpdGUgYzQgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzQuc2V0U2l6ZSAoMzIsIDMyKTsKLQlDb21wb3NpdGUgYzUgPSBuZXcgQ29tcG9zaXRlIChjNCwgU1dULkJPUkRFUik7Ci0JYzUuc2V0U2l6ZSAoMjAsIDIwKTsKLQotCUNvbnRyb2wgW10gbGlzdDEgPSBuZXcgQ29udHJvbCBbXSB7YjIsIGIxLCBiM18xLCBiM307Ci0JYzEuc2V0VGFiTGlzdCAobGlzdDEpOwotCUNvbnRyb2wgW10gbGlzdDIgPSBuZXcgQ29udHJvbCBbXSB7YzEsIGI2LCB0YjEsIGM0LCBjMiwgbDJ9OwotCXNoZWxsLnNldFRhYkxpc3QgKGxpc3QyKTsKLQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTU4MGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFiRm9sZGVyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFiIGZvbGRlciAoc2l4IHBhZ2VzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDY7IGkrKykgewotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIlRhYkl0ZW0gIiArIGkpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFiRm9sZGVyLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiUGFnZSAiICsgaSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCAoYnV0dG9uKTsKLQl9Ci0JdGFiRm9sZGVyLnNldFNpemUgKDQwMCwgMjAwKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjU1MzI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcmVzaXplIGNvbHVtbnMgYXMgdGFibGUgcmVzaXplcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQotCWZpbmFsIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtIDAiICsgaSwgIml0ZW0gMSIraX0pOwotCX0KLQljb21wLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgYXJlYSA9IGNvbXAuZ2V0Q2xpZW50QXJlYSgpOwotCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMip0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0ICsgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkpIHsKLQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQl9Ci0JCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJaWYgKG9sZFNpemUueCA+IGFyZWEud2lkdGgpIHsKLQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucyAKLQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoLzMpOwotCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLSBjb2x1bW4xLmdldFdpZHRoKCkpOwotCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZSAKLQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGgvMyk7Ci0JCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAtIGNvbHVtbjEuZ2V0V2lkdGgoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkJCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFkYTkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkcmFnIHRleHQgYmV0d2VlbiB0d28gbGFiZWxzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwxLnNldFRleHQgKCJURVhUIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0Jc2V0RHJhZ0Ryb3AgKGxhYmVsMSk7Ci0Jc2V0RHJhZ0Ryb3AgKGxhYmVsMik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREcmFnRHJvcCAoZmluYWwgTGFiZWwgbGFiZWwpIHsKLQkKLQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlIChsYWJlbCwgb3BlcmF0aW9ucyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKHR5cGVzKTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZG9pdCA9IChsYWJlbC5nZXRUZXh0ICgpLmxlbmd0aCAoKSAhPSAwKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gbGFiZWwuZ2V0VGV4dCAoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpCi0JCQkJbGFiZWwuc2V0VGV4dCAoIiIpOwotCQl9Ci0JfSk7Ci0KLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsLCBvcGVyYXRpb25zKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxhYmVsLnNldFRleHQgKChTdHJpbmcpIGV2ZW50LmRhdGEpOwotCQl9Ci0JfSk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDVkMzVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIG15IG93biBkYXRhIHRyYW5zZmVyIHR5cGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzkgewotCi0vKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTwvYm9sZD4gd2hlcmUgTXlUeXBlIGlzIGRlZmluZSBhczogKi8KLXN0YXRpYyBjbGFzcyBNeVR5cGUgewotCVN0cmluZyBmaWxlTmFtZTsKLQlsb25nIGZpbGVMZW5ndGg7Ci0JbG9uZyBsYXN0TW9kaWZpZWQ7Ci19Ci0KLXN0YXRpYyBjbGFzcyBNeVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRU5BTUUgPSAibmFtZV9mb3JfbXlfdHlwZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRUlEID0gcmVnaXN0ZXJUeXBlIChNWVRZUEVOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVRyYW5zZmVyICgpOwotCi1wdWJsaWMgc3RhdGljIE15VHJhbnNmZXIgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlICh0cmFuc2ZlckRhdGEpKSB7Ci0JCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQl9Ci0JTXlUeXBlIFtdIG15VHlwZXMgPSAoTXlUeXBlIFtdKSBvYmplY3Q7Ci0JdHJ5IHsKLQkJLy8gd3JpdGUgZGF0YSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gYXNrIHN1cGVyIHRvIGNvbnZlcnQgdG8gcE1lZGl1bQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSAoKTsKLQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtIChvdXQpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbXlUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYnl0ZSBbXSBidWZmZXIgPSBteVR5cGVzIFtpXS5maWxlTmFtZS5nZXRCeXRlcyAoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50IChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlIChidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nIChteVR5cGVzIFtpXS5maWxlTGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyAobXlUeXBlcyBbaV0ubGFzdE1vZGlmaWVkKTsKLQkJfQotCQlieXRlIFtdIGJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSAoKTsKLQkJd3JpdGVPdXQuY2xvc2UgKCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZSAoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwotCX0KLQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLX0KLQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEgKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQlpZiAoaXNTdXBwb3J0ZWRUeXBlICh0cmFuc2ZlckRhdGEpKSB7Ci0JCWJ5dGUgW10gYnVmZmVyID0gKGJ5dGUgW10pIHN1cGVyLm5hdGl2ZVRvSmF2YSAodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotCQlNeVR5cGUgW10gbXlEYXRhID0gbmV3IE15VHlwZSBbMF07Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSAoYnVmZmVyKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtIChpbik7Ci0JCQl3aGlsZSAocmVhZEluLmF2YWlsYWJsZSAoKSA+IDIwKSB7Ci0JCQkJTXlUeXBlIGRhdHVtID0gbmV3IE15VHlwZSAoKTsKLQkJCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50ICgpOwotCQkJCWJ5dGUgW10gbmFtZSA9IG5ldyBieXRlIFtzaXplXTsKLQkJCQlyZWFkSW4ucmVhZCAobmFtZSk7Ci0JCQkJZGF0dW0uZmlsZU5hbWUgPSBuZXcgU3RyaW5nIChuYW1lKTsKLQkJCQlkYXR1bS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nICgpOwotCQkJCWRhdHVtLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZyAoKTsKLQkJCQlNeVR5cGUgW10gbmV3TXlEYXRhID0gbmV3IE15VHlwZSBbbXlEYXRhLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkgKG15RGF0YSwgMCwgbmV3TXlEYXRhLCAwLCBteURhdGEubGVuZ3RoKTsKLQkJCQluZXdNeURhdGEgW215RGF0YS5sZW5ndGhdID0gZGF0dW07Ci0JCQkJbXlEYXRhID0gbmV3TXlEYXRhOwotCQkJfQotCQkJcmVhZEluLmNsb3NlICgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG15RGF0YTsKLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBbXSBnZXRUeXBlTmFtZXMgKCkgewotCXJldHVybiBuZXcgU3RyaW5nIFtdIHtNWVRZUEVOQU1FfTsKLX0KLQotcHJvdGVjdGVkIGludCBbXSBnZXRUeXBlSWRzICgpIHsKLQlyZXR1cm4gbmV3IGludCBbXSB7TVlUWVBFSUR9OwotfQotCi1ib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IG51bGwgfHwgCi0JCSEob2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlW10pIHx8IAotCQkoKE15VHlwZVtdKW9iamVjdCkubGVuZ3RoID09IDApIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlNeVR5cGVbXSBteVR5cGVzID0gKE15VHlwZVtdKW9iamVjdDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG15VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG15VHlwZXNbaV0gPT0gbnVsbCB8fCAKLQkJCW15VHlwZXNbaV0uZmlsZU5hbWUgPT0gbnVsbCB8fCAKLQkJCW15VHlwZXNbaV0uZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci19Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMS5zZXRUZXh0ICgiRHJhZyBTb3VyY2UgZm9yIE15RGF0YVtdIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDIuc2V0VGV4dCAoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGFbXSIpOwotCi0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAobGFiZWwxLCBETkQuRFJPUF9DT1BZKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIgKG5ldyBUcmFuc2ZlciBbXSB7TXlUcmFuc2Zlci5nZXRJbnN0YW5jZSAoKX0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCU15VHlwZSBteVR5cGUxID0gbmV3IE15VHlwZSAoKTsKLQkJCW15VHlwZTEuZmlsZU5hbWUgPSAiQzpcXGFiYy50eHQiOwotCQkJbXlUeXBlMS5maWxlTGVuZ3RoID0gMTAwMDsKLQkJCW15VHlwZTEubGFzdE1vZGlmaWVkID0gMTIzMTIzMTM7Ci0JCQlNeVR5cGUgbXlUeXBlMiA9IG5ldyBNeVR5cGUgKCk7Ci0JCQlteVR5cGUyLmZpbGVOYW1lID0gIkM6XFx4eXoudHh0IjsKLQkJCW15VHlwZTIuZmlsZUxlbmd0aCA9IDUwMDsKLQkJCW15VHlwZTIubGFzdE1vZGlmaWVkID0gMTIzMTIzMjM7Ci0JCQlldmVudC5kYXRhID0gbmV3IE15VHlwZSBbXSB7bXlUeXBlMSwgbXlUeXBlMn07Ci0JCX0KLQl9KTsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0IChsYWJlbDIsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIgKG5ldyBUcmFuc2ZlciBbXSB7TXlUcmFuc2Zlci5nZXRJbnN0YW5jZSAoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlciAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQgKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AgKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZSBbXSBteVR5cGVzID0gKE15VHlwZSBbXSkgZXZlbnQuZGF0YTsKLQkJCQlpZiAobXlUeXBlcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlzdHJpbmcgKz0gbXlUeXBlcyBbaV0uZmlsZU5hbWUgKyAiICI7Ci0JCQkJCX0KLQkJCQkJbGFiZWwyLnNldFRleHQgKHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTEyYjc5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmVlIChsYXp5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiTGF6eSBUcmVlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlGaWxlIFtdIHJvb3RzID0gRmlsZS5saXN0Um9vdHMgKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCVRyZWVJdGVtIHJvb3QgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlyb290LnNldFRleHQgKHJvb3RzIFtpXS50b1N0cmluZyAoKSk7Ci0JCXJvb3Quc2V0RGF0YSAocm9vdHMgW2ldKTsKLQkJbmV3IFRyZWVJdGVtIChyb290LCAwKTsKLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKGZpbmFsIEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSByb290ID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJVHJlZUl0ZW0gW10gaXRlbXMgPSByb290LmdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaT0gMDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtcyBbaV0uZ2V0RGF0YSAoKSAhPSBudWxsKSByZXR1cm47Ci0JCQkJaXRlbXMgW2ldLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgcm9vdC5nZXREYXRhICgpOwotCQkJRmlsZSBbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzICgpOwotCQkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKLQkJCWZvciAoaW50IGk9IDA7IGk8ZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtIChyb290LCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKGZpbGVzIFtpXS5nZXROYW1lICgpKTsKLQkJCQlpdGVtLnNldERhdGEgKGZpbGVzIFtpXSk7Ci0JCQkJaWYgKGZpbGVzIFtpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCW5ldyBUcmVlSXRlbSAoaXRlbSwgMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JUG9pbnQgc2l6ZSA9IHRyZWUuY29tcHV0ZVNpemUgKDMwMCwgU1dULkRFRkFVTFQpOwotCWludCB3aWR0aCA9IE1hdGgubWF4ICgzMDAsIHNpemUueCk7Ci0JaW50IGhlaWdodCA9IE1hdGgubWF4ICgzMDAsIHNpemUueSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2hlbGwuY29tcHV0ZVNpemUgKHdpZHRoLCBoZWlnaHQpKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA1NTgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBsaW1pdCBzZWxlY3Rpb24gdG8gaXRlbXMgdGhhdCBtYXRjaCBhIHBhdHRlcm4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgwIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiICsgaik7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDI7IGsrKykgewotCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiICsgayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JdHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJVHJlZUl0ZW1bXSByZXZpc2VkU2VsZWN0aW9uID0gbmV3IFRyZWVJdGVtWzBdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IHNlbGVjdGlvbltpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQuaW5kZXhPZigiMSIpID4gMCkgewotCQkJCQlUcmVlSXRlbVtdIG5ld1NlbGVjdGlvbiA9IG5ldyBUcmVlSXRlbVtyZXZpc2VkU2VsZWN0aW9uLmxlbmd0aCArIDFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJldmlzZWRTZWxlY3Rpb24sIDAsIG5ld1NlbGVjdGlvbiwgMCwgcmV2aXNlZFNlbGVjdGlvbi5sZW5ndGgpOwotCQkJCQluZXdTZWxlY3Rpb25bcmV2aXNlZFNlbGVjdGlvbi5sZW5ndGhdID0gc2VsZWN0aW9uW2ldOwotCQkJCQlyZXZpc2VkU2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQkJCX0KLQkJCX0KLQkJCXRyZWUuc2V0U2VsZWN0aW9uKHJldmlzZWRTZWxlY3Rpb24pOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODc1NTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBPTEUgYW5kIEFjdGl2ZVggZXhhbXBsZSBzbmlwcGV0OiBicm93c2UgdGhlIHR5cGVsaWJpbmZvIGZvciBhIHByb2dyYW0gaWQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgxIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkKLQlpZiAoYXJncy5sZW5ndGggPT0gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIE1haW4gPHByb2dyYW0gaWQ+Iik7Ci0JCXJldHVybjsKLQl9Ci0KLQlTdHJpbmcgcHJvZ0lEID0gYXJnc1swXTsKLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCi0JT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQlPbGVDb250cm9sU2l0ZSBzaXRlID0gbnVsbDsKLQlPbGVBdXRvbWF0aW9uIGF1dG8gPSBudWxsOwotCXRyeSB7Ci0JCXNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCBwcm9nSUQpOwkKLQkJYXV0byA9IG5ldyBPbGVBdXRvbWF0aW9uKHNpdGUpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIHR5cGUgbGlicmFyeSBmb3IgIitwcm9nSUQpOwotCQlyZXR1cm47Ci0JfQotCQkKLQlUWVBFQVRUUiB0eXBlYXR0ciA9IGF1dG8uZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCk7Ci0JaWYgKHR5cGVhdHRyICE9IG51bGwpIHsJCQotCQlpZiAodHlwZWF0dHIuY0Z1bmNzID4gMCkgU3lzdGVtLm91dC5wcmludGxuKCJGdW5jdGlvbnMgZm9yICIrcHJvZ0lEKyIgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY0Z1bmNzOyBpKyspIHsJCQkKLQkJCU9sZUZ1bmN0aW9uRGVzY3JpcHRpb24gZGF0YSA9IGF1dG8uZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbihpKTsKLQkJCVN0cmluZyBhcmdMaXN0ID0gIiI7Ci0JCQlpbnQgZmlyc3RPcHRpb25hbEFyZ0luZGV4ID0gZGF0YS5hcmdzLmxlbmd0aCAtIGRhdGEub3B0aW9uYWxBcmdDb3VudDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5hcmdzLmxlbmd0aDsgaisrKSB7Ci0JCQkJYXJnTGlzdCArPSAiWyI7Ci0JCQkJaWYgKGogPj0gZmlyc3RPcHRpb25hbEFyZ0luZGV4KSBhcmdMaXN0ICs9ICJvcHRpb25hbCwgIjsKLQkJCQlhcmdMaXN0ICs9IGdldERpcmVjdGlvbihkYXRhLmFyZ3Nbal0uZmxhZ3MpKyJdICIrZ2V0VHlwZU5hbWUoZGF0YS5hcmdzW2pdLnR5cGUpKyIgIitkYXRhLmFyZ3Nbal0ubmFtZTsKLQkJCQlpZiAoIGogPCBkYXRhLmFyZ3MubGVuZ3RoIC0gMSkgYXJnTGlzdCArPSAiLCAiOwotCQkJfQkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldEludm9rZUtpbmQoZGF0YS5pbnZva2VLaW5kKSsiIChpZCA9ICIrZGF0YS5pZCsiKSA6ICIKLQkJCQkJICAgICAgICArIlxuXHRTaWduYXR1cmUgICA6ICIrZ2V0VHlwZU5hbWUoZGF0YS5yZXR1cm5UeXBlKSsiICIrZGF0YS5uYW1lKyIoIithcmdMaXN0KyIpIgotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHREZXNjcmlwdGlvbiA6ICIrZGF0YS5kb2N1bWVudGF0aW9uCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdEhlbHAgRmlsZSAgIDogIitkYXRhLmhlbHBGaWxlKyJcbiIpOwotCQl9Ci0JCQotCQlpZiAodHlwZWF0dHIuY1ZhcnMgPiAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5WYXJpYWJsZXMgZm9yICIrcHJvZ0lEKyIgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY1ZhcnM7IGkrKykgewotCQkJT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKGkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQUk9QRVJUWSAoaWQgPSAiK2RhdGEuaWQrIikgOiIKLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0TmFtZSA6ICIrZGF0YS5uYW1lCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdFR5cGUgOiAiK2dldFR5cGVOYW1lKGRhdGEudHlwZSkrIlxuIik7Ci0JCX0KLQl9Ci0JCi0JYXV0by5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotCi19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoaW50IHR5cGUpIHsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiI7Ci0JCWNhc2UgT0xFLlZUX1I0IDogcmV0dXJuICJmbG9hdCI7Ci0JCWNhc2UgT0xFLlZUX1I4IDogcmV0dXJuICJkb3VibGUiOwotCQljYXNlIE9MRS5WVF9JNCA6IHJldHVybiAiaW50IjsKLQkJY2FzZSBPTEUuVlRfRElTUEFUQ0ggOiByZXR1cm4gIklEaXNwYXRjaCI7Ci0JCWNhc2UgT0xFLlZUX1VOS05PV04gOiByZXR1cm4gIklVbmtub3duIjsKLQkJY2FzZSBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0IjsKLQkJY2FzZSBPTEUuVlRfQlNUUiA6IHJldHVybiAiU3RyaW5nIjsKLQkJY2FzZSBPTEUuVlRfVkFSSUFOVCA6IHJldHVybiAiVmFyaWFudCI7Ci0JCWNhc2UgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSI7Ci0JCWNhc2UgT0xFLlZUX0RBVEUgOiByZXR1cm4gIkRhdGUiOwotCQljYXNlIE9MRS5WVF9VSTEgOiByZXR1cm4gInVuc2lnbmVkIGNoYXIiOwotCQljYXNlIE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCI7Ci0JCWNhc2UgT0xFLlZUX1VTRVJERUZJTkVEIDogcmV0dXJuICJVc2VyRGVmaW5lZCI7Ci0JCWNhc2UgT0xFLlZUX0hSRVNVTFQgOiByZXR1cm4gImludCI7Ci0JCWNhc2UgT0xFLlZUX1ZPSUQgOiByZXR1cm4gInZvaWQiOwotCQkKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfUjQgOiByZXR1cm4gImZsb2F0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9SOCA6IHJldHVybiAiZG91YmxlICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9JNCA6IHJldHVybiAiaW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9ESVNQQVRDSCA6IHJldHVybiAiSURpc3BhdGNoICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VTktOT1dOIDogcmV0dXJuICJJVW5rbm93biAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9CU1RSIDogcmV0dXJuICJTdHJpbmcgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQgOiByZXR1cm4gIlZhcmlhbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfREFURSA6IHJldHVybiAiRGF0ZSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVUkxIDogcmV0dXJuICJ1bnNpZ25lZCBjaGFyICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVVNFUkRFRklORUQgOiByZXR1cm4gIlVzZXJEZWZpbmVkICoiOwotCX0KLQlyZXR1cm4gInVua25vd24gIisgdHlwZTsJCi19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pewotCVN0cmluZyBkaXJTdHJpbmcgPSAiIjsKLQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GSU4pICE9IDApIHsKLQkJZGlyU3RyaW5nICs9ICJpbiI7Ci0JCWNvbW1hID0gdHJ1ZTsKLQl9Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GT1VUKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsKLQkJZGlyU3RyaW5nICs9ICJvdXQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRkxDSUQpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOwotCQlkaXJTdHJpbmcgKz0gImxjaWQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRlJFVFZBTCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7IAotCQlkaXJTdHJpbmcgKz0gInJldHZhbCI7Ci0JfQotCQotCXJldHVybiBkaXJTdHJpbmc7Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW52b2tlS2luZChpbnQgaW52S2luZCkgewotCXN3aXRjaCAoaW52S2luZCkgewotCQljYXNlIE9MRS5JTlZPS0VfRlVOQyA6IHJldHVybiAiTUVUSE9EIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZR0VUIDogcmV0dXJuICJQUk9QRVJUWSBHRVQiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlQVVQgOiByZXR1cm4gIlBST1BFUlRZIFBVVCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWVBVVFJFRiA6IHJldHVybiAiUFJPUEVSVFkgUFVUIEJZIFJFRiI7Ci0JfQotCXJldHVybiAidW5rbm93biAiK2ludktpbmQ7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ3MjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDVGFiRm9sZGVyIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhbiBpdGVtIGZyb20gY2xvc2luZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JCXRleHQuc2V0VGV4dCgiQ29udGVudCBmb3IgSXRlbSAiK2kpOwotCQlpdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JfQotCQotCWZpbmFsIENUYWJJdGVtIHNwZWNpYWxJdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkNMT1NFKTsKLQlzcGVjaWFsSXRlbS5zZXRUZXh0KCJEb24ndCBDbG9zZSBNZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIlRoaXMgdGFiIGNhbiBuZXZlciBiZSBjbG9zZWQiKTsKLQlzcGVjaWFsSXRlbS5zZXRDb250cm9sKHRleHQpOwotCQkKLQlmb2xkZXIuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lcihuZXcgQ1RhYkZvbGRlcjJBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pdGVtLmVxdWFscyhzcGVjaWFsSXRlbSkpIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlmaW5hbCBDVGFiSXRlbSBub0Nsb3NlSXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQlub0Nsb3NlSXRlbS5zZXRUZXh0KCJObyBDbG9zZSBCdXR0b24iKTsKLQlUZXh0IHRleHQyID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCXRleHQyLnNldFRleHQoIlRoaXMgdGFiIGRvZXMgbm90IGhhdmUgYSBjbG9zZSBidXR0b24iKTsKLQlub0Nsb3NlSXRlbS5zZXRDb250cm9sKHRleHQyKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTEzNDkyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRldGVybWluZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAod2luMzIgb25seSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MyBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgU25pcHBldDgzIF9pbnN0YW5jZSA9IG5ldyBTbmlwcGV0ODMoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0ODMuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlTdHJpbmcgb3BzID0gIiI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSBvcHMgKz0gIkNvcHk7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIG9wcyArPSAiTW92ZTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgb3BzICs9ICJMaW5rOyI7Ci0JCQljb250cm9sLnJlbW92ZUFsbCgpOwotCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCWl0ZW0xLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9ucyBhcmUgIitvcHMpOwotCQkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHJhbnNmZXJEYXRhW10gZGF0YSA9IGV2ZW50LmRhdGFUeXBlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWludCBpZCA9IGRhdGFbaV0udHlwZTsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVGcm9tSWQoaWQpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQkJaXRlbTIuc2V0VGV4dCgiRGF0YSB0eXBlIGlzICIraWQrIiAiK25hbWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU25pcHBldDgzIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotU25pcHBldDgzKCkgewotCWlkcyA9IG5ldyBpbnRbODAwMDBdOwotCW5hbWVzID0gbmV3IFN0cmluZ1s4MDAwMF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJaWRzW2ldID0gaTsKLQkJbmFtZXNbaV0gPSBnZXROYW1lRnJvbUlkKGkpOwotCX0KLX0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotfQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSl7Ci0JcmV0dXJuICJIZWxsbyBXb3JsZCI7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCl7Ci0JcmV0dXJuIG5hbWVzOwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gaWRzOwotfQotc3RhdGljIFN0cmluZyBnZXROYW1lRnJvbUlkKGludCBpZCkgewotCVN0cmluZyBuYW1lID0gbnVsbDsKLQlpbnQgbWF4U2l6ZSA9IDEyODsKLQlUQ0hBUiBidWZmZXIgPSBuZXcgVENIQVIoMCwgbWF4U2l6ZSk7Ci0JaW50IHNpemUgPSBDT00uR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZShpZCwgYnVmZmVyLCBtYXhTaXplKTsKLQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JaWYgKHNpemUgIT0gMCkgewotCQluYW1lID0gYnVmZmVyLnRvU3RyaW5nKDAsIHNpemUpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgQ09NLkNGX0hEUk9QOgotCQkJCW5hbWUgPSAiQ0ZfSERST1AiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVEVYVDoKLQkJCQluYW1lID0gIkNGX1RFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfQklUTUFQOgotCQkJCW5hbWUgPSAiQ0ZfQklUTUFQIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX01FVEFGSUxFUElDVDoKLQkJCQluYW1lID0gIkNGX01FVEFGSUxFUElDVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9TWUxLOgotCQkJCW5hbWUgPSAiQ0ZfU1lMSyI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9ESUY6Ci0JCQkJbmFtZSA9ICJDRl9ESUYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVElGRjoKLQkJCQluYW1lID0gIkNGX1RJRkYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfT0VNVEVYVDoKLQkJCQluYW1lID0gIkNGX09FTVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRElCOgotCQkJCW5hbWUgPSAiQ0ZfRElCIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BBTEVUVEU6Ci0JCQkJbmFtZSA9ICJDRl9QQUxFVFRFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BFTkRBVEE6Ci0JCQkJbmFtZSA9ICJDRl9QRU5EQVRBIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1JJRkY6Ci0JCQkJbmFtZSA9ICJDRl9SSUZGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1dBVkU6Ci0JCQkJbmFtZSA9ICJDRl9XQVZFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1VOSUNPREVURVhUOgotCQkJCW5hbWUgPSAiQ0ZfVU5JQ09ERVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRU5ITUVUQUZJTEU6Ci0JCQkJbmFtZSA9ICJDRl9FTkhNRVRBRklMRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9MT0NBTEU6Ci0JCQkJbmFtZSA9ICJDRl9MT0NBTEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTUFYOgotCQkJCW5hbWUgPSAiQ0ZfTUFYIjsKLQkJCQlicmVhazsKLQkJfQotCQkKLQl9Ci0JcmV0dXJuIG5hbWU7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZmMTEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGEgZGVmYXVsdCBvcGVyYXRpb24gKGluIHRoaXMgZXhhbXBsZSwgQ29weSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gIlRleHQgVHJhbnNmZXJyZWQiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kb2l0KSB7Ci0JCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIERORC5EUk9QX01PVkU6Ci0JCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfQ09QWToKLQkJCQkJb3BlcmF0aW9uID0gImNvcGllZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQkJb3BlcmF0aW9uID0gImxpbmtlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTk9ORToKLQkJCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlvcGVyYXRpb24gPSAidW5rbm93biI7IGJyZWFrOwotCQkJCX0KLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZGF0YSAiK29wZXJhdGlvbisiKSIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZHJhZyBjYW5jZWxsZWQpIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIkRyb3AgVGFyZ2V0Iik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0LCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJY2FzZSBETkQuRFJPUF9NT1ZFOgotCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9DT1BZOgotCQkJCW9wZXJhdGlvbiA9ICJjb3BpZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQlvcGVyYXRpb24gPSAibGlua2VkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX05PTkU6Ci0JCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJb3BlcmF0aW9uID0gInVua25vd24iOyBicmVhazsKLQkJCX0KLQkJCXRleHQuYXBwZW5kKCJcbiIrb3BlcmF0aW9uKyhTdHJpbmcpZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2QwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBTaGVsbCB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlCi0JICogaS5lLiBmdWxsIHNjcmVlbiwgbm8gZGVjb3JhdGlvbiBvbiBQb2NrZXRQQy4KLQkgKi8KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCS8qIAotCSAqIFNldCBhIHRleHQgc28gdGhhdCB0aGUgdG9wIGxldmVsIFNoZWxsCi0JICogYWxzbyBhcHBlYXJzIGluIHRoZSBQb2NrZXRQQyB0YXNrIGxpc3QKLQkgKi8KLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0KLQkvKgotCSAqIFNldCBhIG1lbnViYXIgdG8gZm9sbG93IFVJIGd1aWRlbGluZXMKLQkgKiBvbiBQb2NrZXRQQwotCSAqLwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTkyNDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiAnT2snIGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULkNMT1NFKTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDA2ODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFBvY2tldFBDIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcmVzaXplIGF1dG9tYXRpY2FsbHkgYXMgU0lQIGlzIG9uIG9yIG9mZgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5SRVNJWkUpOwotCXNoZWxsLnNldFRleHQoIk1haW4iKTsKLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCS8qIEFkZCBhIGJ1dHRvbiB0byBtYWtlIHRoZSByZXNpemUgbW9yZSB2aXN1YWwgKi8KLQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiTWFpbiIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNjBkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0YWJsZSBpdGVtIChpbiBwbGFjZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIgKyBpLCAiZWRpdCB0aGlzIHZhbHVlIn0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQkKLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IodGFibGUpOwotCS8vVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotCS8vbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JLy8gZWRpdGluZyB0aGUgc2Vjb25kIGNvbHVtbgotCWZpbmFsIGludCBFRElUQUJMRUNPTFVNTiA9IDE7Ci0JCi0JdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJQ29udHJvbCBvbGRFZGl0b3IgPSBlZGl0b3IuZ2V0RWRpdG9yKCk7Ci0JCQlpZiAob2xkRWRpdG9yICE9IG51bGwpIG9sZEVkaXRvci5kaXNwb3NlKCk7Ci0JCi0JCQkvLyBJZGVudGlmeSB0aGUgc2VsZWN0ZWQgcm93Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZS5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQotCQkJLy8gVGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHRoZSBlZGl0b3IgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBUYWJsZQotCQkJVGV4dCBuZXdFZGl0b3IgPSBuZXcgVGV4dCh0YWJsZSwgU1dULk5PTkUpOwotCQkJbmV3RWRpdG9yLnNldFRleHQoaXRlbS5nZXRUZXh0KEVESVRBQkxFQ09MVU1OKSk7Ci0JCQluZXdFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgbWUpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZWRpdG9yLmdldEVkaXRvcigpOwotCQkJCQllZGl0b3IuZ2V0SXRlbSgpLnNldFRleHQoRURJVEFCTEVDT0xVTU4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW5ld0VkaXRvci5zZWxlY3RBbGwoKTsKLQkJCW5ld0VkaXRvci5zZXRGb2N1cygpOwotCQkJZWRpdG9yLnNldEVkaXRvcihuZXdFZGl0b3IsIGl0ZW0sIEVESVRBQkxFQ09MVU1OKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjcyNWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbWVudSB3aXRoIHJhZGlvIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCQlpZiAoaXRlbS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtICsgIiBzZWxlY3RlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbSArICIgdW5zZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YWU3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNoaWxkIGNvbnRyb2wgYXV0b21hdGljYWxseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWNvbXBvc2l0ZS5zZXRTaXplICgyMDAsIDQwMCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIgPSBzaGVsbC5nZXRIb3Jpem9udGFsQmFyICgpOwotCWhCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWxvY2F0aW9uLnggPSAtaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyID0gc2hlbGwuZ2V0VmVydGljYWxCYXIgKCk7Ci0JdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJbG9jYXRpb24ueSA9IC12QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsICBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgc2l6ZSA9IGNvbXBvc2l0ZS5nZXRTaXplICgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJaEJhci5zZXRNYXhpbXVtIChzaXplLngpOwotCQkJdkJhci5zZXRNYXhpbXVtIChzaXplLnkpOwotCQkJaEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHNpemUueCwgcmVjdC53aWR0aCkpOwotCQkJdkJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHNpemUueSwgcmVjdC5oZWlnaHQpKTsKLQkJCWludCBoUGFnZSA9IHNpemUueCAtIHJlY3Qud2lkdGg7Ci0JCQlpbnQgdlBhZ2UgPSBzaXplLnkgLSByZWN0LmhlaWdodDsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlpZiAoaFNlbGVjdGlvbiA+PSBoUGFnZSkgewotCQkJCWlmIChoUGFnZSA8PSAwKSBoU2VsZWN0aW9uID0gMDsKLQkJCQlsb2NhdGlvbi54ID0gLWhTZWxlY3Rpb247Ci0JCQl9Ci0JCQlpZiAodlNlbGVjdGlvbiA+PSB2UGFnZSkgewotCQkJCWlmICh2UGFnZSA8PSAwKSB2U2VsZWN0aW9uID0gMDsKLQkJCQlsb2NhdGlvbi55ID0gLXZTZWxlY3Rpb247Ci0JCQl9Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYxM2NkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgbW91c2UgZG93biBpbiBhIHRyZWUgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJdHJlZUl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0gKHBvaW50KTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJNb3VzZSBkb3duOiAiICsgaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY5NTM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgbGVhZiBpdGVtcyBpbiBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraisiICIrayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCi0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAodHJlZSwgb3BlcmF0aW9ucyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKHR5cGVzKTsKLQlmaW5hbCBUcmVlSXRlbVtdIGRyYWdTb3VyY2VJdGVtID0gbmV3IFRyZWVJdGVtWzFdOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uWzBdLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCQlkcmFnU291cmNlSXRlbVswXSA9IHNlbGVjdGlvblswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9OwotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gZHJhZ1NvdXJjZUl0ZW1bMF0uZ2V0VGV4dCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkKLQkJCQlkcmFnU291cmNlSXRlbVswXS5kaXNwb3NlKCk7Ci0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0gPSBudWxsOwotCQl9Ci0JfSk7Ci0KLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRyZWUsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQlpZiAoZXZlbnQuaXRlbSAhPSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJaWYgKGV2ZW50Lml0ZW0gPT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW1zW2ldID09IGl0ZW0pIHsKLQkJCQkJCQlpbmRleCA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSwgaW5kZXgrMSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gaXRlbSkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIGluZGV4KzEpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJCi0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJmNTMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGN1cnNvciBmcm9tIGEgc291cmNlIGFuZCBhIG1hc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCi0JLy9DcmVhdGUgYSBzb3VyY2UgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7d2hpdGUuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBzb3VyY2VEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpICsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjA7IGorKykgewotCQkJc291cmNlRGF0YS5zZXRQaXhlbChpLCBqLCAxKTsKLQkJfQotCX0KLQkKLQkvL0NyZWF0ZSBhIG1hc2sgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7d2hpdGUuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IG5ldyBJbWFnZURhdGEgKDIwLCAyMCwgMSwgcGFsZXR0ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSArKykgewotCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCW1hc2tEYXRhLnNldFBpeGVsKGksIGosIDEpOwotCQl9Ci0JfQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIG1hc2tEYXRhLCAxMCwgMTApOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEltYWdlIHNvdXJjZSA9IG5ldyBJbWFnZSAoZGlzcGxheSxzb3VyY2VEYXRhKTsKLQlmaW5hbCBJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0JLy9EcmF3IHNvdXJjZSBhbmQgbWFzayBqdXN0IHRvIHNob3cgd2hhdCB0aGV5IGxvb2sgbGlrZQotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLmRyYXdTdHJpbmcoInNvdXJjZTogIiwgMTAsIDEwKTsKLQkJCWdjLmRyYXdJbWFnZShzb3VyY2UsIDAsIDAsIDIwLCAyMCwgNTAsIDEwLCAyMCwgMjApOwotCQkJZ2MuZHJhd1N0cmluZygibWFzazogIiwxMCwgNDApOwotCQkJZ2MuZHJhd0ltYWdlKG1hc2ssIDAsIDAsIDIwLCAyMCwgNTAsIDQwLCAyMCwgMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgxNTAsIDE1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXNoZWxsLnNldEN1cnNvcihjdXJzb3IpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlzb3VyY2UuZGlzcG9zZSgpOwotCW1hc2suZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NzI5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IG1lYXN1cmUgYSBzdHJpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlHQyBnYyA9IG5ldyBHQyAobGFiZWwpOwotCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50ICgiSGVsbG8iKTsKLQlnYy5kaXNwb3NlICgpOwotCWxhYmVsLnNldFRleHQgKCJIZWxsbyAtPiAiICsgc2l6ZSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWViMGM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENsaXBib2FyZCBleGFtcGxlIHNuaXBwZXQ6IGNvcHkgYW5kIHBhc3RlIGRhdGEgd2l0aCB0aGUgY2xpcGJvYXJkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ2xpcGJvYXJkIGNiID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkKLQlCdXR0b24gY29weSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQljb3B5LnNldFRleHQoIkNvcHkiKTsKLQljb3B5LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHRleHREYXRhID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQljYi5zZXRDb250ZW50cyhuZXcgT2JqZWN0W117dGV4dERhdGF9LCBuZXcgVHJhbnNmZXJbXXt0ZXh0VHJhbnNmZXJ9KTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBwYXN0ZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlwYXN0ZS5zZXRUZXh0KCJQYXN0ZSIpOwotCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2IuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCXRleHQuaW5zZXJ0KGRhdGEpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JY29weS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvcHksIDUpOwotCXBhc3RlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvcHksIC01KTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljYi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U3NTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGNhcHR1cmUgYSB3aWRnZXQgaW1hZ2Ugd2l0aCBhIEdDCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCQotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0iICsgaSk7Ci0JfQotCQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNhcHR1cmUiKTsKLQlidXR0b24uc2V0Qm91bmRzKDEwLCAxNDAsIDUwLCAyMCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHRhYmxlU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCUdDIGdjID0gbmV3IEdDKHRhYmxlKTsKLQkJCWZpbmFsIEltYWdlIGltYWdlID0KLQkJCQluZXcgSW1hZ2UoZGlzcGxheSwgdGFibGVTaXplLngsIHRhYmxlU2l6ZS55KTsKLQkJCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQotCQkJU2hlbGwgcG9wdXAgPSBuZXcgU2hlbGwoc2hlbGwpOwotCQkJcG9wdXAuc2V0VGV4dCgiSW1hZ2UiKTsKLQkJCXBvcHVwLnNldEJvdW5kcyg1MCwgNTAsIDIwMCwgMjAwKTsKLQkJCXBvcHVwLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhwb3B1cCwgU1dULk5PTkUpOwotCQkJY2FudmFzLnNldEJvdW5kcygxMCwgMTAsIDE1MCwgMTUwKTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCX0KLQkJCX0pOwotCQkJcG9wdXAub3BlbigpOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTVkZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogbmF2aWdhdGUgYSB0YWJsZSBjZWxscyB3aXRoIGFycm93IGtleXMuIAotICogRWRpdCB3aGVuIHVzZXIgaGl0cyBSZXR1cm4ga2V5LiAgRXhpdCBlZGl0IG1vZGUgYnkgaGl0dGluZyBFc2NhcGUgKGNhbmNlbHMgZWRpdCkKLSAqIG9yIFJldHVybiAoYXBwbGllcyBlZGl0IHRvIHRhYmxlKS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCS8vIGNyZWF0ZSBhIGEgdGFibGUgd2l0aCAzIGNvbHVtbnMgYW5kIGZpbGwgd2l0aCBkYXRhCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJjZWxsICIgKyBpICsgIiAwIiwgCSJjZWxsICIgKyBpICsgIiAxIiwgImNlbGwgIiArIGkgKyAiIDIiIH0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQljb2x1bW4zLnBhY2soKTsKLQotCS8vIGNyZWF0ZSBhIFRhYmxlQ3Vyc29yIHRvIG5hdmlnYXRlIGFyb3VuZCB0aGUgdGFibGUKLQlmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkvLyBjcmVhdGUgYW4gZWRpdG9yIHRvIGVkaXQgdGhlIGNlbGwgd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgCi0JLy8gd2hpbGUgb3ZlciBhIGNlbGwgaW4gdGhlIHRhYmxlCi0JZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0KLQljdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93IGluIAotCQkvLyB0aGUgdGFibGUKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7IGN1cnNvci5nZXRSb3coKX0pOwotCQl9Ci0JCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIGluIHRoZSBUYWJsZUN1cnNvciwgcG9wIHVwIGEgdGV4dCBlZGl0b3Igc28gdGhhdCAKLQkJLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkJdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIgCi0JCQkJCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQkJCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJCQkJcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJCXRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCS8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCS8vIFRoaXMgYWxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IG11bHRpcGxlIGl0ZW1zIGluIHRoZSB0YWJsZS4KLQljdXJzb3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQ1RSTAotCQkJCXx8IGUua2V5Q29kZSA9PSBTV1QuU0hJRlQKLQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMAotCQkJCXx8IChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkJCWN1cnNvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0pOwotCS8vIFNob3cgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlICJTSElGVCIgb3IgIkNUUkwiIGtleS4KLQkvLyBUaGlzIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIHRhc2suCi0JdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkNPTlRST0wgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgIT0gU1dULkNPTlRST0wKLQkJCQkmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlICE9IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCQkJcmV0dXJuOwotCi0JCQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCVRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/IHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0JCQl0YWJsZS5zaG93SXRlbShyb3cpOwotCQkJY3Vyc29yLnNldFNlbGVjdGlvbihyb3csIDApOwotCQkJY3Vyc29yLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljdXJzb3Iuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAxNzRjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogZmlsbCBhIG1lbnUgZHluYW1pY2FsbHkgKHdoZW4gbWVudSBzaG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdHJlZS5zZXRNZW51IChtZW51KTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQltZW51LmFkZExpc3RlbmVyIChTV1QuU2hvdywgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51SXRlbSBbXSBtZW51SXRlbXMgPSBtZW51LmdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPG1lbnVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCW1lbnVJdGVtcyBbaV0uZGlzcG9zZSAoKTsKLQkJCX0KLQkJCVRyZWVJdGVtIFtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW1zIFtpXS5nZXRUZXh0ICgpKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3OTE4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBkaXNwb3NlIGNoaWxkcmVuIG9mIGEgY29tcG9zaXRlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk4IHsKLQotc3RhdGljIGludCBwYWdlTnVtID0gMDsKLXN0YXRpYyBDb21wb3NpdGUgcGFnZUNvbXBvc2l0ZTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIlB1c2giKTsKLQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKChwYWdlQ29tcG9zaXRlICE9IG51bGwpICYmICghcGFnZUNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJcGFnZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlwYWdlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJaWYgKHBhZ2VOdW0rKyAlIDIgPT0gMCkgewotCQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhZ2VDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJ0YWJsZSBpdGVtICIgKyBpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ldyBCdXR0b24ocGFnZUNvbXBvc2l0ZSwgU1dULlJBRElPKS5zZXRUZXh0KCJyYWRpbyIpOwotCQkJfQotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTNhY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhIHNoZWxsIGZyb20gY2xvc2luZyAocHJvbXB0IHRoZSB1c2VyKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaW50IHN0eWxlID0gU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULllFUyB8IFNXVC5OTzsKLQkJCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgc3R5bGUpOwotCQkJbWVzc2FnZUJveC5zZXRUZXh0ICgiSW5mb3JtYXRpb24iKTsKLQkJCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSAoIkNsb3NlIHRoZSBzaGVsbD8iKTsKLQkJCWV2ZW50LmRvaXQgPSBtZXNzYWdlQm94Lm9wZW4gKCkgPT0gU1dULllFUzsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU1ZGI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJKVW5pdCBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRhdGEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4OGNmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEJyb3dzZXJUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxCcm93c2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1MDI3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEJyb3dzZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3RpbmcgYWxsIG9mIHRoZSBncmFwaGljcyB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsQnJvd3NlclRlc3RzIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLnN1aXRlKCkpOwkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUuc3VpdGUoKSk7Ci0KLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENhcmJvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENhcmJvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzBkMGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDYXJib25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgYWxsIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsQ2FyYm9uVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0vKioKLSAqIFRlc3RzIG5vdCBydW4gYmVjYXVzZSB0aGV5IGNvbnNpc3RlbnRseSBmYWlsCi0gKi8KLXN0YXRpYyBTdHJpbmdbXSBleGNsdWRlVGVzdHMgPSB7Ci0JInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KSIsCi0JInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldFRvcFBpeGVsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRUb3BJbmRleChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfY2xlYXJTZWxlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9zZXRTZWxlY3Rpb25JKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcikiLAotCSJCcm93c2VyNChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3Nlci5UZXN0X0Jyb3dzZXJTdWl0ZSkiLAotCSJCcm93c2VyNShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3Nlci5UZXN0X0Jyb3dzZXJTdWl0ZSkiLAotCS8vCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3Rfc2VsZWN0QWxsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQpIiwKLQkidGVzdF9pbnZva2VBY3Rpb25JKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotfTsKLQotc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhleGNsdWRlVGVzdHNbaV0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FeGNsdWRlZCBUZXN0czogIiArIGV4Y2x1ZGVUZXN0cy5sZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgZnVsbFN1aXRlID0gKFRlc3RTdWl0ZSlBbGxUZXN0cy5zdWl0ZSgpOwotCVRlc3RTdWl0ZSBmaWx0ZXJlZFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJVGVzdCBjYW5kaWRhdGVUZXN0ID0gZnVsbFN1aXRlLnRlc3RBdChpKTsKLQkJaWYgKGNhbmRpZGF0ZVRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpY2FuZGlkYXRlVGVzdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VpdGUudGVzdENvdW50KCk7IGorKykgewotCQkJCVRlc3QgdGVzdCA9IHN1aXRlLnRlc3RBdChqKTsKLQkJCQlpZiAoIWlzRXhjbHVkZWQodGVzdC50b1N0cmluZygpKSkgZmlsdGVyZWRTdWl0ZS5hZGRUZXN0KHRlc3QpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZmlsdGVyZWRTdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3JhcGhpY3NUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHcmFwaGljc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODM3MmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHcmFwaGljc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyBhbGwgb2YgdGhlIGdyYXBoaWNzIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxHcmFwaGljc1Rlc3RzIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Uuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLnN1aXRlKCkpOwotCQotCQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LnN1aXRlKCkpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHdGtUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHdGtUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMwM2ZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3RrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbEd0a1Rlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotLyoqCi0gKiBUZXN0cyBub3QgcnVuIGJlY2F1c2UgdGhleSBjb25zaXN0ZW50bHkgZmFpbAotICovCi1zdGF0aWMgU3RyaW5nW10gZXhjbHVkZVRlc3RzID0gewotCSJ0ZXN0X2dldEFjdGl2ZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UpIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHMob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0pIiwKLQkidGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KSIsCi0JInRlc3Rfc2V0QWN0aXZlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKSIsCi0JInRlc3RfZ2V0SXRlbUhlaWdodChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3Rfc2V0VG9wSW5kZXhJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QpIiwKLQkidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QpIiwKLQkidGVzdF9nZXRUZXh0TGltaXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldFRvcFBpeGVsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZXRUZXh0TGltaXRJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZXRUb3BJbmRleEkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldEhlYWRlckhlaWdodChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKSIsCi0JInRlc3Rfc2V0U2VsZWN0aW9uSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIpIiwKLQkidGVzdF9nZXRTZWxlY3Rpb25JbmRleChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2dldFJvd0NvdW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIpIiwKLQkidGVzdF9nZXRIZWFkZXJIZWlnaHQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUpIiwKLX07Ci0KLXN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVUZXN0cy5sZW5ndGg7IGkrKykgewotCQlpZiAobmFtZS5lcXVhbHMoZXhjbHVkZVRlc3RzW2ldKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQlpZiAoU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuRXhjbHVkZWQgVGVzdHM6ICIgKyBleGNsdWRlVGVzdHMubGVuZ3RoKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIGZ1bGxTdWl0ZSA9IChUZXN0U3VpdGUpQWxsVGVzdHMuc3VpdGUoKTsKLQlUZXN0U3VpdGUgZmlsdGVyZWRTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxTdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0JCVRlc3QgY2FuZGlkYXRlVGVzdCA9IGZ1bGxTdWl0ZS50ZXN0QXQoaSk7Ci0JCWlmIChjYW5kaWRhdGVUZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKWNhbmRpZGF0ZVRlc3Q7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHN1aXRlLnRlc3RDb3VudCgpOyBqKyspIHsKLQkJCQlUZXN0IHRlc3QgPSBzdWl0ZS50ZXN0QXQoaik7Ci0JCQkJaWYgKCFpc0V4Y2x1ZGVkKHRlc3QudG9TdHJpbmcoKSkpIGZpbHRlcmVkU3VpdGUuYWRkVGVzdCh0ZXN0KTsJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGZpbHRlcmVkU3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2I0NTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQlpZiAoU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci19Ci0KLXB1YmxpYyBBbGxUZXN0cygpIHsKLQlzdXBlcigpOwotCS8qIFRoZSBsb2dpY2FsIG9yZGVyIHRvIHJ1biB0aGUgdGVzdHMgaW4gaXM6Ci0JICogLSBTV1QsIFNXVEVycm9yLCBTV1RFeGNlcHRpb24KLQkgKiAtIERpc3BsYXkKLQkgKiAtIGdyYXBoaWNzIGNsYXNzZXMKLQkgKiAtIGl0ZW1zIGFuZCBDYXJldCwgZXRjCi0JICogLSB3aWRnZXRzCi0JICogLSBkaWFsb2dzCi0JICogLSBsYXlvdXQKLQkgKiAtIGN1c3RvbSB3aWRnZXRzCi0JICogLSBwcmludGluZyBhbmQgcHJvZ3JhbQotCSAqIC0gZXZlbnRzCi0JICogLSBkcmFnICYgZHJvcAotCSAqIC0gYWNjZXNzaWJpbGl0eQotCSAqIC0gT0xFCi0JICogLSBicm93c2VyCi0JICovCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvci5zdWl0ZSgpKTsKLQotCS8qIE5PVEU6IElmIHRoZSBEaXNwbGF5IHRlc3Qgc3VpdGUgaXMgcnVuLCBpdCBtdXN0IGJlIHJ1bgotCSAqIGJlZm9yZSBhbnkgb3RoZXIgdGVzdHMgdGhhdCBuZWVkIGEgZGlzcGxheSAoaS5lLiBncmFwaGljcwotCSAqIG9yIHdpZGdldCB0ZXN0cywgZXRjKS4gT3RoZXJ3aXNlLCBhbiBJbnZhbGlkVGhyZWFkQWNjZXNzCi0JICogZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZvciBlYWNoIERpc3BsYXkgdGVzdC4KLQkgKi8KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Uuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uc3VpdGUoKSk7Ci0JLy9hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUuc3VpdGUoKSk7Ci0JLy9hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyLnN1aXRlKCkpOwotCQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuc3VpdGUoKSk7Ci0JCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtLnN1aXRlKCkpOwotCi0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50LnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3Qob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUuc3VpdGUoKSk7Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ4YjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsV2lkZ2V0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyBhbGwgb2YgdGhlIHdpZGdldCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsV2lkZ2V0VGVzdHMgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5zdWl0ZSgpKTsKLQkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5zdWl0ZSgpKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLnN1aXRlKCkpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2Uuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdGFja0xheW91dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NULnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuc3VpdGUoKSk7Ci0KLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Db25zaXN0ZW5jeVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZDUzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENvbnNpc3RlbmN5VXRpbGl0eSB7Ci0KLSAgICBzdGF0aWMgSGFzaE1hcCBldmVudE9yZGVyaW5nID0gbmV3IEhhc2hNYXAoKTsKLSAgICBzdGF0aWMgSGFzaE1hcCBldmVudFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBzdGF0aWMgewotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkRvdWJsZUNsaWNrIiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIsICJNb3VzZURvd24iLCAiTW91c2VEb3VibGVDbGljayIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJEcmFnRGV0ZWN0IiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkVudGVyU2VsZWN0aW9uIiwgCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpSZXR1cm4iLCAiS2V5RG93biIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiS2V5U2VsZWN0aW9uIiwgCQkJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJNZW51RGV0ZWN0IiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1lbnVEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25Nb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29tYm9Nb3VzZVNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib01vdXNlU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW9kaWZ5IiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJMaXN0TW91c2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNhc2hNb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246RHJhZyIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFiRm9sZGVyTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVNb3VzZVNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVG9vbEJhck1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlTW91c2VTZWxlY3Rpb24iLAkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVNb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkxpc3REb3VibGVDbGljayIsIAkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiIsICJNb3VzZURvd24iLCAiTW91c2VEb3VibGVDbGljayIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25FbnRlclNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpSZXR1cm4iLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib0VudGVyU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUb29sQmFyRW50ZXJTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVEcmFnRGV0ZWN0IiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJEcmFnRGV0ZWN0IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVEcmFnRGV0ZWN0IiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlTWVudURldGVjdCIsIAkJbmV3IFN0cmluZ1tdIHsiTWVudURldGVjdCIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTWVudURldGVjdCIsCW5ldyBTdHJpbmdbXSB7Ik1lbnVEZXRlY3QiLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25TcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJMaXN0U3BhY2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVG9vbEJhclNwYWNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6TW5lbW9uaWMiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVTcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVTcGFjZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJLZXlVcCJ9KTsgCi0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29tYm9LZXlTZWxlY3Rpb24iLCAJCW5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVmVyaWZ5IiwgIk1vZGlmeSIsICJTZWxlY3Rpb246IiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ0NvbWJvS2V5U2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiTW9kaWZ5IiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNUYWJGb2xkZXJLZXlTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlcktleVNlbGVjdGlvbiIsCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIktleURvd24iLCAiU2VsZWN0aW9uOkFycm93IERvd24iLCAiS2V5VXAiIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlckFycm93U2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyBEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNvb2xCYXJDaGV2cm9uRHJhZ0RldGVjdCIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIkRyYWdEZXRlY3QifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb29sQmFyQ2hldnJvbk1lbnVEZXRlY3QiLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246QXJyb3cifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb29sQmFyQ2hldnJvbk1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkFycm93IiwgfSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2NhbGVUcm91Z2hTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlclRyb3VnaFNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246UGFnZSBEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2NhbGVUaHVtYlNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2xpZGVyVGh1bWJTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkRyYWciLCAiTW91c2VVcCIgfSk7Ci0KLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsQ2xvc2UiLAkJCQluZXcgU3RyaW5nW10geyJDbG9zZSIsICJEaXNwb3NlIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxEaXNwb3NlIiwJCQluZXcgU3RyaW5nW10geyJEaXNwb3NlIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxJY29uaWZ5IiwJCQluZXcgU3RyaW5nW10geyJGb2N1c091dCIsICJJY29uaWZ5IiwgIkRlYWN0aXZhdGUiLCAiRGVpY29uaWZ5IiwgIkFjdGl2YXRlIiwgIkZvY3VzSW4iLCAiQWN0aXZhdGUifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTaGVsbE9wZW4iLAkJCQluZXcgU3RyaW5nW10geyJBY3RpdmF0ZSIsICJGb2N1c0luIiwgIlNob3cifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFiRm9sZGVyUGdkd25TZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVHJhdmVyc2U6UGFnZSBOZXh0IiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJGb2xkZXJQZ3VwU2VsZWN0aW9uIiwgbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJUcmF2ZXJzZTpQYWdlIFByZXZpb3VzIiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyUGdkd25TZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpOb25lIiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlclBndXBTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpOb25lIiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlN0eWxlZFRleHRNb2RpZnkiLAkJbmV3IFN0cmluZ1tdIHsiVmVyaWZ5IiwgIk1vZGlmeSIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGV4dE1vZGlmeSIsCQkJCW5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVmVyaWZ5IiwgIk1vZGlmeSIsICJLZXlVcCJ9KTsJCQotICAgICAgICAgICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZUtleUV4cGFuZCIsIAkJCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiS2V5RG93biIsICJFeHBhbmQiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlTW91c2VFeHBhbmQiLCAJCW5ldyBTdHJpbmdbXSB7IkV4cGFuZCIsICJNb3VzZURvd24iLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZUtleUV4cGFuZCIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIkV4cGFuZCIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTW91c2VFeHBhbmQiLCAJbmV3IFN0cmluZ1tdIHsiRXhwYW5kIiwgIk1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlVGFibGUiLCAJCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIk1vdXNlRG91YmxlQ2xpY2siLCAiS2V5RG93biIsICJLZXlVcCIsICJNZW51RGV0ZWN0IiwgIkRyYWdEZXRlY3QiLCAiVHJhdmVyc2UifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudFR5cGVzLnB1dCgiTm9uZSIsIG5ldyBJbnRlZ2VyKFNXVC5Ob25lKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJLZXlEb3duIiwgbmV3IEludGVnZXIoU1dULktleURvd24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIktleVVwIiwgbmV3IEludGVnZXIoU1dULktleVVwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZURvd24iLCBuZXcgSW50ZWdlcihTV1QuTW91c2VEb3duKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZVVwIiwgbmV3IEludGVnZXIoU1dULk1vdXNlVXApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlTW92ZSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZU1vdmUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRW50ZXIiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VFbnRlcikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VFeGl0IiwgbmV3IEludGVnZXIoU1dULk1vdXNlRXhpdCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VEb3VibGVDbGljayIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZURvdWJsZUNsaWNrKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJQYWludCIsIG5ldyBJbnRlZ2VyKFNXVC5QYWludCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW92ZSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3ZlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJSZXNpemUiLCBuZXcgSW50ZWdlcihTV1QuUmVzaXplKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEaXNwb3NlIiwgbmV3IEludGVnZXIoU1dULkRpc3Bvc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlNlbGVjdGlvbiIsIG5ldyBJbnRlZ2VyKFNXVC5TZWxlY3Rpb24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRlZmF1bHRTZWxlY3Rpb24iLCBuZXcgSW50ZWdlcihTV1QuRGVmYXVsdFNlbGVjdGlvbikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRm9jdXNJbiIsIG5ldyBJbnRlZ2VyKFNXVC5Gb2N1c0luKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJGb2N1c091dCIsIG5ldyBJbnRlZ2VyKFNXVC5Gb2N1c091dCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRXhwYW5kIiwgbmV3IEludGVnZXIoU1dULkV4cGFuZCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQ29sbGFwc2UiLCBuZXcgSW50ZWdlcihTV1QuQ29sbGFwc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkljb25pZnkiLCBuZXcgSW50ZWdlcihTV1QuSWNvbmlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGVpY29uaWZ5IiwgbmV3IEludGVnZXIoU1dULkRlaWNvbmlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQ2xvc2UiLCBuZXcgSW50ZWdlcihTV1QuQ2xvc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlNob3ciLCBuZXcgSW50ZWdlcihTV1QuU2hvdykpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGlkZSIsIG5ldyBJbnRlZ2VyKFNXVC5IaWRlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb2RpZnkiLCBuZXcgSW50ZWdlcihTV1QuTW9kaWZ5KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJWZXJpZnkiLCBuZXcgSW50ZWdlcihTV1QuVmVyaWZ5KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJBY3RpdmF0ZSIsIG5ldyBJbnRlZ2VyKFNXVC5BY3RpdmF0ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGVhY3RpdmF0ZSIsIG5ldyBJbnRlZ2VyKFNXVC5EZWFjdGl2YXRlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJIZWxwIiwgbmV3IEludGVnZXIoU1dULkhlbHApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRyYWdEZXRlY3QiLCBuZXcgSW50ZWdlcihTV1QuRHJhZ0RldGVjdCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQXJtIiwgbmV3IEludGVnZXIoU1dULkFybSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiVHJhdmVyc2UiLCBuZXcgSW50ZWdlcihTV1QuVHJhdmVyc2UpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlSG92ZXIiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VIb3ZlcikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGFyZEtleURvd24iLCBuZXcgSW50ZWdlcihTV1QuSGFyZEtleURvd24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhhcmRLZXlVcCIsIG5ldyBJbnRlZ2VyKFNXVC5IYXJkS2V5VXApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1lbnVEZXRlY3QiLCBuZXcgSW50ZWdlcihTV1QuTWVudURldGVjdCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiU2V0RGF0YSIsIG5ldyBJbnRlZ2VyKFNXVC5TZXREYXRhKSk7Ci0gICAgfQotIAotICAgIHN0YXRpYyBTdHJpbmdbXSBldmVudE5hbWVzID0gewotCQkiTm9uZSIsIAkJCSJLZXlEb3duIiwgCQkiS2V5VXAiLCAJCQkiTW91c2VEb3duIiwgCi0JCSJNb3VzZVVwIiwJCQkiTW91c2VNb3ZlIiwJIk1vdXNlRW50ZXIiLAkJIk1vdXNlRXhpdCIsCi0JCSJNb3VzZURvdWJsZUNsaWNrIiwJIlBhaW50IiwJCSJNb3ZlIiwJCQkJIlJlc2l6ZSIsCi0JCSJEaXNwb3NlIiwJCQkiU2VsZWN0aW9uIiwJIkRlZmF1bHRTZWxlY3Rpb24iLAkiRm9jdXNJbiIsCi0JCSJGb2N1c091dCIsCQkJIkV4cGFuZCIsCQkiQ29sbGFwc2UiLAkJCSJJY29uaWZ5IiwKLQkJIkRlaWNvbmlmeSIsCQkiQ2xvc2UiLAkJIlNob3ciLAkJCQkiSGlkZSIsCi0JCSJNb2RpZnkiLAkJCSJWZXJpZnkiLAkJIkFjdGl2YXRlIiwJCQkiRGVhY3RpdmF0ZSIsCi0JCSJIZWxwIiwJCQkJIkRyYWdEZXRlY3QiLAkiQXJtIiwJCQkJIlRyYXZlcnNlIiwKLQkJIk1vdXNlSG92ZXIiLAkJIkhhcmRLZXlEb3duIiwJIkhhcmRLZXlVcCIsCQkiTWVudURldGVjdCIsCi0JCSJTZXREYXRhIn07Ci0gICAgCi0gICAgc3RhdGljIGludFtdIGNvbnZlcnRFdmVudE5hbWVzKFN0cmluZ1tdIG9yaWdOYW1lcykgewotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbb3JpZ05hbWVzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ05hbWVzLCAwLCBuYW1lcywgMCwgb3JpZ05hbWVzLmxlbmd0aCk7Ci0gICAgICAgIG5hbWVzID0gcmVtb3ZlRHVwbGljYXRlcyhuYW1lcyk7Ci0gICAgICAgIGludFtdIHR5cGVzID0gbmV3IGludFtuYW1lcy5sZW5ndGhdOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHlwZXNbaV0gPSAoKEludGVnZXIpZXZlbnRUeXBlcy5nZXQobmFtZXNbaV0pKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcmVtb3ZlRHVwbGljYXRlcyhTdHJpbmdbXSBuYW1lcykgewotICAgICAgICBpbnQgZHVwcz0wOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZXNbaV0uaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgICAgbmFtZXNbaV0gPSBuYW1lc1tpXS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgZm9yKGludCBqPTA7IGo8aTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYobmFtZXNbaV0uZXF1YWxzKG5hbWVzW2pdKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGs9aSsxOyBrPG5hbWVzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc1trLTFdID0gbmFtZXNba107Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNbbmFtZXMubGVuZ3RoLTFdID0gImR1cGxpY2F0ZSIrIGR1cHM7Ci0gICAgICAgICAgICAgICAgICAgIGR1cHMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gdGVtcCA9IG5ldyBTdHJpbmdbbmFtZXMubGVuZ3RoLWR1cHNdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCB0ZW1wLCAwLCBuYW1lcy5sZW5ndGgtZHVwcyk7Ci0gICAgICAgIHJldHVybiB0ZW1wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNlbGVjdGlvblR5cGVzID0gewotICAgICAgICAiRHJhZyIsIAkJIkhvbWUiLCAgCQkJIkVuZCIsIAkJCQkiQXJyb3cgRG93biIsIAotICAgICAgICAiQXJyb3cgVXAiLCAJIlBhZ2UgRG93biIsIAkJIlBhZ2UgVXAiLCAJCQkiQ2hlY2siLCAJCi0gICAgICAgICJBcnJvdyIsICAgICAKLSAgICB9OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gW10gc2VsZWN0aW9uQ29udmVyc2lvbiA9IHsKLSAgICAgICAge1NXVC5EUkFHLCAwfSwKLSAgICAgICAge1NXVC5IT01FLCAxfSwKLSAgICAgICAge1NXVC5FTkQsIDJ9LAotICAgICAgICB7U1dULkFSUk9XX0RPV04sIDN9LAotICAgICAgICB7U1dULkFSUk9XX1VQLCA0fSwKLSAgICAgICAge1NXVC5QQUdFX0RPV04sIDV9LAotICAgICAgICB7U1dULlBBR0VfVVAsIDZ9LAotICAgICAgICB7U1dULkNIRUNLLCA3fSwKLSAgICAgICAge1NXVC5BUlJPVywgOH0sCi0gICAgfTsKLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nIGdldFNlbGVjdGlvblR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8c2VsZWN0aW9uQ29udmVyc2lvbi5sZW5ndGg7aSsrKSB7Ci0gICAgICAgICAgICBpZih0eXBlID09IHNlbGVjdGlvbkNvbnZlcnNpb25baV1bMF0pIAotICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25UeXBlc1tzZWxlY3Rpb25Db252ZXJzaW9uW2ldWzFdXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBTdHJpbmdbXSB0cmF2ZXJzYWxUeXBlcyA9IHsKLSAgICAJICAgICJOb25lIiwgCQkiRXNjYXBlIiwgCQkJIlJldHVybiIsIAkJCSJUYWIgUHJldmlvdXMiLCAKLSAgICAJICAgICJUYWIgTmV4dCIsIAkiQXJyb3cgUHJldmlvdXMiLAkiQXJyb3cgTmV4dCIsIAkJIk1uZW1vbmljIiwgCi0gICAgCSAgICAiUGFnZSBQcmV2aW91cyIsICJQYWdlIE5leHQifTsKLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0VHJhdmVyc2FsVHlwZShpbnQgdHlwZSkgewotICAgICAgICBpbnQgcG93ID0gMDsKLSAgICAgICAgaWYodHlwZSAhPSAwKQotICAgICAgICAgICAgcG93ID0oaW50KShNYXRoLmxvZyh0eXBlKS9NYXRoLmxvZygyKSk7Ci0gICAgICAgIHJldHVybiB0cmF2ZXJzYWxUeXBlc1twb3ddOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTSEVMTF9JQ09OSUZZID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEtFWV9QUkVTUyA9IDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX0tFWV9QUkVTUyA9IDIwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfQ0xJQ0sgPSAzMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0RPVUJMRUNMSUNLID0gNDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1VTRV9EUkFHID0gNTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSA2MDsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVTQ0FQRV9NRU5VID0gMTsKLSAgICAKLSAgICAKLSAgICAvL3Bvc3RzIGEgY2xpY2sgYXQgZGlzcGxheSBtYXBwZWQgeCBhbmQgeSB3aXRoIGJ1dHRvbiBidXR0b24KLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0Q2xpY2soRGlzcGxheSBkaXNwbGF5LCBpbnQgeCwgaW50IHksIGludCBidXR0b24pIHsKLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0gICAgICAgIGV2ZW50LnggPSB4OwotICAgICAgICBldmVudC55ID0geTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlTW92ZSBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlRG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlVXAgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgLy9UT0RPOiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdG8gaGF2ZSBhIG1vdXNlZG93biBhbmQgbm8gbW91c2V1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLS8vCSAgCXRyeSB7Ci0vLwkgICAgICAgIFRocmVhZC5zbGVlcCgxNjAwKTsJCi0vLwkgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkge30KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBib29sZWFuIHBvc3RDbGljayhEaXNwbGF5IGRpc3BsYXksIFBvaW50IHB0LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIHJldHVybiBwb3N0Q2xpY2soZGlzcGxheSwgcHQueCwgcHQueSwgYnV0dG9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy9kb3VibGVjbGlja3MgYXQgZGlzcGxheSBtYXBwZWQgcHQgd2l0aCBidXR0b24gYnV0dG9uCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdERvdWJsZUNsaWNrKERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQsIGludCBidXR0b24pIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQsIGJ1dHRvbik7Ci0gICAgICAgIHJldCAmPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQsIGJ1dHRvbik7Ci0vLwkgIAl0cnkgewotLy8JICAgICAgICBUaHJlYWQuc2xlZXAoMTYwMCk7CQotLy8JICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdCBhIGtleSBwcmVzcyAKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0S2V5UHJlc3MoRGlzcGxheSBkaXNwbGF5LCBpbnQgY2gsIGludCBrZXljb2RlKSB7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2g7Ci0gICAgICAgIGV2ZW50LmtleUNvZGUgPSBrZXljb2RlOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlEb3duIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleVVwOwotICAgICAgICBldmVudC5jaGFyYWN0ZXIgPSAoY2hhciljaDsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGU7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBrZXlkb3duIGFuZCBubyBrZXl1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdCBwcmVzc2luZyBhbmQgaG9sZGluZyBjaDEva2V5Y29kZTEgYW5kIHRoZW4gcHJlc3NpbmcgY2gyL2tleWNvZGUyCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdERvdWJsZUtleVByZXNzKERpc3BsYXkgZGlzcGxheSwgaW50IGNoMSwgaW50IGtleWNvZGUxLCAKLSAgICAgICAgICAgIAkJCQkJCSAgaW50IGNoMiwgaW50IGtleWNvZGUyKSB7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2gxOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTE7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHBvc3RLZXlQcmVzcyhkaXNwbGF5LCBjaDIsIGtleWNvZGUyKTsKLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2gxOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTE7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBrZXlkb3duIGFuZCBubyBrZXl1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdHMgYSBkcmFnIGZyb20gZGlzcGxheSBtYXBwZWQgb3JpZ2luIHRvIGRlc3RpbmF0aW9uCi0gICAgLy90aGUgYnV0dG9uIHRvIGRyYWcgd2l0aCBpcyBzeXN0ZW0gZGVwZW5kZW50Ci0gICAgc3RhdGljIGJvb2xlYW4gcG9zdERyYWcoRGlzcGxheSBkaXNwbGF5LCBQb2ludCBvcmlnaW4sIFBvaW50IGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIGludCBidXR0b24gPSBkZXRlcm1pbmVEcmFnKCk7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotICAgICAgICBldmVudC54ID0gb3JpZ2luLng7Ci0gICAgICAgIGV2ZW50LnkgPSBvcmlnaW4ueTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlTW92ZSBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlRG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotICAgICAgICBldmVudC54ID0gZGVzdGluYXRpb24ueDsKLSAgICAgICAgZXZlbnQueSA9IGRlc3RpbmF0aW9uLnk7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZU1vdmUgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotICAgICAgICBldmVudC5idXR0b24gPSBidXR0b247Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlVXAgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgLy9UT0RPOiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdG8gaGF2ZSBhIG1vdXNlZG93biBhbmQgbm8gbW91c2V1cAotICAgICAgICAgICAgLy9mb3JjZSB0aGUgaXNzdWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy9kZXRlcm1pbmVzIHdoaWNoIGJ1dHRvbiB0byBkcmFnIHdpdGgKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGV0ZXJtaW5lRHJhZygpIHsKLSAgICAgICAgaWYoU3d0SnVuaXQuaXNXaW5kb3dzIHx8IFN3dEp1bml0LmlzQ2FyYm9uIHx8IFN3dEp1bml0LmlzR1RLKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3RzIGEgc2VsZWN0aW9uIGllIGNsaWNrcyBvbiBwdDEsIHRoZW4gY2xpY2sgb24gcHQyIChmb3IgZXhhbXBsZSwgc2VsZWN0aW5nCi0gICAgLy9vbmUgb2YgdGhlIG9wdGlvbnMgaW4gYSBjb21ibyBieSBkcm9wcGluZyBkb3duIHRoZSBsaXN0KQotICAgIHN0YXRpYyBib29sZWFuIHBvc3RTZWxlY3Rpb24oZmluYWwgRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdDEsIFBvaW50IHB0MikgewotICAgICAgICBib29sZWFuIHJldCA9IHBvc3RDbGljayhkaXNwbGF5LCBwdDEsIDEpOwotICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheS51cGRhdGUoKTsKLSAgICAgICAgfX0pOwotICAgICAgICByZXQgJj0gcG9zdENsaWNrKGRpc3BsYXksIHB0MiwgMSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy9pY29uaWZpZXMgdGhlIHNoZWxsLiBwdCBpcyBhIHN5c3RlbSBkZXBlbmRlbnQgcG9pbnQgb24gdGhlIHNoZWxsLgotICAgIHN0YXRpYyBib29sZWFuIHBvc3RTaGVsbEljb25pZnkoRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdCwgaW50IGJ1dHRvbikgewotICAgICAgICBpbnQgeCA9IHB0Lng7Ci0gICAgICAgIGludCB5ID0gcHQueSAtIDEwOwotICAgICAgICBpZihTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLSAgICAgICAgICAgIHggKz0gLTM1OwotICAgICAgICB9IGVsc2UgaWYoU3d0SnVuaXQuaXNMaW51eCkgewotICAgICAgICAJeCArPSAtMTY7Ci0gICAgICAgIH0gZWxzZSBpZiAoU3d0SnVuaXQuaXNDYXJib24pIHsKLSAgICAgICAgCXggKz0gMzA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvc3RDbGljayhkaXNwbGF5LCB4LCB5LCBidXR0b24pOyAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0VtdWxhdGVkV2lkZ2V0c1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0VtdWxhdGVkV2lkZ2V0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmYzMjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9FbXVsYXRlZFdpZGdldHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3Rpbmcgd2lkZ2V0cyB0aGF0IGhhdmUgYmVlbiBlbXVsYXRlZCBvbiBNb3RpZi4KLSAqLwotcHVibGljIGNsYXNzIEVtdWxhdGVkV2lkZ2V0c1Rlc3RzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7CQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLnN1aXRlKCkpOwkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uc3VpdGUoKSk7Ci0JCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3R5bGVkVGV4dENvbnRlbnRTcGVjLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N0eWxlZFRleHRDb250ZW50U3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQyMWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3R5bGVkVGV4dENvbnRlbnRTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotLyoqCi0gKiBVc2UgdGhpcyB0ZXN0IGNsYXNzIHRvIHZhbGlkYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHlsZWRUZXh0Q29udGVudAotICogaW50ZXJmYWNlLiAgVG8gcGVyZm9ybSB0aGUgdmFsaWRhdGlvbiwgY29weSB0aGlzIGNsYXNzIHRvIHRoZSBwYWNrYWdlIHdoZXJlIAotICogeW91ciBTdHlsZWRUZXh0Q29udGVudCBpbXBsZW1lbnRhdGlvbiBsaXZlcy4gIFRoZW4gc3BlY2lmeSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gKiBuYW1lIG9mIHlvdXIgU3R5bGVkVGV4dENvbnRlbnQgY2xhc3MgYXMgYW4gYXJndW1lbnQgdG8gdGhlIG1haW4gbWV0aG9kIG9mIHRoaXMgCi0gKiBjbGFzcy4gCi0gKiAKLSAqIE5PVEU6ICBUaGlzIHRlc3QgY2xhc3MgYXNzdW1lcyB0aGF0IHlvdXIgU3R5bGVkVGV4dENvbnRlbnQgaW1wbGVtZW50YXRpb24gCi0gKiBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgZGVsaW1pdGVyczoKLSAqIAotICogCQkvcgotICogCQkvbgotICogCQkvci9uCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLXB1YmxpYyBjbGFzcyBTdHlsZWRUZXh0Q29udGVudFNwZWMgaW1wbGVtZW50cyBUZXh0Q2hhbmdlTGlzdGVuZXIgewotCXN0YXRpYyBTdHJpbmcgY29udGVudENsYXNzTmFtZTsKLQlzdGF0aWMgaW50IGZhaWxDb3VudCA9IDA7Ci0Jc3RhdGljIGludCBlcnJvckNvdW50ID0gMDsKLQlDbGFzcyBjb250ZW50Q2xhc3MgPSBudWxsOwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnRJbnN0YW5jZSA9IG51bGw7Ci0JaW50IHZlcmlmeSA9IDA7Ci0JTWV0aG9kIGN1cnJlbnRNZXRob2QgPSBudWxsOwotCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0JU3R5bGVkVGV4dCB3aWRnZXQgPSBudWxsOwotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkKLXB1YmxpYyBTdHlsZWRUZXh0Q29udGVudFNwZWMoKSB7Ci19Ci1wdWJsaWMgdm9pZCBhc3NlcnRUcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbikgewotCVN5c3RlbS5vdXQucHJpbnQoIlx0IiArIGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIiAiICsgbWVzc2FnZSk7Ci0JaWYgKCFjb25kaXRpb24pIAotCQlmYWlsKG1lc3NhZ2UpOwotCWVsc2UgCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIHBhc3NlZCIpOwotfQotcHVibGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSkgewotCWZhaWxlZCA9IHRydWU7Ci0JU3lzdGVtLm91dC5wcmludGxuKCIgRkFJTEVEOiAiICsgbWVzc2FnZSk7Ci0JZmFpbENvdW50Kys7Ci19Ci1wdWJsaWMgU3R5bGVkVGV4dENvbnRlbnQgZ2V0Q29udGVudEluc3RhbmNlKCkgewotCWNvbnRlbnRJbnN0YW5jZS5zZXRUZXh0KCIiKTsKLQl3aWRnZXQuc2V0Q29udGVudChjb250ZW50SW5zdGFuY2UpOwotCXJldHVybiBjb250ZW50SW5zdGFuY2U7Ci19Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXN0VGV4dCgpIHsKLQlyZXR1cm4gCi0JCSJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHNlY29uZCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHRoaXJkIGxpbmUuXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZm91cnRoIGxpbmUuXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlmdGggbGluZS5cclxuIiArCi0JCSJcclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHNlY29uZCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHRoaXJkIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZm91cnRoIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlmdGggbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJcclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgc2Vjb25kIGxpbmUgb25jZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSB0aGlyZCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZm91cnRoIGxpbmUgb25jZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaWZ0aCBsaW5lIG9uY2UgYWdhaW4uIjsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTdHlsZWRUZXh0Q29udGVudFNwZWMgc3BlYyA9IG5ldyBTdHlsZWRUZXh0Q29udGVudFNwZWMoKTsKLQlpZiAoYXJncy5sZW5ndGggPiAwKSB7Ci0JCWNvbnRlbnRDbGFzc05hbWUgPSBhcmdzWzBdOwotCX0gZWxzZSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiQ29udGVudCBjbGFzcyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBleGVjdXRpb24gYXJndW1lbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQlzcGVjLnJ1bigpOwotCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCVN5c3RlbS5vdXQucHJpbnRsbihmYWlsQ291bnQgKyAiIFRFU1QgRkFJTFVSRVMuIik7Ci0JU3lzdGVtLm91dC5wcmludGxuKGVycm9yQ291bnQgKyAiIFVORVhQRUNURUQgRVJST1JTLiIpOwotfQotcHVibGljIHZvaWQgcnVuKCkgewotCWlmIChjb250ZW50Q2xhc3NOYW1lLmVxdWFscygiIikpIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCWJveC5zZXRNZXNzYWdlKCJDb250ZW50IGNsYXNzIG11c3QgYmUgc3BlY2lmaWVkIGFzIGFuIGV4ZWN1dGlvbiBhcmd1bWVudC4iKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjb250ZW50Q2xhc3MgPT0gbnVsbCkgewotCQl0cnkgewotCQkJY29udGVudENsYXNzID0gQ2xhc3MuZm9yTmFtZShjb250ZW50Q2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKCJDb250ZW50IGNsYXNzOlxuIiArIGNvbnRlbnRDbGFzc05hbWUgKyAiXG5ub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl0cnkgewotCQljb250ZW50SW5zdGFuY2UgPSAoU3R5bGVkVGV4dENvbnRlbnQpY29udGVudENsYXNzLm5ld0luc3RhbmNlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiVW5hYmxlIHRvIGFjY2VzcyBjb250ZW50IGNsYXNzOlxuIiArIGNvbnRlbnRDbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JCWJveC5vcGVuKCk7Ci0JCXJldHVybjsKLQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCWJveC5zZXRNZXNzYWdlKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29udGVudCBjbGFzczpcbiIgKyBjb250ZW50Q2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCUNsYXNzIGNsYXp6OwotCWNsYXp6ID0gdGhpcy5nZXRDbGFzcygpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlmb3IgKGludCBpPTA7IGk8bWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlzZXRVcCgpOwotCQljdXJyZW50TWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJZmFpbGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoY3VycmVudE1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgidGVzdF8iKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjdXJyZW50TWV0aG9kLmdldE5hbWUoKSArICIuLi4iKTsKLQkJCQljdXJyZW50TWV0aG9kLmludm9rZSh0aGlzLCBuZXcgT2JqZWN0WzBdKTsKLQkJCQlpZiAoIWZhaWxlZCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBBU1NFRC4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotCQkJCX0KLQkJCX0gCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiIEVSUk9SID09PiAiICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotCQkJZXJyb3JDb3VudCsrOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiIEVSUk9SID09PiAiICsgZXgudG9TdHJpbmcoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotCQkJZXJyb3JDb3VudCsrOwotCQl9Ci0JCWlmICh2ZXJpZnkgIT0gMCkgewotCQkJdmVyaWZ5ID0gMDsKLQkJCWNvbnRlbnRJbnN0YW5jZS5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdGVhckRvd24oKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLX0KLXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLX0KLXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCXN3aXRjaCAodmVyaWZ5KSB7Ci0JCWNhc2UgMSA6IHsKLQkJCWFzc2VydFRydWUoIjoxYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjFiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMiA6IHsKLQkJCWFzc2VydFRydWUoIjoyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDIpOwotCQkJYXNzZXJ0VHJ1ZSgiOjJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMyA6IHsKLQkJCWFzc2VydFRydWUoIjozYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgNDogewotCQkJYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA1IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA2IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjZhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6NmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA4IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjhhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA5IDogewotCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6OWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMDp7Ci0JCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMTogewotCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTI6IHsKLQkJCWFzc2VydFRydWUoIjoxMmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxMmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMzogewotCQkJYXNzZXJ0VHJ1ZSgiOjEzYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjEzYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE0OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTQ6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNTogewotCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE2OnsKLQkJCWFzc2VydFRydWUoIjoxNjoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE3OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxODogewotCQkJYXNzZXJ0VHJ1ZSgiOjE4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjE4YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE5OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MTliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMjA6IHsKLQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfSW5zZXJ0KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJ0ZXN0XG4gIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxYToiLCBuZXdUZXh0LmVxdWFscygidGVzdFxuIFRoaXNcbmlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJ0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIgVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICIqKiogIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuKioqIGlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoyZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIqKiogaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiXHJMaW5lIDFcclxuTGluZSAyIikpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAyIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg5LCAwLCAiXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNmOiIsIG5ld1RleHQuZXF1YWxzKCJcckxpbmUgMVxyXG5cckxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6M2g6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozaToiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiTGluZSAyIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIG5ld1RleHQuZXF1YWxzKCJcblRoaXNcbmlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMCwgIlxyXG5uZXdMaW5lIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaXNcclxubmV3TGluZSBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIm5ld0xpbmUgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo1ZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiVGhpc1xuaXNcclxubmV3TGluZSBhIHRlc3RcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlzXHJcbm5ld0xpbmUgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIikpOwotCWFzc2VydFRydWUoIjo2ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJuZXdMaW5lIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NmY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCi0JLy8gaW5zZXJ0IGF0IGVuZAotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg0LCAwLCAiXG4gIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuICIpKTsKLQlhc3NlcnRUcnVlKCI6N2I6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6N2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6N2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiICIpKTsKLQljb250ZW50LnNldFRleHQoIlRoaXNcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdlOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5cbiIpKTsKLQlhc3NlcnRUcnVlKCI6N2Y6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6N2c6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6N2g6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo3aToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQkvLyBpbnNlcnQgYXQgYmVnaW5uaW5nCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6OGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6OGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo4ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIikpOwotCi0JLy8gaW5zZXJ0IHRleHQKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICIqKiogIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo5YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuKioqIGlzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo5YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo5YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo5ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIqKiogaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo5ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgImxpbmUiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xubGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTBiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxMGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygibGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTBlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDgpID09IDEpOwotCWFzc2VydFRydWUoIjoxMGY6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoOSkgPT0gMSk7Ci0KLQkvLyBpbnNlcnQgYXQgYmVnaW5uaW5nIAotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJsaW5lXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYToiLCBuZXdUZXh0LmVxdWFscygibGluZVxuVGhpc1xuIikpOwotCWFzc2VydFRydWUoIjoxMWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxMWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDJcclxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTJhOiIsIG5ld1RleHQuZXF1YWxzKCJcckxpbmUgMVxyXG5MaW5lIDJcclxuTGluZSAzIikpOwotCWFzc2VydFRydWUoIjoxMmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MTJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MTJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTJlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6MTJmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDJcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAwLCAiTGluZTFhXG5MaW5lMWJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTNhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIDFcbkxpbmUxYVxuTGluZTFiXG5MaW5lIDJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTNiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lMWEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lMWIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzZzoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTEsIDAsICJsMWEiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0YToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxXG5MaW5lbDFhIDJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTRiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lbDFhIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyIGlzIGEgdmVyeSBsb25nIGxpbmUgdGhhdCBzcGFucyBtYW55IHdvcmRzXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTksIDAsICJ2ZXJ5LCB2ZXJ5LCAiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1YToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxXG5MaW5lIDIgaXMgYSB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGxvbmcgbGluZSB0aGF0IHNwYW5zIG1hbnkgd29yZHNcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTViOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDIgaXMgYSB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGxvbmcgbGluZSB0aGF0IHNwYW5zIG1hbnkgd29yZHMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDMiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfRW1wdHkoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoInRlc3QiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotfQotcHVibGljIHZvaWQgdGVzdF9MaW5lX0NvbnZlcnNpb24oKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHJyZXBlYXRcbmVuZFxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7CQotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsJCi0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDUpOwkKLQlhc3NlcnRUcnVlKCI6MWc6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygicmVwZWF0IikpOwotCWFzc2VydFRydWUoIjoxaDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSAxNSk7CQotCWFzc2VydFRydWUoIjoxaToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJlbmQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDIyKTsKLQlhc3NlcnRUcnVlKCI6MWs6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoxbDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSAyNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdCIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjoyZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAwKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3RcciIpOwotCWFzc2VydFRydWUoIjozYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDE1KSA9PSAxKTsKLQkKLQljb250ZW50LnNldFRleHQoIlxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cblxyXHJcbiIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwkKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsJCi0JYXNzZXJ0VHJ1ZSgiOjVmOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWc6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMyk7CQotCWFzc2VydFRydWUoIjo1aDoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVpOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDQpOwotCWFzc2VydFRydWUoIjo1ajoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVrOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDQpID09IDYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgidGVzdFxyXHJ0ZXN0MlxyXHIiKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygidGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNSk7CQotCWFzc2VydFRydWUoIjo2ZjoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJ0ZXN0MiIpKTsKLQlhc3NlcnRUcnVlKCI6Nmc6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gNik7CQotCWFzc2VydFRydWUoIjo2aDoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZpOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDEyKTsKLQlhc3NlcnRUcnVlKCI6Nmo6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo2azoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSAxMyk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X09mZnNldF9Ub19MaW5lKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxycmVwZWF0XG5lbmRcciIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMykgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyNSkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDI2KSA9PSA0KTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcclxuaXMgYSB0ZXN0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDApOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg2KSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMTApID09IDEpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbiIpOwotCWFzc2VydFRydWUoIjozYToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXG5cclxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDApOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMykgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDMpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNikgPT0gNCk7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDMpID09IDEpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAyKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcclxyXG5cclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo2YjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDMpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCQotCWNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0xpbmVfVG9fT2Zmc2V0KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxycmVwZWF0XG5lbmRcciIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDE1KTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMykgPT0gMjIpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSAyNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdCIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcblxuXHJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDQpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSA2KTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbnRlc3RcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gOCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfRGVsZXRlKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDYsIDIsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5pYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlhIHRlc3QiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuXHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygibGluZSAzIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCA1LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJsaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImxpbmUgNCIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTYsIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIG5ld1RleHQuZXF1YWxzKCJpcyBhIHRlc3RcbmxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0aDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJsaW5lIDMiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDksIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIG5ld1RleHQuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRqOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgOCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGs6IiwgbmV3VGV4dC5lcXVhbHMoImkiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRsOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImkiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRtOiIsIG5ld1RleHQuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRuOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcblxyIikpOwotCWFzc2VydFRydWUoIjo1YjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNCwgOCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgbmV3VGV4dC5lcXVhbHMoIkwxXHJcbkw0XHJcbiIpKTsKLQlhc3NlcnRUcnVlKCI6NmI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMMSIpKTsKLQlhc3NlcnRUcnVlKCI6NmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTDQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3YToiLCBuZXdUZXh0LmVxdWFscygiTDFcclxuTDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6N2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkwyIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo4YToiLCBuZXdUZXh0LmVxdWFscygiXG5MMVxyXG5MMiIpKTsKLQlhc3NlcnRUcnVlKCI6OGI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo4YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkwxIikpOwotCWFzc2VydFRydWUoIjo4ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMMiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MaW5lIDFcbkxpbmUgMlxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjlhOiIsIG5ld1RleHQuZXF1YWxzKCJcbkxpbmUgMlxuIikpOwotCWFzc2VydFRydWUoIjo5YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo5YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjlkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6OWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDYsIDgsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxMGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTBjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSBvbmUgaXMgc2hvcnRcclxuTGluZSAyIGlzIGEgbG9uZ2VyIGxpbmVcclxuTGluZSAzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTIsIDE3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMWE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgb25lIGlzIGEgbG9uZ2VyIGxpbmVcclxuTGluZSAzXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxMWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSBvbmUgaXMgYSBsb25nZXIgbGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTFlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotfQotcHVibGljIHZvaWQgdGVzdF9SZXBsYWNlKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDQsICJhIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDIsICJ3YXMiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG53YXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygid2FzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIGlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDIsICJ3YXMiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzIHdhcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIHdhcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDE1KSA9PSAwKTsKLQkKLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgNywgIkxhXG5MYlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiTGFcbkxiXG5MaW5lIDJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dChnZXRUZXN0VGV4dCgpKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JaW50IHN0YXJ0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoNik7Ci0JaW50IGVuZCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDExKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEyKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDUpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNikuZXF1YWxzKCIiKSk7Ci0Jc3RhcnQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSg3KTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2Uoc3RhcnQsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkgLSBzdGFydCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA4KTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDUpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg3KS5lcXVhbHMoIiIpKTsKLQotfQotcHVibGljIHZvaWQgdGVzdF9TcGVjaWFsX0Nhc2VzKCkgewotCVN0cmluZyBuZXdUZXh0OwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlhc3NlcnRUcnVlKCI6MGE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxYjoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWQ6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDQsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxZToiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg2LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWc6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxaDoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIG5ld1RleHQuZXF1YWxzKCJcblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyZDoiLCBuZXdUZXh0LmVxdWFscygiXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MmY6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoyZzoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2Y6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5cblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozaDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNpOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2o6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozazoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBuZXdUZXh0LmVxdWFscygiXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0aToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJhIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBuZXdUZXh0LmVxdWFscygiXG5cbmFUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiYVRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0KLQljb250ZW50LnNldFRleHQoImFiY1xyXG5kZWYiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgbmV3VGV4dC5lcXVhbHMoImFjXHJcbmRlZiIpKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImRlZiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgbmV3VGV4dC5lcXVhbHMoImFcclxuZGVmIikpOwotCWFzc2VydFRydWUoIjo2ZjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo2ZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhIikpOwotCWFzc2VydFRydWUoIjo2aDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJkZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZpOiIsIG5ld1RleHQuZXF1YWxzKCJhZGVmIikpOwotCWFzc2VydFRydWUoIjo2ajoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjo2azoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhZGVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2bDoiLCBuZXdUZXh0LmVxdWFscygiYWVmIikpOwotCWFzc2VydFRydWUoIjo2bToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjo2bjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZvOiIsIG5ld1RleHQuZXF1YWxzKCJhZiIpKTsKLQlhc3NlcnRUcnVlKCI6NnA6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NnE6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWYiKSk7Ci0KLQljb250ZW50LnNldFRleHQoImFiYyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiMSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6N2I6IiwgbmV3VGV4dC5lcXVhbHMoIjFiYyIpKTsKLQlhc3NlcnRUcnVlKCI6N2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiMWJjIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdkOiIsIG5ld1RleHQuZXF1YWxzKCJcbjFiYyIpKTsKLQlhc3NlcnRUcnVlKCI6N2U6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6N2Y6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo3ZzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIxYmMiKSk7Ci0JCi0JY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLDAsImEiKTsKLQkKLQljb250ZW50LnNldFRleHQoInBhY2thZ2UgdGVzdDtcbi8qIExpbmUgMVxuICogTGluZSAyXG4gKi9cbnB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7XG59Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDE0LCAyMywgIlx0LypMaW5lIDFcblx0ICogTGluZSAyXG5cdCAqLyIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgbmV3VGV4dC5lcXVhbHMoInBhY2thZ2UgdGVzdDtcblx0LypMaW5lIDFcblx0ICogTGluZSAyXG5cdCAqL1xucHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHtcbn0iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNik7Ci0JYXNzZXJ0VHJ1ZSgiOjhjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoInBhY2thZ2UgdGVzdDsiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlx0LypMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIlx0ICogTGluZSAyIikpOwotCWFzc2VydFRydWUoIjo4ZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJcdCAqLyIpKTsKLQlhc3NlcnRUcnVlKCI6OGc6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygicHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHsiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhoOiIsIGNvbnRlbnQuZ2V0TGluZSg1KS5lcXVhbHMoIn0iKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X1RleHRfQ2hhbmdlZF9FdmVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JdmVyaWZ5ID0gMTsKLQljb250ZW50LnNldFRleHQoInRlc3RpbmciKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAyOwotCWNvbnRlbnQuc2V0VGV4dCgiXG5cbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMzsKLQljb250ZW50LnNldFRleHQoImEiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIlxuXG4iKTsKLQotCXZlcmlmeSA9IDQ7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6NDoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSA1OwotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDY7Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSA3OwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gODsKLQljb250ZW50LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQotCXZlcmlmeSA9IDk7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDEwOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxMDoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxMTsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxMToiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxMjsKLQljb250ZW50LnNldFRleHQoIkwxXHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAxMzsKLQljb250ZW50LnNldFRleHQoIkwxXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAxNDsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTQ6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTU7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAxNjsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjE2OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDE3OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTc6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTg7Ci0gCWNvbnRlbnQuc2V0VGV4dCgiTDFcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG50ZXN0XHJcbiIpOwotCi0JdmVyaWZ5ID0gMTk7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0JdmVyaWZ5ID0gMjA7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MjA6IiwgdHJ1ZSk7fQotCi0KLQl2ZXJpZnkgPSAwOwotCWNvbnRlbnQucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKHRoaXMpOwotfQotcHVibGljIHZvaWQgdGVzdF9EZWxpbWl0ZXJfU3BlY2lhbF9DYXNlcygpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxOiIsIG5ld1RleHQuZXF1YWxzKCJcbkwxXHJcbkwyIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBuZXdUZXh0LmVxdWFscygiTDF0ZXN0XG5cbiIpKTsKLQotLy8JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLS8vCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTsKLS8vCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLS8vCWFzc2VydFRydWUoIjozOiIsIG5ld1RleHQuZXF1YWxzKCJMMVxydGVzdFxyXG4iKSk7Ci0KLS8vCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0vLwljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7Ci0vLwluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0vLwlhc3NlcnRUcnVlKCI6NDoiLCBuZXdUZXh0LmVxdWFscygiTHRlc3RcblxuXG5MMlxyXG5MM1xyXG5MNFxyXG4iKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkwxXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgbmV3VGV4dC5lcXVhbHMoIkwxdGVzdFxyXHJcclxuIikpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSAgewotCS8vIGNyZWF0ZSBzaGVsbAotCXNoZWxsID0gbmV3IFNoZWxsICgpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDMwMCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JLy8gY3JlYXRlIHdpZGdldAotCXdpZGdldCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQl3aWRnZXQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQlzaGVsbC5vcGVuICgpOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSAgewotCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkICgpKSAKLQkJc2hlbGwuZGlzcG9zZSAoKTsKLQlzaGVsbCA9IG51bGw7Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0SnVuaXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0SnVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkNDg1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dEp1bml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotCi0vKioKLSAqIFBsYXRmb3JtLXNwZWNpZmljIGNvbnN0YW50cyB1c2VkIGluIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgU3d0SnVuaXQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdEZvbnROYW1lOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKS5zdGFydHNXaXRoKCJ3aW4zMiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0NhcmJvbiA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoImNhcmJvbiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc01vdGlmID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0dUSyA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiZ3RrIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzUGhvdG9uID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJwaG90b24iKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNMaW51eCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiTGludXgiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNBSVggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkFJWCIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1NvbGFyaXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIlNvbGFyaXMiKSB8fCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIlN1bk9TIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzSFBVWCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiSFAtVVgiKTsKLQkKLQlzdGF0aWMgewotCQlpZiAoaXNNb3RpZikgewotCQkJdGVzdEZvbnROYW1lID0gIm1pc2MtZml4ZWQiOwotCQl9Ci0JCWVsc2UgewotCQkJdGVzdEZvbnROYW1lID0gIkhlbHZldGljYSI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmFlN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLQotcHVibGljIGNsYXNzIFN3dFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gbWFyayB0ZXN0IGNhc2VzIHRoYXQKLQkgKiBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IFNXVCBhdCB0aGlzIHRpbWUsIG9yIHRlc3QKLQkgKiBjYXNlcyB0aGF0IG1heWJlIHRoZW1zZWx2ZXMgZHViaW91cyAoZWcuIHdoZW4gdGhlIGNvcnJlY3QKLQkgKiBiZWhhdmlvdXIgbWF5IG5vdCBiZSBjbGVhcikuIE1vc3Qgb2YgdGhlc2UgZmxhZ2dlZCB0ZXN0Ci0JICogY2FzZXMgaW52b2x2ZSBoYW5kbGluZyBlcnJvciBjb25kaXRpb25zLgotCSAqCi0JICogU2V0dGluZyB0aGVzZSBmbGFncyB0byB0cnVlIHdpbGwgcnVuIHRob3NlIHRlc3RzLiBBcyBhcGkKLQkgKiBpcyBpbXBsZW1lbnRlZCB0aGlzIGdpdmVzIHVzIGEgY29udmVuaWVudCB3YXkgdG8gaW5jbHVkZQotCSAqIGl0IGluIHRoZSBqdW5pdCB0ZXN0cy4KLQkgKi8KLQotCS8vIHJ1biB0ZXN0IGNhc2VzIHRoYXQgbWF5IHRoZW1zZWx2ZXMgYmUgZHViaW91cwotCS8vIHRoZXNlIHNob3VsZCBiZSBldmVudHVhbGx5IGNoZWNrZWQgdG8gc2VlIGlmIAotCS8vIHRoZXJlIGlzIGEgdmFsaWQgZmFpbHVyZSBvciB0aGUgdGVzdCBpcyBib2d1cwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmQ2hlY2tCb2d1c1Rlc3RDYXNlcyA9IGZhbHNlOwotCi0JLy8gY2hlY2sgdmlzaWJpbGl0eSBhcGkgKGVnIGluIG1lbnUpCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZDaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKLQotCS8vIHJ1biB0ZXN0IGNhc2VzIHRoYXQgY2hlY2sgU1dUIHBvbGljeSBub3QgY292ZXJlZCBieSB0aGUgZmxhZ3MgYWJvdmUKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZkNoZWNrU1dUUG9saWN5ID0gZmFsc2U7Ci0KLQkvLyBtYWtlIGRpYWxvZyBvcGVuIGNhbGxzLCBvcGVyYXRvciBtdXN0IHRoZW4gY2xvc2UgdGhlbQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmVGVzdERpYWxvZ09wZW4gPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZlRlc3RDb25zaXN0ZW5jeSA9IGZhbHNlOwotCi0JLy8gdmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHVuaW1wbGVtZW50ZWQgbWV0aG9kcwotCXB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCQotCS8vIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB1bmltcGxlbWVudGVkIEFQSSBtZXRob2RzCi0JcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZEFQSTsKLQkKLQkvLyB1c2VkIHRvIHNwZWNpZnkgdmVyYm9zZSBtb2RlLCBpZiB0cnVlIHVuaW1wbGVtZW50ZWQgd2FybmluZyBtZXNzYWdlcyB3aWxsIAotCS8vIGJlIHdyaXR0ZW4gdG8gU3lzdGVtLm91dAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCi0JLy8gYWxsb3cgc3BlY2lmaWMgaW1hZ2UgZm9ybWF0cyB0byBiZSB0ZXN0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRm9ybWF0cyA9IG5ldyBTdHJpbmdbXSB7ImJtcCIsICJqcGciLCAiZ2lmIiwgInBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJmb2xkZXIiLCAiZm9sZGVyT3BlbiIsICJ0YXJnZXQifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGludmFsaWRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImNvcnJ1cHQiLCAiY29ycnVwdEJhZEJpdERlcHRoLnBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7InRyYW5zcGFyZW50LnBuZyJ9OwotCQotCS8vIHNwZWNpZnkgcmVwYXJlbnRhYmxlIHBsYXRmb3JtcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gcmVwYXJlbnRhYmxlUGxhdGZvcm1zID0gbmV3IFN0cmluZ1tdIHsid2luMzIiLCAiZ3RrIn07Ci0JCi1wdWJsaWMgU3d0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWRbXSwgT2JqZWN0IGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHJldHVybjsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApIHJldHVybjsKLQkJc2FtZSA9IHRydWU7Ci0JCWJvb2xlYW5bXSBtYXRjaGVkID0gbmV3IGJvb2xlYW5bZXhwZWN0ZWQubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWQubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIW1hdGNoZWRbal0pIHsKLQkJCQkJaWYgKChhY3R1YWxbaV0gPT0gbnVsbCAmJiBleHBlY3RlZCBbal0gPT0gbnVsbCkgfHwKLQkJCQkJICAgIChhY3R1YWxbaV0gIT0gbnVsbCAmJiBhY3R1YWxbaV0uZXF1YWxzKGV4cGVjdGVkW2pdKSkpIHsKLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCW1hdGNoZWRbal0gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hdGNoKSB7Ci0JCQkJc2FtZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmICghc2FtZSkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlhc3NlcnRTYW1lKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkgcmV0dXJuOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlzYW1lID0gdHJ1ZTsKLQkJYm9vbGVhbltdIG1hdGNoZWQgPSBuZXcgYm9vbGVhbltleHBlY3RlZC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5sZW5ndGg7IGorKykgewotCQkJCWlmICghbWF0Y2hlZFtqXSAmJiBhY3R1YWxbaV0gPT0gZXhwZWN0ZWRbal0pIHsKLQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQltYXRjaGVkW2pdID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIXNhbWUpIHsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShpbnQgZXhwZWN0ZWRbXSwgaW50IGFjdHVhbFtdKSB7Ci0JYXNzZXJ0U2FtZShudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFleHBlY3RlZFtpXS5lcXVhbHMoYWN0dWFsW2ldKSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZENvZGUsIFRocm93YWJsZSBhY3R1YWxUaHJvd2FibGUpIHsKLQlpZiAoYWN0dWFsVGhyb3dhYmxlIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLQkJU1dURXJyb3IgZXJyb3IgPSAoU1dURXJyb3IpIGFjdHVhbFRocm93YWJsZTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQ29kZSwgZXJyb3IuY29kZSk7Ci0JfSBlbHNlIGlmIChhY3R1YWxUaHJvd2FibGUgaW5zdGFuY2VvZiBTV1RFeGNlcHRpb24pIHsKLQkJU1dURXhjZXB0aW9uIGV4Y2VwdGlvbiA9IChTV1RFeGNlcHRpb24pIGFjdHVhbFRocm93YWJsZTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQ29kZSwgZXhjZXB0aW9uLmNvZGUpOwotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlTV1QuZXJyb3IoZXhwZWN0ZWRDb2RlKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4cGVjdGVkVGhyb3dhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUaHJvd2FibGUuZ2V0TWVzc2FnZSgpLCBhY3R1YWxUaHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoT2JqZWN0IGV4cGVjdGVkW10sIE9iamVjdCBhY3R1YWxbXSkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGV4cGVjdGVkW2ldICE9IGFjdHVhbFtpXSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoaW50IGV4cGVjdGVkW10sIGludCBhY3R1YWxbXSkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLS8vIGNvcGllZCBleGFjdGx5IGZyb20ganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHNvIHRoYXQgaXQgY2FuIGJlIGNhbGxlZCBmcm9tIGhlcmUgZXZlbiB0aG91Z2ggcHJpdmF0ZQotc3RhdGljIHByaXZhdGUgdm9pZCBmYWlsTm90RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKLQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCWZhaWwoZm9ybWF0dGVkKyJleHBlY3RlZDo8IitleHBlY3RlZCsiPiBidXQgd2FzOjwiK2FjdHVhbCsiPiIpOwotfQotCi1zdGF0aWMgcHJpdmF0ZSB2b2lkIGZhaWxOb3RFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKLQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCWZvcm1hdHRlZCArPSAiZXhwZWN0ZWQ6PCI7Ci0JaWYoZXhwZWN0ZWQgIT0gbnVsbCkgewotCSAgICBmb3IoaW50IGk9MDsgaTxNYXRoLm1pbihleHBlY3RlZC5sZW5ndGgsIDUpOyBpKyspCi0JICAgICAgICBmb3JtYXR0ZWQgKz0gZXhwZWN0ZWRbaV0gKyIsICI7Ci0JICAgIGlmKGV4cGVjdGVkLmxlbmd0aCAhPSAwKQotCSAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cmluZygwLCBmb3JtYXR0ZWQubGVuZ3RoKCktMik7Ci0JfQotCWlmKGV4cGVjdGVkLmxlbmd0aCA+IDUpCi0JICAgIGZvcm1hdHRlZCArPSAiLi4uIjsKLQlmb3JtYXR0ZWQgKz0gIj4gYnV0IHdhczo8IjsKLQlpZihhY3R1YWwgIT0gbnVsbCkgewotCSAgICBmb3IoaW50IGk9MDsgaTxNYXRoLm1pbihhY3R1YWwubGVuZ3RoLCA1KTsgaSsrKQotCSAgICAgICAgZm9ybWF0dGVkICs9IGFjdHVhbFtpXSArIiwgIjsKLQkgICAgaWYoYWN0dWFsLmxlbmd0aCAhPSAwKQotCSAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cmluZygwLCBmb3JtYXR0ZWQubGVuZ3RoKCktMik7Ci0JfQotCWlmKGFjdHVhbC5sZW5ndGggPiA1KQotCSAgICBmb3JtYXR0ZWQgKz0gIi4uLiI7Ci0JZmFpbChmb3JtYXR0ZWQrIj4iKTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNKMk1FKCkgewotCXRyeSB7Ci0JCUNvbXBhdGliaWxpdHkubmV3RmlsZUlucHV0U3RyZWFtKCIiKTsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIGlzUmVwYXJlbnRhYmxlUGxhdGZvcm0oKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJlcGFyZW50YWJsZVBsYXRmb3Jtcy5sZW5ndGg7IGkrKykgewotCQlpZiAocmVwYXJlbnRhYmxlUGxhdGZvcm1zW2ldLmVxdWFscyhwbGF0Zm9ybSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHdhcm5VbmltcGwoU3RyaW5nIG1lc3NhZ2UpIHsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpICsgIjogIiArIG1lc3NhZ2UpOwotCX0KLQl1bmltcGxlbWVudGVkTWV0aG9kcysrOwotfQotcHJvdGVjdGVkIHZvaWQgd2FyblVuaW1wbEFQSShTdHJpbmcgbWVzc2FnZSkgewotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVBJIG5vdCBpbXBsZW1lbnRlZCAiICsgdGhpcy5nZXRDbGFzcygpICsgIiAiICsgZ2V0TmFtZSgpKTsKLQl9Ci0JdW5pbXBsZW1lbnRlZEFQSSsrOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTU1YjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBEbyBub3RoaW5nLiBDbGFzcyBTV1QgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCS8vIFRlc3QgdGhhdCB3ZSB0aHJvdyB0aGUgZXhwZWN0ZWQga2luZHMgb2YgZXJyb3JzIGZvciB0aGUgZ2l2ZW4gZXJyb3IgdHlwZXMuCi0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlwYXNzZWQgPSB0cnVlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgcGFzc2VkKTsKLQlwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0ZBSUxFRF9FWEVDKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfRkFJTEVEX0VYRUMiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTk9fSEFORExFUyk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfTk9fSEFORExFUyIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKC0xKTsKLQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQlwYXNzZWQgPSB0cnVlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBlcnJvcigtMSkiLCBwYXNzZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlKCkgewotCS8vIFRlc3QgdGhhdCB0aGUgY2F1c2luZyB0aHJvd2FibGUgaXMgZmlsbGVkIGluLgotCVRocm93YWJsZSBjYXVzZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKdXN0IGZvciB0ZXN0aW5nIik7Ci0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgY2F1c2UpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlwYXNzZWQgPSBleC50aHJvd2FibGUgPT0gY2F1c2U7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQsIGNhdXNlKTsKLQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQlwYXNzZWQgPSBleC50aHJvd2FibGUgPT0gY2F1c2U7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX05PVF9JTVBMRU1FTlRFRCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKC0xLCBjYXVzZSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBlcnJvcigtMSkiLCBwYXNzZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlTV1QuZ2V0TWVzc2FnZShudWxsKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiB3aXRoIG51bGwgYXJndW1lbnQiLCBwYXNzZWQpOwotCXRyeSB7Ci0JCVNXVC5nZXRNZXNzYWdlKCJTV1RfWWVzIik7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJZmFpbCAoImV4Y2VwdGlvbiAiICsgdCArICIgZ2VuZXJhdGVkIGZvciBTV1RfWWVzIik7Ci0JfQotCWFzc2VydFRydWUgKAotCQkiaW52YWxpZCBrZXkgZGlkIG5vdCByZXR1cm4gYXMgaXRzZWxmIiwKLQkJIl9OT1RfRk9VTkRfSU5fUFJPUEVSVElFU18iLmVxdWFscyhTV1QuZ2V0TWVzc2FnZSgiX05PVF9GT1VORF9JTl9QUk9QRVJUSUVTXyIpKSk7Ci0JCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBsYXRmb3JtKCkgewotCS8vIENhbid0IHRlc3QgdGhlIGxpc3Qgb2YgcGxhdGZvcm1zLCBzaW5jZSB0aGlzIG1heSBjaGFuZ2UsCi0JLy8gc28ganVzdCB0ZXN0IHRvIHNlZSBpdCByZXR1cm5zIHNvbWV0aGluZy4KLQlhc3NlcnRUcnVlICgicmV0dXJuZWQgbnVsbCBwbGF0Zm9ybSBuYW1lIiwgU1dULmdldFBsYXRmb3JtKCkgIT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQkvLyBUZXN0IHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIHdoaWNoIGlzIHJldHVybmVkIGlzIHJlYXNvbmFibGUuCi0JaW50IHZlciA9IFNXVC5nZXRWZXJzaW9uKCk7Ci0JYXNzZXJ0VHJ1ZSAoInVucmVhc29uYWJsZSB2YWx1ZSByZXR1cm5lZCIsIHZlciA+IDAgJiYgdmVyIDwgMTAwMDAwMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQbGF0Zm9ybSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmVyc2lvbiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlIikpIHRlc3RfZXJyb3JJTGphdmFfbGFuZ19UaHJvd2FibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGxhdGZvcm0iKSkgdGVzdF9nZXRQbGF0Zm9ybSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmVyc2lvbiIpKSB0ZXN0X2dldFZlcnNpb24oKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZGE3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pLmNvZGUgPT0gU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTywgIkFuIHVuaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmNvZGUgCi0JCQk9PSBTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8sICJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikuZ2V0TWVzc2FnZSgpIAotCQkJLmluZGV4T2YoIkFuIGludGVyZXN0aW5nIG1lc3NhZ2UiKSA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludFN0YWNrVHJhY2UoKSB7Ci0JCi0JLy8gV0FSTklORzogdGhpcyB0ZXN0IGlzIG5vdCBDTERDIHNhZmUsIGJlY2F1c2UgaXQgcmVxdWlyZXMgamF2YS5pby5QcmludFN0cmVhbQotCQotCXRyeSB7Ci0JCUNsYXNzLmZvck5hbWUoImphdmEuaW8uUHJpbnRTdHJlYW0iKTsKLQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJLy8gaWdub3JlIHRlc3QgaWYgcnVubmluZyBvbiBDTERDCi0JCXJldHVybjsKLQl9Ci0JCi0JLy8gdGVzdCBkZWZhdWx0IFNXVEVycm9yCi0JCi0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQlTV1RFcnJvciBlcnJvciA9IG5ldyBTV1RFcnJvcigpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci0JCi0JLy8gdGVzdCBTV1RFcnJvciB3aXRoIGNvZGUKLQkKLQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JZXJyb3IgPSBuZXcgU1dURXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZXNzYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludFN0YWNrVHJhY2UiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVzc2FnZSIpKSB0ZXN0X2dldE1lc3NhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpKSB0ZXN0X3ByaW50U3RhY2tUcmFjZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2IxNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKS5jb2RlID09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSAKLQkJCT09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmdldE1lc3NhZ2UoKSAKLQkJCS5pbmRleE9mKCJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlKCkgewotCQotCS8vIFdBUk5JTkc6IHRoaXMgdGVzdCBpcyBub3QgQ0xEQyBzYWZlLCBiZWNhdXNlIGl0IHJlcXVpcmVzIGphdmEuaW8uUHJpbnRTdHJlYW0KLQkKLQl0cnkgewotCQlDbGFzcy5mb3JOYW1lKCJqYXZhLmlvLlByaW50U3RyZWFtIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSB0ZXN0IGlmIHJ1bm5pbmcgb24gQ0xEQwotCQlyZXR1cm47Ci0JfQotCQotCS8vIHRlc3QgZGVmYXVsdCBTV1RFeGNlcHRpb24KLQkKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG91dCkpOwotCVNXVEV4Y2VwdGlvbiBlcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotCQotCS8vIHRlc3QgU1dURXhjZXB0aW9uIHdpdGggY29kZQotCQotCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQllcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRTdGFja1RyYWNlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludFN0YWNrVHJhY2UiKSkgdGVzdF9wcmludFN0YWNrVHJhY2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZDhmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2YzM5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JYWNjZXNzaWJsZSA9IHNoZWxsLmdldEFjY2Vzc2libGUoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKHNoZWxsLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRGb2N1cyhBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldFNlbGVjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldERlc2NyaXB0aW9uKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWFjY2Vzc2libGUucmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZVRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb25SYW5nZShBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDYXJldE9mZnNldChBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0JYXNzZXJ0RXF1YWxzKHNoZWxsLCBhY2Nlc3NpYmxlLmdldENvbnRyb2woKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb2N1c0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0Q2FyZXRNb3ZlZEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RleHRDYXJldE1vdmVkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2VkSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0Q2hhbmdlZElJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdGlvbkNoYW5nZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENhcmV0TW92ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2hhbmdlZElJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSIpKSB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdGlvbkNoYW5nZWQiKSkgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1c0kiKSkgdGVzdF9zZXRGb2N1c0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDYXJldE1vdmVkSSIpKSB0ZXN0X3RleHRDYXJldE1vdmVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENoYW5nZWRJSUkiKSkgdGVzdF90ZXh0Q2hhbmdlZElJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQiKSkgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByaXZhdGUgU2hlbGwgc2hlbGw7Ci1wcml2YXRlIEFjY2Vzc2libGUgYWNjZXNzaWJsZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODk4ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJkY2FkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdkMzhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBPYmplY3Qgd2lsbCB0eXBpY2FsbHkgYmUgYSB3aWRnZXQuCi0JQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KG5ldyBJbnRlZ2VyKDUpKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVDb250cm9sRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI4OTg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY0YzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gT2JqZWN0IHdpbGwgdHlwaWNhbGx5IGJlIGEgd2lkZ2V0LgotCUFjY2Vzc2libGVFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotCQotCS8vIFRlc3Qgd2l0aCBzb21lIG90aGVyIG9iamVjdCBhbHNvLgotCWV2ZW50ID0gbmV3IEFjY2Vzc2libGVFdmVudChuZXcgSW50ZWdlcig1KSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQWNjZXNzaWJsZUV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzcyMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjNjMGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVmMDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBPYmplY3Qgd2lsbCB0eXBpY2FsbHkgYmUgYSB3aWRnZXQuCi0JQWNjZXNzaWJsZVRleHRFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KG5ldyBJbnRlZ2VyKDUpKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlBY2Nlc3NpYmxlVGV4dEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVUZXh0RXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFhNDI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmMmRmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMiKSkgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFiM2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmRpc3Bvc2UoKTsKLQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJyb3dzZXIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlDbG9zZVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JT3BlbldpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVPcGVuV2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RhdHVzVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRUaXRsZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlUaXRsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9iYWNrKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYmFjayIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiByZXR1cm5pbmcgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5iYWNrKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQl0cnkgewotCQlicm93c2VyLmV4ZWN1dGUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNjcmlwdCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvKiBSZWFsIHRlc3RpbmcgaXMgZG9uZSBpbiB0aGUgdGVzdHMgdGhhdCBydW4gdGhlIGV2ZW50IGxvb3AKLQkgKiBzaW5jZSBhIGRvY3VtZW50IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCB0byBleGVjdXRlIGEgc2NyaXB0IG9uIGl0LgotCSAqLwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcndhcmQoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9mb3J3YXJkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIuZm9yd2FyZCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotCS8qIGdvaW5nIGZvcndhcmQgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5mb3J3YXJkKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRVcmwoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9nZXRVcmwiKTsKLQlTdHJpbmcgc3RyaW5nID0gYnJvd3Nlci5nZXRVcmwoKTsKLQlhc3NlcnRUcnVlKHN0cmluZyAhPSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0JhY2tFbmFibGVkKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCQotCS8qIGJhY2sgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzQmFja0VuYWJsZWQgcHJldmlvdXNseSByZXR1cm5lZCAqLwotCWFzc2VydEVxdWFscyhicm93c2VyLmlzQmFja0VuYWJsZWQoKSwgYnJvd3Nlci5iYWNrKCkpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiBnb2luZyBiYWNrIDEwIHRpbWVzIGluIGhpc3RvcnkgLSBleHBlY3RpbmcgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpOwotCWFzc2VydEZhbHNlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2lzRm9yd2FyZEVuYWJsZWQiKTsKLQkKLQkvKiBmb3J3YXJkIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgdGhhdCBpc0ZvcndhcmRFbmFibGVkIHByZXZpb3VzbHkgcmV0dXJuZWQgKi8KLQlhc3NlcnRFcXVhbHMoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCksIGJyb3dzZXIuZm9yd2FyZCgpKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCXJ1bkxvb3BUaW1lcigxKTsKLQl9Ci0JLyogZ29pbmcgZm9yd2FyZCAxMCB0aW1lcyBpbiBoaXN0b3J5IC0gZXhwZWN0aW5nIGZhbHNlIGlzIHJldHVybmVkICovCi0JYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKTsKLQlhc3NlcnRGYWxzZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZnJlc2goKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9yZWZyZXNoIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZUNsb3NlV2luZG93TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRDbG9zZVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZExvY2F0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkT3BlbldpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFByb2dyZXNzTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkU3RhdHVzVGV4dExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFRpdGxlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXNoZWxsLnNldFRleHQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JCi0JU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgZXhhbXBsZSAyPC9USVRMRT48L0hFQUQ+PEJPRFk+PEgxPkhUTUwgZXhhbXBsZSAyPC9IMT4iOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCWh0bWwgKz0iPFA+VGhhdCBpcyBhIHRlc3QgbGluZSB3aXRoIHRoZSBudW1iZXIgIitpKyI8L1A+IjsKLQl9Ci0JaHRtbCArPSAiPC9CT0RZPjwvSFRNTD4iOwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLQlydW5Mb29wVGltZXIoMTApOwotCQotCXRyeSB7Ci0JCWJyb3dzZXIuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5zZXRVcmwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVybCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkKLQkvKiBUSElTIFRFU1QgUkVRVUlSRVMgV0VCIEFDQ0VTUyEgSG93IGVsc2UgY2FuIHdlIHJlYWxseSB0ZXN0IHRoZSBodHRwOi8vIHBhcnQgb2YgYSBicm93c2VyIHdpZGdldD8gKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QiKTsKLQlydW5Mb29wVGltZXIoMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9zdG9wIik7Ci0JLyogVEhJUyBURVNUIFJFUVVJUkVTIFdFQiBBQ0NFU1MhIEhvdyBlbHNlIGNhbiB3ZSByZWFsbHkgdGVzdCB0aGUgaHR0cDovLyBwYXJ0IG9mIGEgYnJvd3NlciB3aWRnZXQ/ICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0Iik7Ci0JcnVuTG9vcFRpbWVyKDEpOwotCWJyb3dzZXIuc3RvcCgpOwotCXJ1bkxvb3BUaW1lcigxMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcndhcmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFVybCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVmcmVzaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdG9wIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIikpIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIiKSkgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9iYWNrIikpIHRlc3RfYmFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3J3YXJkIikpIHRlc3RfZm9yd2FyZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VXJsIikpIHRlc3RfZ2V0VXJsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0JhY2tFbmFibGVkIikpIHRlc3RfaXNCYWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpKSB0ZXN0X2lzRm9yd2FyZEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZnJlc2giKSkgdGVzdF9yZWZyZXNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VXJsTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RvcCIpKSB0ZXN0X3N0b3AoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Ccm93c2VyIGJyb3dzZXI7Ci0KLXZvaWQgcnVuTG9vcFRpbWVyKGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JZmluYWwgYm9vbGVhbltdIGV4aXQgPSB7ZmFsc2V9OwotCW5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7VGhyZWFkLnNsZWVwKHNlY29uZHMgKiAxMDAwKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCWV4aXRbMF0gPSB0cnVlOwotCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0uc3RhcnQoKTsKLQlzaGVsbC5vcGVuKCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0Jd2hpbGUgKCFleGl0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDkzYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2Nsb3NlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTU3M2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JTG9jYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTG9jYXRpb25BZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JTG9jYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTG9jYXRpb25BZGFwdGVyKCkgewkKLQl9OwotCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihhZGFwdGVyKTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWNlMTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQkJCi0JfSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpKSB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NzcxYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5PcGVuV2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLk9wZW5XaW5kb3dMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3Rfb3BlbldpbmRvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhmZGUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCVByb2dyZXNzQWRhcHRlciBhZGFwdGVyID0gbmV3IFByb2dyZXNzQWRhcHRlcigpIHt9OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NBZGFwdGVyKCkge30pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjJiMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IikpIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzYjNmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViZTIyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZDI3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlZpc2liaWxpdHlXaW5kb3dBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IFZpc2liaWxpdHlXaW5kb3dBZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93QWRhcHRlcigpe30pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODQwNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY3YzViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkFuaW1hdGVkUHJvZ3Jlc3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQW5pbWF0ZWRQcm9ncmVzcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbGVhciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zdGFydCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0b3Agbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RvcCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhciIpKSB0ZXN0X2NsZWFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydCIpKSB0ZXN0X3N0YXJ0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdG9wIikpIHRlc3Rfc3RvcCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTZmZjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGMwYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCB0ZXh0OwotCWJvb2xlYW4gbGlzdGVuZXJDYWxsZWQ7CQotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQkJCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBpc0JpZGkoKSB7Ci0JcmV0dXJuIEJpZGlVdGlsLmlzQmlkaVBsYXRmb3JtKCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotcHJpdmF0ZSB2b2lkIHRlc3RMaXN0ZW5lcihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgaW50W10gc2VnbWVudHMsIGJvb2xlYW4gZXhjZXB0aW9uRXhwZWN0ZWQpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFNlZ21lbnRzKEJpZGlTZWdtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlICsgIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIDAsIGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIGluY29ycmVjdCBCaWRpU2VnbWVudEV2ZW50IiwgbGluZSwgZXZlbnQubGluZVRleHQpOwotCQkJCi0JCQlldmVudC5zZWdtZW50cyA9IHNlZ21lbnRzOwotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwkKLQkJfQotCX07Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkJCi0JdHJ5IHsKLQkJdGV4dC5hZGRCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JZmluYWxseSB7Ci0JCXRleHQucmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCWlmIChleGNlcHRpb25FeHBlY3RlZCkgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duID09IGZhbHNlKTsKLQl9Ci0JaWYgKGlzQmlkaSgpKSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgbGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsJCi0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci19Ci1wcml2YXRlIHZvaWQgdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKGZpbmFsIGludFtdIHNlZ21lbnRzLCBpbnRbXSBib2xkUmFuZ2VzKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlCaWRpU2VnbWVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEJpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTZWdtZW50cyhCaWRpU2VnbWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlhc3NlcnRFcXVhbHMoIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIDAsIGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJYXNzZXJ0RXF1YWxzKCIgaW5jb3JyZWN0IEJpZGlTZWdtZW50RXZlbnQiLCBsaW5lLCBldmVudC5saW5lVGV4dCk7Ci0JCQkKLQkJCWV2ZW50LnNlZ21lbnRzID0gc2VnbWVudHM7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7CQotCQl9Ci0JfTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0JCWZvciAoaW50IGk9MDsgaTxib2xkUmFuZ2VzLmxlbmd0aDsgaSs9MikgewotCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoYm9sZFJhbmdlc1tpXSwgYm9sZFJhbmdlc1tpKzFdLCBudWxsLCBudWxsLCBTV1QuQk9MRCk7Ci0JCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0JCX07Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWZpbmFsbHkgewotCQl0ZXh0LnJlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlhc3NlcnRUcnVlKCIgdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duID09IGZhbHNlKTsKLQlpZiAoaXNCaWRpKCkpIHsKLQkJYXNzZXJ0VHJ1ZSgiIGxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7CQotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiIGxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldFNlZ21lbnRzTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCgpIHsKLQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0KLQl0ZXh0LnNldFRleHQobGluZSk7CQotCS8vIHNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uCi0JdGVzdExpc3RlbmVyKCI6YToiLCBudWxsLCBmYWxzZSk7Ci0JdGVzdExpc3RlbmVyKCI6YjoiLCBuZXcgaW50W10gezAsIGxpbmVMZW5ndGggLyAyLCBsaW5lTGVuZ3RofSwgZmFsc2UpOwotCXRlc3RMaXN0ZW5lcigiOmM6IiwgbmV3IGludFtdIHswLCBsaW5lTGVuZ3RoIC8gMn0sIGZhbHNlKTsKLQkJCQotCS8vIHNob3VsZCBhbGwgY2F1c2UgYW4gZXhjZXB0aW9uIG9uIGEgYmlkaSBwbGF0Zm9ybQotCWlmIChpc0JpZGkoKSkgewotCQl0ZXN0TGlzdGVuZXIoIjpkOiIsIG5ldyBpbnRbXSB7bGluZUxlbmd0aCAvIDJ9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6ZToiLCBuZXcgaW50W10gezAsIDEsIDEsIGxpbmVMZW5ndGggLyAyfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmY6IiwgbmV3IGludFtdIHswLCAxLCAyLCBsaW5lTGVuZ3RoICsgMX0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpnOiIsIG5ldyBpbnRbXSB7MCwgMSwgbGluZUxlbmd0aCArIDEsIGxpbmVMZW5ndGggKyAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmg6IiwgbmV3IGludFtdIHswLCAyLCAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmk6IiwgbmV3IGludFtdIHswLCAtMSwgMn0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpqOiIsIG5ldyBpbnRbXSB7MCwgLTEsIDJ9LCB0cnVlKTsKLQl9Ci0KLQkvLyB0ZXN0IGJvbGQgc2VnbWVudGluZwotCWxpbmUgPSAidGhpcyBpcyBhIGxpbmUgd2l0aCA1MCBjaGFycyAtICoqKiogKioqKiAqKioqICoqKioiOwotCXRleHQuc2V0VGV4dChsaW5lKTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsMiwxMiwzLDIwLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1LDIwLDI1fSwgbmV3IGludFtdIHswLDUsNSwyLDEyLDMsMjAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDUsNSwxLDcsMywxMCwzLDE1LDUsMjAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTUsMjAsMjV9LCBuZXcgaW50W10gezAsNiw3LDYsMTUsMTB9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsNSwxMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MCwxNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1fSwgbmV3IGludFtdIHswLDV9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MiwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MiwzfSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsMn0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDV9LCBuZXcgaW50W10gezAsMn0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MTAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMiwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MTIsM30pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHszLDIsNSw1LDEwLDMsMjEsNCwyNSwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNSwyMCwyNSwzMH0sIG5ldyBpbnRbXSB7MywxMCwyMSw3fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezEwLDJ9Ci0JbGluZSA9ICJ0ZXN0MXRlc3QyL3IvbiI7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MTAsMn0pOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRTZWdtZW50c0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQiKSkgdGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzVhMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTcwZWM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm8KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY2NvbWJvID0gbmV3IENDb21ibyhzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGNjb21ibyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2xlYXJTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVzZWxlY3RBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rlc2VsZWN0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZHJlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFZGl0YWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0eWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRIZWlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRMaW1pdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRm9jdXNDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0ZvY3VzQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVkcmF3IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZHJhd0lJSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3RJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0YWJsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RW5hYmxlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGltaXRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFZpc2libGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdGFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbiIpKSB0ZXN0X2dldENoaWxkcmVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SGVpZ2h0IikpIHRlc3RfZ2V0VGV4dEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRhYmxlWiIpKSB0ZXN0X3NldEVkaXRhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIEN1c3RvbSAqLwotQ0NvbWJvIGNjb21ibzsKLQotcHJpdmF0ZSB2b2lkIGFkZCgpIHsKLSAgICBjY29tYm8uYWRkKCJ0aGlzIik7Ci0gICAgY2NvbWJvLmFkZCgiaXMiKTsKLSAgICBjY29tYm8uYWRkKCJTV1QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMzAsIGNjb21iby5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICAvL29uIGFycm93Ci0gICAgY29uc2lzdGVuY3lFdmVudChjY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgLy9vbiB0ZXh0Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg0ODMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxhYmVsID0gbmV3IENMYWJlbChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGxhYmVsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbGlnbm1lbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWxpZ25tZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9vbFRpcFRleHQiKSkgdGVzdF9nZXRUb29sVGlwVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIikpIHRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUNMYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTcyMTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFiSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BSaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wUmlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbnNlcnRNYXJrSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFiSGVpZ2h0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGFiSGVpZ2h0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFJpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKSkgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFiSGVpZ2h0IikpIHRlc3RfZ2V0VGFiSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BSaWdodCIpKSB0ZXN0X2dldFRvcFJpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrSVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFiSGVpZ2h0SSIpKSB0ZXN0X3NldFRhYkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBDVGFiRm9sZGVyIGN0YWJGb2xkZXI7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQljdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldChjdGFiRm9sZGVyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcihWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKGN0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJDVGFiSXRlbSAmIiArIGkpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJDVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQoY3RhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgQ1RhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChpdGVtVGV4dCk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbVRleHQsIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCWN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGN0YWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGN0YWJGb2xkZXIuZ2V0U2l6ZSgpLngvMiwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX0RPV04sIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDIpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX1VQLCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUywgZXZlbnRzLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCA3MCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5Y2RlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IikpIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3OTI4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0Jc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0MmVjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpKSB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGFkNmI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi0JQ1RhYkZvbGRlciBjVGFiRm9sZGVyOwotCUNUYWJJdGVtIGNUYWJJdGVtOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljVGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIFNXVC5OT05FKTsKLQljVGFiSXRlbSA9IG5ldyBDVGFiSXRlbShjVGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0Jc2V0V2lkZ2V0KGNUYWJJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc2FibGVkSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERpc2FibGVkSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb29sVGlwVGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKSkgdGVzdF9nZXREaXNhYmxlZEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2JmNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ29udHJvbEVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Db250cm9sRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RWRpdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9sYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdG9yIikpIHRlc3RfZ2V0RWRpdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDUwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5FeHRlbmRlZE1vZGlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTIzZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCgpIHsKLQlFeHRlbmRlZE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJc3dpdGNoKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MWI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoyYjoiLCBldmVudC5sZW5ndGggPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoyYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5sZW5ndGggPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjozYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJhIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NmE6IiwgZXZlbnQuc3RhcnQgPT0gMjEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NmI6IiwgZXZlbnQubGVuZ3RoID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXG5saW5lIDQiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3YToiLCBldmVudC5zdGFydCA9PSA1KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhhOiIsIGV2ZW50LnN0YXJ0ID09IDcpOwotCQkJCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubGVuZ3RoID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6OGM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWI6IiwgZXZlbnQubGVuZ3RoID09IDQpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTA6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMjogewotCQkJCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnN0YXJ0ID09IDMpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEzOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2E6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTU6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5zdGFydCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBldmVudC5sZW5ndGggPT0gNik7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTY6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxODogewotCQkJCQlhc3NlcnRUcnVlKCI6MThhOiIsIGV2ZW50LnN0YXJ0ID09IDMpOwotCQkJCQlhc3NlcnRUcnVlKCI6MThiOiIsIGV2ZW50Lmxlbmd0aCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWE6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWI6IiwgZXZlbnQubGVuZ3RoID09IDcpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTljOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYjoiLCBldmVudC5sZW5ndGggPT0gMTYpOwotCQkJCQlhc3NlcnRUcnVlKCI6MjFjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQlzdHlsZWRUZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQotCWJvb2xlYW4gZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCXZlcmlmeSA9IDM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gNDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjo0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JdmVyaWZ5ID0gNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCXZlcmlmeSA9IDY7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQl2ZXJpZnkgPSA3OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQl2ZXJpZnkgPSA4OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gOTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxMDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDExOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjExOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQl2ZXJpZnkgPSAxMzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTY7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNjogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMTc7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNzogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotIAlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQl2ZXJpZnkgPSAxODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMjA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MjA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMjE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCIpKSB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTc2NTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lQmFja2dyb3VuZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGY5NzdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KCkgewotCUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldEJhY2tncm91bmQoTGluZUJhY2tncm91bmRFdmVudCBldmVudCkgewotCQkJYXNzZXJ0VHJ1ZSgiOjE6IiwgZXZlbnQubGluZU9mZnNldD09MCk7Ci0JCQlhc3NlcnRUcnVlKCI6MjoiLGV2ZW50LmxpbmVUZXh0LmVxdWFscygiMDEyMzQ1Njc4OSIpKTsKLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQkvLyBmb3JjZSBnZXQgbGluZSBiZyBjYWxsYmFjawotCXN0eWxlZFRleHQuc2VsZWN0QWxsKCk7Ci0Jc3R5bGVkVGV4dC5jb3B5KCk7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCIpKSB0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDU1OGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzdmMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoKSB7Ci0JTGluZVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQkJYXNzZXJ0VHJ1ZSgiOjE6IiwgZXZlbnQubGluZU9mZnNldD09MCk7Ci0JCQlhc3NlcnRUcnVlKCI6MjoiLGV2ZW50LmxpbmVUZXh0LmVxdWFscygiMDEyMzQ1Njc4OSIpKTsKLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JLy8gZm9yY2UgZ2V0IGxpbmUgc3R5bGVzIGNhbGxiYWNrCi0Jc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDUpOwotCXN0eWxlZFRleHQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQiKSkgdGVzdF9saW5lR2V0U3R5bGVMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5MjAyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Qb3B1cExpc3QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uUG9wdXBMaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1XaWR0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbmltdW1XaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bVdpZHRoSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtV2lkdGgiKSkgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZWxlY3RMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1XaWR0aEkiKSkgdGVzdF9zZXRNaW5pbXVtV2lkdGhJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZDIzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gdGVzdCB0aGlzLCBTVCBpcyBjb25zdGFudHMgY2xhc3MKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcxNTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltaXplZENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltaXplZENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZW50YXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXZWlnaHRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXZWlnaHRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0T3JpZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2VpZ2h0cyRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXZWlnaHRzJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltaXplZENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXZWlnaHRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXZWlnaHRzJEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIikpIHRlc3RfZ2V0TWF4aW1pemVkQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2VpZ2h0cyIpKSB0ZXN0X2dldFdlaWdodHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdlaWdodHMkSSIpKSB0ZXN0X3NldFdlaWdodHMkSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzY0YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWx3YXlzU2hvd1Njcm9sbEJhcnMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWdpbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZ2luIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRWZXJ0aWNhbFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5IZWlnaHRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5IZWlnaHRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluU2l6ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5TaXplSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbldpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmlnaW5JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmlnaW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kVmVydGljYWxaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5IZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5TaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5XaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWdpbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIikpIHRlc3RfZ2V0QWx3YXlzU2hvd1Njcm9sbEJhcnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRlbnQiKSkgdGVzdF9nZXRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmlnaW4iKSkgdGVzdF9nZXRPcmlnaW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1oiKSkgdGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFoiKSkgdGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kVmVydGljYWxaIikpIHRlc3Rfc2V0RXhwYW5kVmVydGljYWxaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluSGVpZ2h0SSIpKSB0ZXN0X3NldE1pbkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pblNpemVJSSIpKSB0ZXN0X3NldE1pblNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluV2lkdGhJIikpIHRlc3Rfc2V0TWluV2lkdGhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmlnaW5JSSIpKSB0ZXN0X3NldE9yaWdpbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjBkNGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDFlOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JZmluYWwgc3RhdGljIFJHQiBSRUQgPSBuZXcgUkdCKDI1NSwwLDApOwotCWZpbmFsIHN0YXRpYyBSR0IgQkxVRSA9IG5ldyBSR0IoMCwwLDI1NSk7Ci0JZmluYWwgc3RhdGljIFJHQiBHUkVFTiA9IG5ldyBSR0IoMCwyNTUsMCk7Ci0JSGFzaHRhYmxlIGNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcml2YXRlIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQlyZXR1cm4gKENvbG9yKWNvbG9ycy5nZXQocmdiKTsKLX0KLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JY29sb3JzLnB1dChSRUQsIG5ldyBDb2xvciAoZGlzcGxheSwgUkVEKSk7Ci0JY29sb3JzLnB1dChHUkVFTiwgbmV3IENvbG9yIChkaXNwbGF5LCBHUkVFTikpOwotCWNvbG9ycy5wdXQoQkxVRSwgbmV3IENvbG9yIChkaXNwbGF5LCBCTFVFKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWluaXRpYWxpemVDb2xvcnMoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JRW51bWVyYXRpb24gZWxlbWVudHMgPSBjb2xvcnMua2V5cygpOwotCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlDb2xvciBjb2xvciA9IChDb2xvciljb2xvcnMuZ2V0KChSR0IpZWxlbWVudHMubmV4dEVsZW1lbnQoKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDApOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDApOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UuZm9yZWdyb3VuZCA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLmJhY2tncm91bmQgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULk5PUk1BTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5zdGFydCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLmxlbmd0aCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULk5PUk1BTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDUpOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmZvcmVncm91bmQgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5iYWNrZ3JvdW5kID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQiA9IChTdHlsZVJhbmdlKXN0eWxlUmFuZ2VBLmNsb25lKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VCKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VDID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKEJMVUUpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTEsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRiA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihSRUQpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRyA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VCKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VDKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VGKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VHKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JQ29sb3IgdGVzdENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAwLCAwLCAwKTsKLQkKLQkvL3JlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMwOTI0Ci0Jc2V0LmFkZChuZXcgU3R5bGVSYW5nZSgpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgbnVsbCkpOwotCXNldC5hZGQobmV3IFN0eWxlUmFuZ2UoMCwgMSwgdGVzdENvbG9yLCB0ZXN0Q29sb3IpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgdGVzdENvbG9yLCBTV1QuQk9MRCkpOwotCXRlc3RDb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNVbnN0eWxlZCgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQyA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRCA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzdHlsZVJhbmdlQS5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIXN0eWxlUmFuZ2VCLmlzVW5zdHlsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwhc3R5bGVSYW5nZUMuaXNVbnN0eWxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCFzdHlsZVJhbmdlRC5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlUmFuZ2VFLmlzVW5zdHlsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VCID0gbmV3IFN0eWxlUmFuZ2UoNSwgNSwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUMgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKFJFRCksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUYgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUIpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUMpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCAhc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgIXN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlRSkpOwotCWFzc2VydFRydWUoIjpmOiIsICFzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUYpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgbnVsbCwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCXN0eWxlUmFuZ2UudG9TdHJpbmcoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvbmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNVbnN0eWxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JJIikpIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvbmUiKSkgdGVzdF9jbG9uZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNVbnN0eWxlZCIpKSB0ZXN0X2lzVW5zdHlsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NpbWlsYXJUb0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zaW1pbGFyVG9Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjVhZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLVN0eWxlZFRleHQgdGV4dDsKLWZpbmFsIHN0YXRpYyBSR0IgUkVEID0gbmV3IFJHQigyNTUsMCwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgQkxVRSA9IG5ldyBSR0IoMCwwLDI1NSk7Ci1maW5hbCBzdGF0aWMgUkdCIEdSRUVOID0gbmV3IFJHQigwLDI1NSwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgWUVMTE9XID0gbmV3IFJHQigyNTUsMjU1LDApOwotZmluYWwgc3RhdGljIFJHQiBDWUFOID0gbmV3IFJHQigwLDI1NSwyNTUpOwotZmluYWwgc3RhdGljIFJHQiBQVVJQTEUgPSBuZXcgUkdCKDI1NSwwLDI1NSk7Ci1maW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX0xJTkVfREVMSU1JVEVSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotSGFzaHRhYmxlIGNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsJCi1wcml2YXRlIGJvb2xlYW4gbGlzdGVuZXIyQ2FsbGVkOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWluaXRpYWxpemVDb2xvcnMoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCUVudW1lcmF0aW9uIGVsZW1lbnRzID0gY29sb3JzLmtleXMoKTsKLQl3aGlsZSAoZWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpY29sb3JzLmdldCgoUkdCKWVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotCXN1cGVyLnRlYXJEb3duKCk7Ci0JCi19Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0eWxlUmFuZ2VbXSBkZWZhdWx0U3R5bGVzKCkgewotCXJldHVybiBuZXcgU3R5bGVSYW5nZVtdIHsKLQkJZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCWdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTiksIAotCQlnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcm90ZWN0ZWQgdm9pZCBnZXRMaW5lQmFja2dyb3VuZHMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPHRleHQuZ2V0TGluZUNvdW50KCk7IGkrKykgewotCQl0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKGkpOwotCX0KLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0cmluZyB0ZXh0U3RyaW5nKCkgewotCXJldHVybiAiVGhpcyBpcyB0aGUgdGV4dCBjb21wb25lbnQgaW4gdGVzdGluZ1xuTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0LiI7Ci19Ci1wcml2YXRlIGJvb2xlYW4gaXNCaWRpKCkgewotCXJldHVybiBCaWRpVXRpbC5pc0JpZGlQbGF0Zm9ybSgpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgU3R5bGVSYW5nZSBnZXRTdHlsZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIFJHQiBmZywgUkdCIGJnKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUuc3RhcnQgPSBzdGFydDsKLQlzdHlsZS5sZW5ndGggPSBsZW5ndGg7Ci0JaWYgKGZnICE9IG51bGwpIHN0eWxlLmZvcmVncm91bmQgPSBnZXRDb2xvcihmZyk7Ci0JZWxzZSBzdHlsZS5mb3JlZ3JvdW5kID0gbnVsbDsKLQlpZiAoYmcgIT0gbnVsbCkgc3R5bGUuYmFja2dyb3VuZCA9IGdldENvbG9yKGJnKTsKLQllbHNlIHN0eWxlLmJhY2tncm91bmQgPSBudWxsOwotCXJldHVybiBzdHlsZTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQlyZXR1cm4gKENvbG9yKWNvbG9ycy5nZXQocmdiKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sb3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCWNvbG9ycy5wdXQoUkVELCBuZXcgQ29sb3IgKGRpc3BsYXksIFJFRCkpOwotCWNvbG9ycy5wdXQoQkxVRSwgbmV3IENvbG9yIChkaXNwbGF5LCBCTFVFKSk7Ci0JY29sb3JzLnB1dChHUkVFTiwgbmV3IENvbG9yIChkaXNwbGF5LCBHUkVFTikpOwotCWNvbG9ycy5wdXQoWUVMTE9XLCBuZXcgQ29sb3IgKGRpc3BsYXksIFlFTExPVykpOwotCWNvbG9ycy5wdXQoQ1lBTiwgbmV3IENvbG9yIChkaXNwbGF5LCBDWUFOKSk7Ci0JY29sb3JzLnB1dChQVVJQTEUsIG5ldyBDb2xvciAoZGlzcGxheSwgUFVSUExFKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpewotCVN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuUkVBRF9PTkxZKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuZGlzcG9zZSgpOwotCi0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFZlcnRpY2FsQmFyKCkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsQmFyKCkgPT0gbnVsbCk7Ci0JdGV4dC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLmxlbmd0aCgpLCBldmVudC5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCAiIiwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYW4gRXh0ZW5kZWRNb2RpZnkgZXZlbnQKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5zdWJzdHJpbmcoMCwgMSksIGV2ZW50LnJlcGxhY2VkVGV4dCk7Ci0JCX0KLQl9OwotCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSArIGxpbmUuc3Vic3RyaW5nKDEsIGxpbmUubGVuZ3RoKCkpICsgbGluZSwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRLZXlCaW5kaW5nSUkoKXsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCwgU1dULk5VTEwpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTV1QuTlVMTCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNULkxJTkVfVVApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5MSU5FX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuU0VMRUNUX1BBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlBBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZygtMSwgU1QuUEFHRV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKC0xLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JQmlkaVNlZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBCaWRpU2VnbWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U2VnbWVudHMoQmlkaVNlZ21lbnRFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgQmlkaVNlZ21lbnRMaXN0ZW5lci4gCi0JdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCWlmIChpc0JpZGkoKSB8fCBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImd0ayIpKSB7Ci0JCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBjYWxsZWQgd2hlbiBpdCBzaG91bGRuJ3QgYmUiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBCaWRpU2VnbWVudExpc3RlbmVyLiAKLQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTGluZUJhY2tncm91bmRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5lQmFja2dyb3VuZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0QmFja2dyb3VuZChMaW5lQmFja2dyb3VuZEV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUxpbmVTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYSBNb2RpZnkgZXZlbnQJCi0JdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuYXBwZW5kKGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJhcHBlbmQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXIyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWxpc3RlbmVyMkNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9FTkQpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgY2FsbGVkIHVuZXhwZWN0ZWRseSIsIGxpc3RlbmVyMkNhbGxlZCA9PSBmYWxzZSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQlsaXN0ZW5lcjJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBjYWxsZWQgdW5leHBlY3RlZGx5IiwgbGlzdGVuZXIyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JVmVyaWZ5S2V5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCi0JLy8gb25seSB0ZXN0IHdoZXRoZXIgbGlzdGVuZXIgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkLgotCS8vIGNhbid0IHRlc3QgbGlzdGVuZXIgYmVjYXVzZSBWZXJpZnlLZXkgaXMgdXNlciBkcml2ZW4uCi0JdGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQlmaW5hbCBTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiTmV3TGluZTEiOwotCWZpbmFsIGludCB0ZXh0TGVuZ3RoOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JVmVyaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnN0YXJ0ID0gMjsKLQkJCWV2ZW50LmVuZCA9IDU7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIHNlbmRzIGEgVmVyaWZ5IGV2ZW50Ci0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuYXBwZW5kKGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJhcHBlbmQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUgKyBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAxLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5zdGFydCA9IDI7Ci0JCQlldmVudC5lbmQgPSA1OwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHRMZW5ndGggPSB0ZXh0LmdldENoYXJDb3VudCgpIC0gMSArIG5ld0xpbmUubGVuZ3RoKCk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lICsgbmV3TGluZS5zdWJzdHJpbmcoMSwgbmV3TGluZS5sZW5ndGgoKSkgKyBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCB0ZXh0TGVuZ3RoLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5zdGFydCA9IDI7Ci0JCQlldmVudC5lbmQgPSA1OwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMiwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbmV3TGluZS5sZW5ndGgoKSwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgdGV4dC5nZXRDaGFyQ291bnQoKSAtIDIsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93bjsJCi0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCQotCXRleHQuYXBwZW5kKGxpbmUpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIHRvIGVtcHR5IHRleHQiLCBsaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5hcHBlbmQobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoImFwcGVuZCBudWxsIHN0cmluZyIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQl0ZXh0LmFwcGVuZCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgZW1wdHkgc3RyaW5nIiwgbGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCQotCXRleHQuYXBwZW5kKGxpbmUpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIG5vbi1lbXB0eSBzdHJpbmciLCBsaW5lICsgbGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JU3RyaW5nIHRleHQyID0gImxpbmVcciI7Ci0JdGV4dC5hcHBlbmQodGV4dDIpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIHN0cmluZyBlbmRpbmcgd2l0aCBsaW5lIGRlbGltaXRlciIsIHRleHQyLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JU3RyaW5nIHRleHQzID0gImxpbmVcclxubGluZTMiOwotCXRleHQuYXBwZW5kKHRleHQzKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBtdWx0aSBsaW5lIHN0cmluZyIsIHRleHQyICsgdGV4dDMsIHRleHQuZ2V0VGV4dCgpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gaW5oZXJpdGVkIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjbGlwYm9hcmRUZXh0OwotCVN0cmluZyBjb252ZXJ0ZWRUZXh0OwotCi0JU3RyaW5nIGJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmNvcHkoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgYmVmb3JlID09IG51bGwgPyBjbGlwYm9hcmRUZXh0ID09IG51bGwgOiBiZWZvcmUuZXF1YWxzKGNsaXBib2FyZFRleHQpKTsKLQkKLQliZWZvcmUgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpjOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDEpOwotCXRleHQuY29weSgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjAiKSk7Ci0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAyKTsJCi0JdGV4dC5jb3B5KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjEyIikpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiXHJMaW5lMVxuTGluZTJcclxuTGluZTNcblxyTGluZTRcbiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXHJcbkxpbmUxXHJcbkxpbmUyXHJcbkxpbmUzXHJcblxyXG5MaW5lNFxyXG4iOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJcbkxpbmUxXG5MaW5lMlxuTGluZTNcblxuTGluZTRcbiI7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCi0JdGVzdFJ0ZkNvcHkoKTsKLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZCh0ZXh0LmdldERpc3BsYXkoKSk7Ci0JVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nIGNsaXBib2FyZFRleHQ7Ci0JU3RyaW5nIGNvbnZlcnRlZFRleHQ7Ci0KLQlTdHJpbmcgYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY3V0KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjphOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0JCi0JYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY3V0KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpjOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDEpOwotCXRleHQuY3V0KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpkOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscygiMCIpKTsKLQkKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDEsIDIpOwkKLQl0ZXh0LmN1dCgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIyMyIpKTsKLQkKLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQl0ZXh0LnNldFRleHQoIlxyTGluZTFcbkxpbmUyXHJcbkxpbmUzXG5cckxpbmU0XG4iKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY3V0KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXHJcbkxpbmUxXHJcbkxpbmUyXHJcbkxpbmUzXHJcblxyXG5MaW5lNFxyXG4iOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJcbkxpbmUxXG5MaW5lMlxuTGluZTNcblxuTGluZTRcbiI7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jdXQoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjpnOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJpZGlDb2xvcmluZygpIHsKLQkvLy8gZ2V0QmlkaUNvbG9yaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QmlkaUNvbG9yaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsICJMaW5lMSIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQlTdHJpbmcgbmV3VGV4dCA9ICJMaW5lLTFcclxuIjsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAxKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IG5ld1RleHQubGVuZ3RoKCkgKyAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSB0ZXh0LmdldENvbnRlbnQoKTsKLQkKLQlhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7Ci0JY29udGVudCA9IG5ldyBTdHlsZWRUZXh0Q29udGVudCgpIHsKLQkJcHVibGljIHZvaWQgYWRkVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl9Ci0JfTsKLQl0ZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIHRleHQuZ2V0Q29udGVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFZGl0YWJsZSgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvcml6b250YWxJbmRleCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsJCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCg1MDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLQkvLyBtYWtlIHN1cmUgdGhlIHdpZGdldCBjYW4gYmUgc2Nyb2xsZWQKLQlzaGVsbC5vcGVuKCk7Ci0JdGV4dC5zZXRTaXplKDEwLCA1MCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsKCkgewkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsJCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID4gMCk7Ci0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEtleUJpbmRpbmdJKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5ERUxFVEVfTkVYVCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNULkxJTkVfVVApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5MSU5FX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuU0VMRUNUX1BBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0S2V5QmluZGluZygtMSkgPT0gU1dULk5VTEwpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuRjIpID09IFNXVC5OVUxMKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyQ291bnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSA1KTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSA2KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQmFja2dyb3VuZEkoKSB7Ci0JU3RyaW5nIHRleHRTdHJpbmcgPSAiTDFcbkwyXG5MM1xuTDQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoQkxVRSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVDb3VudCgpIHsKLQlTdHJpbmcgZGVsaW1pdGVyU3RyaW5nID0gIlxyXG4iOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTEpOwotCXRleHQuYXBwZW5kKCJkZGRhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0yKTsKLQl0ZXh0LmFwcGVuZCgiZGRhc2Rhc2Rhc2Rhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0zKTsKLQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTEpOwotCXRleHQuaW5zZXJ0KGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Mik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCXRyeSB7Ci0JCXRleHQuZ2V0TGluZUF0T2Zmc2V0KC0xKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpiOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0cnkgewotCQl0ZXh0LmdldExpbmVBdE9mZnNldCgxMDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDYpID09IDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0TGluZUF0T2Zmc2V0KDcpID09IDEpOwotCXRyeSB7Ci0JCXRleHQuZ2V0TGluZUF0T2Zmc2V0KDgpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSAiXG4iOwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSB0ZXh0LmdldENvbnRlbnQoKTsKLQkKLQlhc3NlcnRFcXVhbHMoY29udGVudC5nZXRMaW5lRGVsaW1pdGVyKCksIHRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLQotCWNvbnRlbnQgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl9Ci0JfTsKLQl0ZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmVEZWxpbWl0ZXIsIHRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkoKXsKLQkvLyBjb3B5IGZyb20gU3R5bGVkVGV4dCwgaGFzIHRvIG1hdGNoIHZhbHVlIHVzZWQgYnkgU3R5bGVkVGV4dAotCWZpbmFsIGludCBYSU5TRVQgPSBpc0JpZGkoKSA/IDIgOiAwOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS5lcXVhbHMobmV3IFBvaW50KFhJTlNFVCwgMCkpKTsKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBvZmZzZXQgPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIG9mZnNldCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMSIpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueCA+IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDQpLnkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDYpLnggPiAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg2KS55ID09IDApOwotCS8vIHggbG9jYXRpb24gd2lsbCA9PSBTdHlsZWRUZXh0IHggaW5zZXQgb24gYmlkaSBwbGF0Zm9ybXMKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueCA9PSBYSU5TRVQgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnkgPiAwKTsKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMTMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIG9mZnNldCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg0KS54ID4gMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueSA8IDApOwotCS8vIHggbG9jYXRpb24gd2lsbCA9PSBTdHlsZWRUZXh0IHggaW5zZXQgb24gYmlkaSBwbGF0Zm9ybXMJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnggPT0gWElOU0VUICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS55ID09IDApOwotCQotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS54IDwgMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkueSA8IDApOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS54IDwgMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMCwgdGV4dC5nZXRPZmZzZXRBdExpbmUoMCkpOwotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMaW5lKC0xKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpiOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExpbmUoMTAwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsJCi0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCB0ZXh0LmdldE9mZnNldEF0TGluZSgwKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCA3LCB0ZXh0LmdldE9mZnNldEF0TGluZSgxKSk7Ci0KLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TGluZSgyKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwkKLQlhc3NlcnRFcXVhbHMoIjpnOiIsIDAsIHRleHQuZ2V0T2Zmc2V0QXRMaW5lKDApKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlQb2ludCBsb2NhdGlvbjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKSA9PSAwKTsKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KC0xLCAwKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YjoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgwLCAtMSkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTEiKTsJCi0JbG9jYXRpb24gPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgxMCwgMCkpID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChsb2NhdGlvbi54IC0gMSwgMCkpID09IDQpOwotCWxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obG9jYXRpb24pID09IDcpOwotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMTAwLCAwKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDEwMCwgNTApKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpoOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgwLCAtNSkpID09IDApOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpID09IDcpOwotCQotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoLTUsIC01KSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmw6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgtNSwgMCkpID09IDcpOwotCi0JLy8gMUdMNFpWRQotCWFzc2VydFRydWUoIjptOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbih0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMikpID09IDIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDApOwotCWFzc2VydFRydWUoIjpuOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbih0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMikpID09IDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWVudGF0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRPcmllbnRhdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAyKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAzKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDExKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDMsIDExKSkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoNCwgNCkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDExLCAxMSkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsJCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgIT0gbnVsbCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpID09ICBnZXRDb2xvcihZRUxMT1cpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKSAhPSBudWxsKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQoZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgPT0gIGdldENvbG9yKFJFRCkpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZSgpIHsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBpbnZhbGlkUmFuZ2VzIFtdW10gPSB7ey0xLCAwfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxMiwgMX0sIHsxMSwgMn0sIHsyLCAtM30sIHs1MCwgLTF9fTsKLQlpbnQgc2VsZWN0aW9uUmFuZ2VzIFtdW10gPSB7ezAsIDF9LCB7MCwgMH0sIHsyLCAzfSwgezEyLCAwfSwgezIsIC0yfSwgezUsIC0xfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSAwICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25SYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzFdOwotCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQlpZiAobGVuZ3RoIDwgMCkgewotCQkJc3RhcnQgKz0gbGVuZ3RoOwotCQkJbGVuZ3RoICo9IC0xOwotCQkJYXNzZXJ0RXF1YWxzKCI6YzphOiIgKyBpLCBzdGFydCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmM6YToiICsgaSwgc3RhcnQgKyBsZW5ndGgsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7CQkJCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IGxlbmd0aCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09OSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzXG40NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEyKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25UZXh0KCkgewotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IHNlbGVjdGlvblJhbmdlcyBbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgM30sIHsxMiwgMH19OwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCAiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25SYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzFdOwotCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjpjOiIgKyBpLCB0ZXN0VGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKSwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgc3R5bGVTdGFydCA9IDA7Ci0JaW50IHN0eWxlTGVuZ3RoID0gNTsKLQlpbnQgaTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShzdHlsZVN0YXJ0LCBzdHlsZUxlbmd0aCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKFJFRCksIFNXVC5CT0xEKTsKLQotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBubyB0ZXh0IiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuc2V0VGV4dChsaW5lKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgtMSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJvZmZzZXQgb3V0IG9mIHJhbmdlIG5lZ2F0aXZlIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGxpbmUubGVuZ3RoKCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBwb3NpdGl2ZSIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQlmb3IgKGkgPSBzdHlsZVN0YXJ0OyBpIDwgc3R5bGVTdGFydCArIHN0eWxlTGVuZ3RoOyBpKyspIHsKLQkJc3R5bGUuc3RhcnQgPSBpOwotCQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpKTsKLQkJCQotCS8vIHRlc3Qgb2Zmc2V0IGF0IGxpbmUgZGVsaW1pdGVyCi0Jc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSg1LCAyLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQlzdHlsZS5sZW5ndGggPSAxOwotCWFzc2VydEVxdWFscyhzdHlsZSwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoNSkpOwotCXN0eWxlLnN0YXJ0ID0gNjsKLQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDYpKTsJCi0JYXNzZXJ0RXF1YWxzKG51bGwsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGVSYW5nZXMoKSB7Ci0JdGV4dC5zZXRUZXh0KCJwYWNrYWdlIHRlc3Q7XG4vKiBMaW5lIDFcbiAqIExpbmUgMlxuICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDcsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE0LDIzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDYsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ1LDUsQkxVRSxudWxsKSk7Ci0gCXRleHQucmVwbGFjZVRleHRSYW5nZSgxNCwgMjMsICJcdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi8iKTsKLSAJU3RyaW5nIG5ld1RleHQgPSB0ZXh0LmdldFRleHRSYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBuZXdUZXh0LmVxdWFscygicGFja2FnZSB0ZXN0O1xuXHQvKkxpbmUgMVxuXHQgKiBMaW5lIDJcblx0ICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpKTsKLQlTdHlsZVJhbmdlW10gc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDcsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDAsNixCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg0Nyw1LEJMVUUsbnVsbCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlc0lJKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotLy8JMAotLy8JIDEyMzQKLS8vCSA1NgotLy8JIDc4Ci0vLwk5Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpOwotCi0JU3R5bGVSYW5nZVtdIHN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCwxKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCw1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSw0LEJMVUUsbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDcsMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMTApOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDQsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNywyLFlFTExPVyxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCw0KTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwzLEJMVUUsbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDIsNik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDIsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg3LDEsWUVMTE9XLG51bGwpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODlcclxuQUJDREVGR0hJSktMIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw1LFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDE1LDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygxNSwwKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMjApOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNyw1LFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcyg4LDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDgsMixSRUQsbnVsbCkpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYnMoKSB7Ci0JdGV4dC5zZXRUYWJzKDEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGFicygpID09IDEpOwotCXRleHQuc2V0VGFicyg4KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQl0ZXh0LnNldFRleHQoIkxpbmVcdDFcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JdGV4dC5zZXRUYWJzKDcpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGFicygpID09IDcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHModGVzdFRleHQpKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQgKyAiXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCArICJcclxuIikpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dElJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IGludmFsaWRSYW5nZXNbXVtdID0ge3stMSwgMH0sIHswLCAtMX0sIHstMSwgLTF9LCB7MTAwLCAxfSwgezEwMCwgLTF9LCB7MiwgdGVzdFRleHQubGVuZ3RoKCl9LCB7NSwgMn19OwotCWludCByYW5nZXNbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgNX0sIHs3LCAxMX19OwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHQoc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIjphOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQkKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IHJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IHJhbmdlc1tpXVsxXTsKLQkJYXNzZXJ0RXF1YWxzKCI6YjoiICsgaSwgdGVzdFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQgKyAxKSwgdGV4dC5nZXRUZXh0KHN0YXJ0LCBlbmQpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dChzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgwLDApLmVxdWFscygidCIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoMCwxKS5lcXVhbHMoInRlIikpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgxLDUpLmVxdWFscygiZXN0aW4iKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgaW52YWxpZFJhbmdlc1tdW10gPSB7ey0xLCAwfSwgezAsIC0xfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxLCB0ZXN0VGV4dC5sZW5ndGgoKX0sIHs1LCAtMX19OwotCWludCByYW5nZXNbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7NSwgMX0sIHs3LCA1fSwgezEyLCAwfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dFJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCI6YToiLCBleGNlcHRpb25UaHJvd24pOwotCX0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSByYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSByYW5nZXNbaV1bMV07Ci0JCWFzc2VydEVxdWFscygiOmI6IiArIGksIHRlc3RUZXh0LnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW5ndGgpLCB0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0UmFuZ2UoMCwxKS5lcXVhbHMoInQiKSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMikuZXF1YWxzKCJ0ZSIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHRSYW5nZSgxLDUpLmVxdWFscygiZXN0aW4iKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dExpbWl0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPCAwKTsKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcFBpeGVsKCkgewotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTBhXHJcbiIpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFdvcmRXcmFwKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JU3RyaW5nIGRlbGltaXRlclN0cmluZyA9ICJcbiI7Ci0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiZnJoZWxtdXRlZCIpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09MSk7Ci0JdGV4dC5pbnNlcnQoZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0yKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VBY3Rpb25JKCkgewotCS8vIGludm9raW5nIGFjdGlvbnMgb24gYW4gZW1wdHkgdGV4dCBzaG91bGQgbm90IGNyYXNoCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9ET1dOKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1VQKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX1BSRVZJT1VTKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9FTkQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX1NUQVJUKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX0VORCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldJTkRPV19TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0RPV04pOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9QUkVWSU9VUyk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1BBR0VfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dPUkRfUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9URVhUX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1RFWFRfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DVVQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNPUFkpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBU1RFKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkRFTEVURV9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5UT0dHTEVfT1ZFUldSSVRFKTsKLQotCS8vU29tZSBwbGF0Zm9ybXMgY29uc2lkZXIgbnVtYmVyIGEgd29yZCBzdGFydCwgb3RoZXIgZG9uJ3QgIAotLy8JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwkJCi0JdGV4dC5zZXRUZXh0KCJMaW5lTFxyXG5MaW5lVyIpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKDcsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoOCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfVVApOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsJCi0JYXNzZXJ0RXF1YWxzKDcsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX1BSRVZJT1VTKTsJCi0JYXNzZXJ0RXF1YWxzKDUsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX0VORCk7CQotCWFzc2VydEVxdWFscyh0ZXh0LmdldENoYXJDb3VudCgpLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX0VORCk7CQotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX1NUQVJUKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7CQotCWFzc2VydEVxdWFscygiTGluZUxcclxuIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1VQKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMXHJcbkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiTCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fTkVYVCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV09SRF9QUkVWSU9VUyk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX05FWFQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9FTkQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9TVEFSVCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lTFxyXG4iLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV0lORE9XX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DVVQpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09QWSk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFTVEUpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiArIFBMQVRGT1JNX0xJTkVfREVMSU1JVEVSLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuREVMRVRFX05FWFQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5UT0dHTEVfT1ZFUldSSVRFKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpewotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY29udmVydGVkVGV4dDsKLQotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IngifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQkKLQl0ZXh0LmNvcHkoKTsJCi0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDEpOwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCXRleHQucGFzdGUoKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAyKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMSk7Ci0JdGV4dC5jb3B5KCk7CQotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIjAwMTIzNDU2Nzg5IikpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMSwgMik7CQotCXRleHQuY29weSgpOwkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIjAxIikpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJcckxpbmUxXG5MaW5lMlxyXG5MaW5lM1xuXHJMaW5lNFxuIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJcclxuTGluZTFcclxuTGluZTJcclxuTGluZTNcclxuXHJcbkxpbmU0XHJcbiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxuTGluZTFcbkxpbmUyXG5MaW5lM1xuXG5MaW5lNFxuIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0ZXh0LmdldFRleHQoKS5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJMaW5lMVxyXG5MaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IkxpbmUxXHJMaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsiTGluZTFcbkxpbmUyIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50KCkgewotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHJldHVybjsKLQkKLQkvKiBXZSBkb24ndCByZWFsbHkgd2FudCB0byBydW4gdGhpcyB0ZXN0LCBiZWNhdXNlIGl0IHdhc3RlcyBwYXBlci4KLQkgKiBBbG1vc3QgYWxsIG9mIHRoZSBwcmludCgpIG1ldGhvZCBpcyB0ZXN0ZWQgaW4gcHJpbnQoUHJpbnRlciksIGJlbG93LgotCSAqLwotLy8JdGV4dC5wcmludCgpOwotLy8JdGV4dC5zZXRUZXh0KCJMaW5lMSIpOwotLy8JdGV4dC5wcmludCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKCkgewotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHJldHVybjsKLQotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5wcmludChudWxsKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9CQotCWFzc2VydFRydWUoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHByaW50KG51bGwpIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcigpOwotCXRleHQucHJpbnQocHJpbnRlcik7IC8vIGRvbid0IHJ1biB0aGUgcnVubmFibGUsIHRvIHNhdmUgcGFwZXIKLQl0ZXh0LnNldFRleHQoIkxpbmUxIik7Ci0JdGV4dC5wcmludChwcmludGVyKTsgLy8gZG9uJ3QgcnVuIHRoZSBydW5uYWJsZSwgdG8gc2F2ZSBwYXBlcgotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3KCkgewotCS8vIGluaGVyaXRlZCB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXdJSUlJWigpIHsKLQkvLyBpbmhlcml0ZWQgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3UmFuZ2VJSVooKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgdHJ1ZSk7Ci0JdGV4dC5yZWRyYXdSYW5nZSgwLCAwLCBmYWxzZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCB0cnVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIGZhbHNlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoLTEsIDIsIHRydWUpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoLTEsIDIsIGZhbHNlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgZmFsc2UpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMSwgZmFsc2UpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDgsIDIsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoOCwgMiwgZmFsc2UpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAwLCB0cnVlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSgxMCwgMCwgZmFsc2UpOwkKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoMTAsIDEsIHRydWUpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAxLCBmYWxzZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcgotfQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlU3R5bGVSYW5nZXNJSSRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCkgewotCVN0eWxlUmFuZ2VbXSBzdHlsZXM7Ci0JU3RyaW5nIHRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIG5ldyBTdHlsZVJhbmdlW10ge30pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgbmV3IFN0eWxlUmFuZ2VbXSB7fSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBObyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3R5bGVzCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0OCwgNSwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gcGFydGlhbAotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTAsIDEwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDUpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIwLDI4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgbmV3IFN0eWxlUmFuZ2VbXSB7fSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gZnVsbAotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNTgsIDEwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGVuZCBvZiBvbmUgc3R5bGUKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDM4LCAxNSwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBiZWdpbm5pbmcgb2Ygb25lIHN0eWxlCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1MCwgMTAsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjAsOCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIGNvbXBsZXRlIHN0eWxlCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0OCwgMjAsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCVN0eWxlUmFuZ2UgcmFuZ2VzW10gPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTik7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJyZWRncmVlbmJsdWV5ZWxsb3djeWFucHVycGxlIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbNF07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwzLFJFRCxudWxsKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCk7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCk7Ci0JcmFuZ2VzWzNdID0gZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDMsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDgsNCxCTFVFLCBudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCkpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxOCw0LENZQU4sbnVsbCk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTgsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDYpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzVdLmVxdWFscyhnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQkJCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMzUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDIwLDEwLEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMjUsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIwLDEwLEdSRUVOLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgzMCw1LEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEyLDUsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAxMiwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTIsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTcsMyxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbM107Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDUsNSxCTFVFLENZQU4pOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSw3LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgNywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw3LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMiwzLEJMVUUsQ1lBTikpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCS8vIEVuZC9CZWdpbm5pbmcgb3ZlcmxhcAotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMzgsIDI1LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2Myw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDYzLCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNzMsNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBDb21wbGV0ZSBvdmVybGFwCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDc4LFlFTExPVyxSRUQpKSk7Ci0KLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA2OCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNTgsMjAsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNTgsIDIwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMjAsWUVMTE9XLFJFRCkpKTsKLQotCS8vIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAyMywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI4LDIsUFVSUExFLFBVUlBMRSkpKTsKLQkKLQkvLyBlbmQsIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyggCi0JCW5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDAsNSxSRUQsUkVEKSwgZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpLAotCQkJZ2V0U3R5bGUoMTAsNSxDWUFOLENZQU4pLCBnZXRTdHlsZSgxNSw1LEJMVUUsQkxVRSksCi0JCQlnZXRTdHlsZSgyMCw1LEdSRUVOLEdSRUVOKSwgZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKX0KLQkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEzLCAxMiwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMyxDWUFOLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQkvLyBpbnNlcnQgd2l0aCBubyBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCi0JLy8gaW5zZXJ0IGJlZm9yZSAxIHN0eWxlCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDMsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxeGI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDMsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKSk7Ci0KLQkvLyBpbnNlcnQgYWZ0ZXIgMSBzdHlsZQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDMsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoOCwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDgsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MXhjOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDgsMSxQVVJQTEUsUFVSUExFKSkpOwotCi0JLy8gaW5zZXJ0IGJlZm9yZSAyIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDIsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgyLDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMiwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxeGU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgyLDEsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDIsUkVELFlFTExPVykpKTsKLQotCS8vIGluc2VydCBhZnRlciAyIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDIsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxMiwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEyLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEyLDEsUFVSUExFLFBVUlBMRSkpKTsKLQotCS8vIGluc2VydCBtaWRkbGUgMiBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMSwyLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEyLDIsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDMsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MXhnOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMyxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMiwyLFJFRCxZRUxMT1cpKSk7Ci0JCi0JLy8gaW5zZXJ0IG1pZGRsZSAzIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDMsUkVELFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoNiwzLFBVUlBMRSxZRUxMT1cpOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDEyLDMsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwyLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDIsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwzLFJFRCxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQsMixQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2LDMsUFVSUExFLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTIsMyxSRUQsWUVMTE9XKSkpOwkKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHQuc2V0VGV4dCgiMCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEsMSxSRUQsUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxZRUxMT1csWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyeGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDEsUkVELFJFRCkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMSwxLFJFRCxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMSwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MnhjOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMSxZRUxMT1csWUVMTE9XKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMSwxLFJFRCxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMiwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDIsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MnhkOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyLDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMiwxLFJFRCxSRUQpOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDMsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGU6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MnhlOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MnhmOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZzoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKXsKLQlTdHJpbmcgZGVmYXVsdFRleHQgPSAibGluZTBcblxybGluZTFcblxybGluZTJcblxyIjsKLQlpbnQgZGVmYXVsdFRleHRMZW5ndGggPSBkZWZhdWx0VGV4dC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSA3OwotCWludCBzZWxlY3Rpb25MZW5ndGggPSA3OwotCWludCByZXBsYWNlU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIHNlbGVjdGlvbkxlbmd0aCArIDE7Ci0JaW50IHJlcGxhY2VMZW5ndGggPSA1OwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU3RyaW5nIG5ld1RleHQgPSAibmV3bGluZTBcblxybmV3bGluZTEiOwotCWludCBuZXdUZXh0TGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJCQotCS8vIGluc2VydCB0ZXh0Ci0JLy8gd2l0aGluIHJhbmdlCi0JLy8gYWZ0ZXIgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UocmVwbGFjZVN0YXJ0LCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCi0JLy8gYmVmb3JlIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQotCi0JLy8gaW50ZXJzZWN0aW5nIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMSwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICsgMSArIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0JCQkJCi0JLy8gb3V0IG9mIHJhbmdlCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoLTEsIDAsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSArIDEsIDAsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0JCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JYXNzZXJ0VHJ1ZSgiOmg6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQkKLQkvLyBhcHBlbmQgdGV4dAotCS8vIGFwcGVuZCBpbiBlbXB0eSB3aWRnZXQKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IDAgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0JCQkKLQkvLyBhcHBlbmQgaW4gbm9uLWVtcHR5IHdpZGdldCAoc2VsZWN0aW9uIHNob3VsZCBhbHdheXMgYmUgcHJlc2VydmVkKQotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpsOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6bToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLy8gcGxhY2UgY2FyZXQgYXQgZW5kIG9mIHRleHQKLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6bjoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOm86IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gdGV4dC5nZXRDaGFyQ291bnQoKSAtIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0KLQkvLyByZXBsYWNlIHRleHQKLQkvLyB3aXRoaW4gcmFuZ2UKLQkvLyBhZnRlciBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShyZXBsYWNlU3RhcnQsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpwOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOnE6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCi0JLy8gYmVmb3JlIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpyOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOnM6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCQotCS8vIGludGVyc2VjdGluZyBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb25TdGFydCArIDEsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjp0OiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOnU6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyAxICsgbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQkJCQotCS8vIG91dCBvZiByYW5nZQotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKC0xLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjp2OiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCkgKyAxLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjp3OiIsIGV4Y2VwdGlvblRocm93bik7Ci0JYXNzZXJ0VHJ1ZSgiOng6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTFcckxpbmUyIjsKLQkKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCQotCXRleHQuc2V0VGV4dChsaW5lKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhsaW5lLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KCkgewotCUNhcmV0IGNhcmV0ID0gbmV3IENhcmV0KHRleHQsIFNXVC5OT05FKTsKLQlmaW5hbCBpbnQgWElOU0VUID0gaXNCaWRpKCkgPyAyIDogMDsKLQkKLQl0ZXh0LnNldENhcmV0KGNhcmV0KTsKLQlhc3NlcnRFcXVhbHMoWElOU0VULCB0ZXh0LmdldENhcmV0KCkuZ2V0TG9jYXRpb24oKS54KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueSk7Ci0KLQl0ZXh0LnNldENhcmV0KG51bGwpOwkJCi0JdGV4dC5zZXRUZXh0KCJcckxpbmUyIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCXRleHQuc2V0Q2FyZXQoY2FyZXQpOwotCWFzc2VydFRydWUodGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueCA+IDApOwotCWFzc2VydEVxdWFscyh0ZXh0LmdldExpbmVIZWlnaHQoKSwgdGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmlkaUNvbG9yaW5nWigpIHsKLQkvLy8gc2V0QmlkaUNvbG9yaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmlkaUNvbG9yaW5nWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcmV0T2Zmc2V0SSgpewotCXRleHQuc2V0Q2FyZXRPZmZzZXQoLTIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDEpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5zZXRDYXJldE9mZnNldCh0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCh0ZXh0LmdldENoYXJDb3VudCgpICsgMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDUpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KC0yKTsKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6azoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgwKTsKLQlhc3NlcnRUcnVlKCI6bDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJfQotCX07Ci0JdGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotCWFzc2VydEVxdWFscyhjb250ZW50LCB0ZXh0LmdldENvbnRlbnQoKSk7Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRDb250ZW50KG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFooKXsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0YWJsZVooKXsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpewotCUZvbnREYXRhIGZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDIwLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMjUsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVIZWlnaHQoKSA+IGxpbmVIZWlnaHQgJiYgZm9udC5lcXVhbHModGV4dC5nZXRGb250KCkpKTsKLQl0ZXh0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SG9yaXpvbnRhbEluZGV4SSgpewotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCg1MDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7CQotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCi0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SG9yaXpvbnRhbFBpeGVsSSgpewotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDEpOwkKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAxKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCg1MDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgtMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoMjUpOwkKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDI1KTsJCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDIpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0KLQkvLyBtYWtlIHN1cmUgdGhlIHdpZGdldCBjYW4gYmUgc2Nyb2xsZWQKLQlzaGVsbC5vcGVuKCk7Ci0JdGV4dC5zZXRTaXplKDEwLCA1MCk7CQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCg1KTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSA1KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lQmFja2dyb3VuZElJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpewotCVN0cmluZyB0ZXh0U3RyaW5nOwotCi0JdGV4dFN0cmluZyA9ICJMMVxuTDJcbkwzXG5MNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDUsIiIpOwotCWFzc2VydFRydWUoIjowYToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowYToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDQsIiIpOwotCWFzc2VydFRydWUoIjowYjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjowYjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwxLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMykgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNiwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBkOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjowZDoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDMsIiIpOwotCWFzc2VydFRydWUoIjowZToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowZToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCi0JdGV4dFN0cmluZyA9ICJMMVxuTDIiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGExOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDQsIiIpOwotCWFzc2VydFRydWUoIjowYjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBjMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowYzE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBkMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwzLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGUxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBlMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCXRleHRTdHJpbmcgPSAiTDFcbkwyIjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBmMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKyJcbiIpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDYsIiIpOwotCWFzc2VydFRydWUoIjowZzE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQkJCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDAsZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCQotCXRleHRTdHJpbmcgPSAiTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDIsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDIsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoNCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JCi0JdGV4dFN0cmluZyA9ICJOZXcgTGluZTFcbk5ldyBMaW5lMlxuTmV3IExpbmUzXG5OZXcgTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMixnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMixnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwyMCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDE4LCIiKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDE4LCJMMVxuTDJcbkwzXG4iKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCWFzc2VydFRydWUoIjo1OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IG51bGwpOwotCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgzLDksIkwxXG5MMlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gbnVsbCk7Ci0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMSwxMSwiTDNcbkw0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMykgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQkJCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDE4LCJMMVxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjc6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEdSRUVOKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0T3JpZW50YXRpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmllbnRhdGlvbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludFtdIGludmFsaWQgPSB7LTEsIDEwMCwgMTJ9OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihpbnZhbGlkW2ldKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDEpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDExKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWQubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRbaV0pOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVBvaW50W10gaW52YWxpZFJhbmdlcyA9IHtuZXcgUG9pbnQoLTEsIDApLCBuZXcgUG9pbnQoLTEsIC0xKSwgbmV3IFBvaW50KDEwMCwgMSksIAotCQluZXcgUG9pbnQoMTAwLCAtMSksIG5ldyBQb2ludCgxMSwgMTIpLCBuZXcgUG9pbnQoMTAsIDEyKX07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRSYW5nZXNbaV0pOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgNyk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2IiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihpbnZhbGlkUmFuZ2VzW2ldKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKXsKLQlpbnRbXVtdIGludmFsaWRSYW5nZXMgPSB7ey0xLCAwfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxMSwgMTJ9LCB7MTAsIDEyfSwgezIsIC0zfSwgezUwLCAtMX19OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCA3KTsKLQlhc3NlcnRFcXVhbHMoIjM0NTYiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgMCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7CQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotfQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpewotCXRleHQuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgPT0gIGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkuZXF1YWxzKHRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTikpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKXsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQoZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHRleHQuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpID09ICBnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHRleHQuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpLmVxdWFscyh0ZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25SYW5nZUlJKCl7Ci0JLy8gc2V0U2VsZWN0aW9uUmFuZ2UgYWxyZWFkeSB0ZXN0ZWQgaW4gdGVzdF9nZXRTZWxlY3Rpb25SYW5nZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCl7Ci0JU3R5bGVSYW5nZVtdIHN0eWxlczsKLQlTdHJpbmcgdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQotCS8qIAotCQlkZWZhdWx0U3R5bGVzCi0JCQotCQkJKDAsNDgsUkVELFlFTExPVyksIAotCQkJKDU4LDEwLEJMVUUsQ1lBTiksIAotCQkJKDY4LDEwLEdSRUVOLFBVUlBMRSkKLQkqLwotCi0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JCi0JLy8gTm8gb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIHN0eWxlcwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCw1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIG1pZGRsZSBvZiBvbmUgc3R5bGUgLSBwYXJ0aWFsCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjAsMjgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gZnVsbAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGVuZCBvZiBvbmUgc3R5bGUKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBiZWdpbm5pbmcgb2Ygb25lIHN0eWxlCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjAsOCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIGNvbXBsZXRlIHN0eWxlCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCQkJCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBiZWZvcmUgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMTAsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMSw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTEsMTQsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSkpOwotCS8vIG5vIG1lcmdpbmcgc2luY2Ugc3R5bGVzIGFyZSBjb21wbGV0ZWx5IG92ZXJsYXBwaW5nIGV4aXN0aW5nCi0JLy8gc3R5bGVzCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDUsUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTikpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw3LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDEwLEJMVUUsQ1lBTikpKTsKLQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLEJMVUUsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjEyMyA0NTYgNzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNCxCTFVFLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDQsQkxVRSxudWxsKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkgQUJDIERFRiIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsNCxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDQsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTYsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwxNCxSRUQsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQsMTUsUkVELG51bGwpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDIwLG51bGwsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCWludCBsZW5ndGggPSB0ZXh0U3RyaW5nLmxlbmd0aCgpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLGxlbmd0aCxudWxsLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMyxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMyxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOSw4LEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLEdSRUVOLFBVUlBMRSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCw3LEdSRUVOLFBVUlBMRSkpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDksUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNyw5LFJFRCxZRUxMT1cpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywxMCxHUkVFTixQVVJQTEUpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMywxMCxHUkVFTixQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMywyLEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoInJlZGdyZWVuYmx1ZXllbGxvd2N5YW5wdXJwbGUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNSxHUkVFTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxOCw0LENZQU4sbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMTQsbnVsbCxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDMsNSxHUkVFTixudWxsKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoOCwxNCxudWxsLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgicmVkZ3JlZW5ibHVleWVsbG93Y3lhbnB1cnBsZSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw2LFlFTExPVyxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyOCxudWxsLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQotCi0vKgotCXRleHQuc2V0VGV4dCgiVGhpc1xyXG5hXHRBbm90aGVyIGxpbmUuIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw4LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2LDEsQkxVRSxudWxsKSk7Ci0JU3R5bGVkVGV4dEV2ZW50IGV2ZW50ID0gbmV3IFN0eWxlZFRleHRFdmVudCgpOwotCWV2ZW50LmRldGFpbCA9IDY7Ci0JZXZlbnQudGV4dCA9ICJhXHRBbm90aGVyIGxpbmUuIjsKLQl0ZXh0Lm5vdGlmeUxpc3RlbmVyKFNULkxpbmVHZXRTdHlsZSwgZXZlbnQpOwotCWFzc2VydFRydWUoIjo4OiIsIGV2ZW50LnN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMyw0LEJMVUUsbnVsbCkpKTsKLSovCi0KLQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCw2LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEsUkVELG51bGwpKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0JCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGJlZm9yZSBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwxMCxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDU4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTEsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDExLDE0LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGFmdGVyIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMjAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0KLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSk7Ci0JLy8gbm8gbWVyZ2luZyBzaW5jZSBzdHlsZXMgYXJlIGNvbXBsZXRlbHkgb3ZlcmxhcHBpbmcgZXhpc3RpbmcKLQkvLyBzdHlsZXMKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDcsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTAsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQotCS8vIEVuZC9CZWdpbm5pbmcgb3ZlcmxhcAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2MywxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNzMsNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQotCS8vIENvbXBsZXRlIG92ZXJsYXAKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKSkpOwotCi0KLQkvLyAxLU4gY29tcGxldGUsIGJlZ2lubmluZwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyggCi0JCW5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDAsNSxSRUQsUkVEKSwgZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpLAotCQkJZ2V0U3R5bGUoMTAsNSxDWUFOLENZQU4pLCBnZXRTdHlsZSgxNSw1LEJMVUUsQkxVRSksCi0JCQlnZXRTdHlsZSgyMCw1LEdSRUVOLEdSRUVOKSwgZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKX0KLQkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjgsMixQVVJQTEUsUFVSUExFKSkpOwotCQotCS8vIGVuZCwgMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMCwzLENZQU4sQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxLFlFTExPVyxudWxsKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMSwyLFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsWUVMTE9XLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDIsUkVELG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieHh4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwxLFlFTExPVyxudWxsKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywyLFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMywyLFJFRCxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoInh4eC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCIvIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwzLFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDMsUkVELG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieHh4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxLDQsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsNCxZRUxMT1csbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJOZXdcclxuIik7Ci0JU3R5bGVSYW5nZSBzdHlsZSA9IGdldFN0eWxlKDAsNSxudWxsLG51bGwpOwotCXN0eWxlLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw1LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsMCwiYSIpOyAvLyAiTmV3YVxyXG4iCi0JLy8gc3R5bGVzICgwLDMsQk9MRCksICg0LDIsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDQpOwotCXN0eWxlLnN0YXJ0ID0gMzsKLQlzdHlsZS5sZW5ndGggPSAxOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDYsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJhIik7IC8vICJhTmV3YVxyXG4iCi0JLy8gc3R5bGVzICgxLDYsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDEpOwotCXN0eWxlLnN0YXJ0ID0gMDsKLQlzdHlsZS5sZW5ndGggPSAxOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDcsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxLCIiKTsgLy8gIk5ld2FcclxuIgotCS8vIHN0eWxlcyAoMCw2LEJPTEQpCi0JZm9yIChpbnQgaT0wOyBpPDY7IGkrKykgewotCQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZS5mb250U3R5bGUgPT0gU1dULkJPTEQpOwotCX0KLQotCi0JdGV4dC5zZXRUZXh0KCJOZXcgTCAxXHJcbk5ldyBMIDJcclxuIik7Ci0Jc3R5bGUgPSBnZXRTdHlsZSgwLDksbnVsbCxudWxsKTsKLQlzdHlsZS5mb250U3R5bGUgPSBTV1QuQk9MRDsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkvLyBzdHlsZXMgKDAsOSxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDAsImEiKTsKLQkvLyBzdHlsZXMgKDAsNyxCT0xEKSwgKDgsMixCT0xEKQotCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoOCk7Ci0JaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJc3R5bGUuc3RhcnQgPSA3OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCX0KLQkvLyBzdHlsZXMgKDAsMTAsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCJhIik7Ci0JLy8gc3R5bGVzICgwLDQsQk9MRCksICg1LDYsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDUpOwotCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCXN0eWxlLnN0YXJ0ID0gNDsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JLy8gc3R5bGVzICgwLDExLEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsMywiIik7Ci0JLy8gc3R5bGVzICgwLDgsQk9MRCkKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWFzc2VydFRydWUoIjo1YToiLCBzdHlsZS5mb250U3R5bGUgPT0gU1dULkJPTEQpOwotCX0KLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JCi0JLy8JCQkJCSIwMTIzNDU2Nzg5MDEyMyIKLQl0ZXh0U3RyaW5nID0gCQkiMTIzNCAxMjM0IDEyMzQiOwotCi0KLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMixZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNywyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2LDIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsNixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw0LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw2LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6N2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6N2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDEwLFlFTExPVyxSRUQpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxYjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNywyLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDIsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNiwyLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDEsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg2LDIsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjozYjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDgsMSxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDQsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDQsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NmI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NmI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywxMCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMywxMCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCS8vCQkJIAkJIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMyIKLQlTdHJpbmcgdGVzdFN0cmluZz0JIjEyMzQgMTIzNCAxMjM0IDEyMzQgMTIzNCI7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTIsMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTAsMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFlFTExPVyxSRUQpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEyLDQsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDgsNCwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg4LDIsWUVMTE9XLFJFRCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOCw2LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMCw2LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg4LDEyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQkvLwkJCSAJCQkiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzIgotCS8vCVN0cmluZyB0ZXN0U3RyaW5nPQkiMTIzNCAxMjM0IDEyMzQgMTIzNCAxMjM0IjsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsNywiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsNywiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsMTAsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgyLDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsOSwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSw5LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgzLDEzLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0KLQotCS8vCQkJIAkJCSIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCi0JLy8JU3RyaW5nIHRlc3RTdHJpbmc9CSIxMjM0IDEyMzQgMTIzNCAxMjM0IDEyMzQiOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsNCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywxMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSw0LEdSRUVOLFBVUlBMRSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg1LDEyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEdSRUVOLFBVUlBMRSkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSw0LEdSRUVOLFBVUlBMRSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg5LDEwLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBnZXRTdHlsZSgwLDAsbnVsbCxudWxsKTsKLQotCi0JU3R5bGVSYW5nZSBzdHlsZTIgPSBnZXRTdHlsZSgwLDAsUkVELFlFTExPVyk7Ci0KLQotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTEuZXF1YWxzKHN0eWxlMikpOwotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTEuc2ltaWxhclRvKHN0eWxlMikpOwotCi0KLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUyLmVxdWFscyhzdHlsZTEpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjE6IiwgIXN0eWxlMi5zaW1pbGFyVG8oc3R5bGUxKSk7Ci0KLQotCi0Jc3R5bGUxID0gZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKTsKLQlzdHlsZTIgPSBnZXRTdHlsZSgxMSw1LFJFRCxZRUxMT1cpOwotCi0KLQlhc3NlcnRUcnVlKCI6MjoiLCAhc3R5bGUxLmVxdWFscyhzdHlsZTIpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjI6IiwgIXN0eWxlMi5lcXVhbHMoc3R5bGUxKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGUxLnNpbWlsYXJUbyhzdHlsZTIpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGUyLnNpbWlsYXJUbyhzdHlsZTEpKTsKLQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3R5bGVSYW5nZXMkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0eWxlUmFuZ2VbXSByYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHsKLQkJbmV3IFN0eWxlUmFuZ2UoMCwgMSwgZ2V0Q29sb3IoUkVEKSwgbnVsbCksIAotCQluZXcgU3R5bGVSYW5nZSgyLCAxLCBnZXRDb2xvcihSRUQpLCBudWxsKX07Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQl0cnkgewotCQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhyYW5nZXMpOwotCVN0eWxlUmFuZ2VbXSBjdXJyZW50UmFuZ2VzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydEVxdWFscyhyYW5nZXMubGVuZ3RoLCBjdXJyZW50UmFuZ2VzLmxlbmd0aCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50UmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhyYW5nZXNbaV0sIGN1cnJlbnRSYW5nZXNbaV0pOwotCX0KLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG5ldyBTdHlsZVJhbmdlW10ge30pOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKCkubGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUYWJzSSgpewotCXRleHQuc2V0VGFicygxKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRhYnMoKSA9PSAxKTsKLQkKLQl0ZXh0LnNldFRhYnMoOCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lXHQxXHJcbiIpOwotCXRleHQuc2V0VGFicyg3KTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRhYnMoKSA9PSA3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKXsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5zZXRUZXh0KG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9CQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCl7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci0KLQl0ZXh0LnNldFRleHRMaW1pdCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAtMSk7Ci0KLQl0cnkgewotCQl0ZXh0LnNldFRleHRMaW1pdCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKXsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0KLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUwYVxyXG4iKTsKLQotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BQaXhlbEkoKXsKLQlpbnQgbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JCi0JdGV4dC5zZXRUb3BQaXhlbCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDEpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAxKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDIgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMiAqIGxpbmVIZWlnaHQpOwotCXRleHQuc2V0VG9wUGl4ZWwoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wUGl4ZWwoMyAqIGxpbmVIZWlnaHQpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAyICogbGluZUhlaWdodCk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0VG9wUGl4ZWwoMiAqIGxpbmVIZWlnaHQpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V29yZFdyYXBaKCl7Ci0JU3RyaW5nIHRlc3RTdHJpbmcgPSAiTGluZTFcbkxpbmUyIjsKLQkKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFdvcmRXcmFwKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0V29yZFdyYXAodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRXb3JkV3JhcCgpKTsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCB0ZXN0U3RyaW5nLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZjoiLCAyLCB0ZXh0LmdldExpbmVDb3VudCgpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSg1LCAyKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJpZGlDb2xvcmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRPZmZzZXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoYXJDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleUJpbmRpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQmFja2dyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZURlbGltaXRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZVJhbmdlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZXNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFicyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRSYW5nZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wUGl4ZWwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdvcmRXcmFwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlQWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhd0lJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdSYW5nZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJpZGlDb2xvcmluZ1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvcml6b250YWxJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvcml6b250YWxQaXhlbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEtleUJpbmRpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRhYnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGltaXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEluZGV4SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wUGl4ZWxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXb3JkV3JhcFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIikpIHRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIikpIHRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKSkgdGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKSkgdGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJpZGlDb2xvcmluZyIpKSB0ZXN0X2dldEJpZGlDb2xvcmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRPZmZzZXQiKSkgdGVzdF9nZXRDYXJldE9mZnNldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hhckNvdW50IikpIHRlc3RfZ2V0Q2hhckNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIikpIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4IikpIHRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwiKSkgdGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEtleUJpbmRpbmdJIikpIHRlc3RfZ2V0S2V5QmluZGluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKSkgdGVzdF9nZXRMaW5lQXRPZmZzZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQmFja2dyb3VuZEkiKSkgdGVzdF9nZXRMaW5lQmFja2dyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVDb3VudCIpKSB0ZXN0X2dldExpbmVDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZURlbGltaXRlciIpKSB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVIZWlnaHQiKSkgdGVzdF9nZXRMaW5lSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbkF0T2Zmc2V0SSIpKSB0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPZmZzZXRBdExpbmVJIikpIHRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRPZmZzZXRBdExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kIikpIHRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCIpKSB0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlIikpIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvblRleHQiKSkgdGVzdF9nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJIikpIHRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGVSYW5nZXMiKSkgdGVzdF9nZXRTdHlsZVJhbmdlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGVSYW5nZXNJSSIpKSB0ZXN0X2dldFN0eWxlUmFuZ2VzSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYnMiKSkgdGVzdF9nZXRUYWJzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dElJIikpIHRlc3RfZ2V0VGV4dElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0TGltaXQiKSkgdGVzdF9nZXRUZXh0TGltaXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRSYW5nZUlJIikpIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcEluZGV4IikpIHRlc3RfZ2V0VG9wSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcFBpeGVsIikpIHRlc3RfZ2V0VG9wUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdvcmRXcmFwIikpIHRlc3RfZ2V0V29yZFdyYXAoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZUFjdGlvbkkiKSkgdGVzdF9pbnZva2VBY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYXN0ZSIpKSB0ZXN0X3Bhc3RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludCIpKSB0ZXN0X3ByaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlciIpKSB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRQcmludE9wdGlvbnMiKSkgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRQcmludE9wdGlvbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhdyIpKSB0ZXN0X3JlZHJhdygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3SUlJSVoiKSkgdGVzdF9yZWRyYXdJSUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3UmFuZ2VJSVoiKSkgdGVzdF9yZWRyYXdSYW5nZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZXBsYWNlU3R5bGVSYW5nZXNJSSRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIikpIHRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCaWRpQ29sb3JpbmdaIikpIHRlc3Rfc2V0QmlkaUNvbG9yaW5nWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQiKSkgdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2FyZXRPZmZzZXRJIikpIHRlc3Rfc2V0Q2FyZXRPZmZzZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKSkgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIikpIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFoiKSkgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0YWJsZVoiKSkgdGVzdF9zZXRFZGl0YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIb3Jpem9udGFsSW5kZXhJIikpIHRlc3Rfc2V0SG9yaXpvbnRhbEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SG9yaXpvbnRhbFBpeGVsSSIpKSB0ZXN0X3NldEhvcml6b250YWxQaXhlbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEtleUJpbmRpbmdJSSIpKSB0ZXN0X3NldEtleUJpbmRpbmdJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRMaW5lQmFja2dyb3VuZElJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25SYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTdHlsZVJhbmdlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTdHlsZVJhbmdlcyRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIikpIHRlc3Rfc2V0U3R5bGVSYW5nZXMkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFic0kiKSkgdGVzdF9zZXRUYWJzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BQaXhlbEkiKSkgdGVzdF9zZXRUb3BQaXhlbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdvcmRXcmFwWiIpKSB0ZXN0X3NldFdvcmRXcmFwWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0vKioKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDE5OTg1Ci0gKi8KLXByb3RlY3RlZCB2b2lkIHRlc3RSdGZDb3B5KCkgewotCVN0cmluZyBsaW5lcyA9ICJMaW5lMFxuTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTRcbkxpbmU1IjsKLQlmaW5hbCBpbnRbXSBsaW5lc0NhbGxlZCA9IG5ldyBpbnRbXSB7MH07Ci0JTGluZVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKFN0eWxlZFRleHQpIGV2ZW50LndpZGdldDsKLQkJCWludCBsaW5lSW5kZXggPSBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldChldmVudC5saW5lT2Zmc2V0KTsKLQkJCWludCBsaW5lU3RhcnQgPSBldmVudC5saW5lT2Zmc2V0OwotCQkJaW50IGxpbmVFbmQgPSBsaW5lU3RhcnQgKyBldmVudC5saW5lVGV4dC5sZW5ndGgoKTsKLQkJCVN0eWxlUmFuZ2UgZ29vZFJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoMCwgMSwgcmVkLCByZWQpOwotCQkJCi0JCQlldmVudC5zdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQkJCXN3aXRjaCAobGluZUluZGV4ICUgNikgewotCQkJCWNhc2UgMDoKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gZ29vZFJhbmdlOwotCQkJCQlldmVudC5zdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZShsaW5lRW5kLCAxLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gZ29vZFJhbmdlOwotCQkJCQlldmVudC5zdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZShsaW5lRW5kLCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAtIDEsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7CQotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZVN0YXJ0LCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBuZXcgU3R5bGVSYW5nZShsaW5lU3RhcnQsIDEsIHJlZCwgcmVkKTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZVN0YXJ0LCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1OgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBuZXcgU3R5bGVSYW5nZShsaW5lRW5kIC8gMiwgMSwgcmVkLCByZWQpOwotCQkJCQlldmVudC5zdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZShsaW5lRW5kIC8gMiwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJfQkJCQotCQl9Ci0JfTsKLQl0ZXh0LnNldFRleHQobGluZXMpOwkKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJub3QgYWxsIGxpbmVzIHRlc3RlZCBmb3IgUlRGIGNvcHkiLCBsaW5lc0NhbGxlZFswXSA9PSB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQkKLQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZCh0ZXh0LmdldERpc3BsYXkoKSk7Ci0JUlRGVHJhbnNmZXIgcnRmVHJhbmZlciA9IFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nIGNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMocnRmVHJhbmZlcik7Ci0JYXNzZXJ0VHJ1ZSgiUlRGIGNvcHkgZmFpbGVkIiwgY2xpcGJvYXJkVGV4dC5sZW5ndGgoKSA+IDApOwotCi0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5KCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoJ2EnLCAwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCA1MCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg4ZTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5CaWRpVXRpbDsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCWludCBYSU5TRVQgPSAwOwotCi0JY2xhc3MgQ29udGVudEltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgU3R5bGVkVGV4dENvbnRlbnQgewotCQlTdHJpbmcgdGV4dENvbnRlbnQgPSAiIjsKLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpewotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAiZ2V0TGluZSI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gImdldExpbmVEZWxpbWl0ZXIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0QXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuIHRleHRDb250ZW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCQl0ZXh0Q29udGVudCA9IHRleHQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQkJdGV4dENvbnRlbnQgPSB0ZXh0OwotCQl9Ci0JfQotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBuZXcgQ29udGVudEltcGxlbWVudGF0aW9uKCk7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBpc0JpZGkoKSB7Ci0JcmV0dXJuIEJpZGlVdGlsLmlzQmlkaVBsYXRmb3JtKCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlpZiAoaXNCaWRpKCkpIFhJTlNFVCA9IDI7Ci0JZWxzZSBYSU5TRVQgPSAwOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc3R5bGVkVGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JLy8gZG9lcyBub3QgbWFrZSBzZW5zZSB0byB0ZXN0LCBub3QgY2FsbGVkIGJ5IFN0eWxlZFRleHQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyQ291bnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVkVGV4dC5nZXRDaGFyQ291bnQoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQXRPZmZzZXRJKCkgewotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlZFRleHQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVDb3VudCgpIHsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzdHlsZWRUZXh0LmdldExpbmVDb3VudCgpID09IDEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc3R5bGVkVGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkuZXF1YWxzKCJnZXRMaW5lRGVsaW1pdGVyIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVJKCkgewotCS8vIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBnZXRMaW5lIHRvIGJlIGNhbGxlZAotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlZFRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS5lcXVhbHMobmV3IFBvaW50KFhJTlNFVCwwKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9mZnNldEF0TGluZUkoKSB7Ci0JLy8gd2lsbCBpbmRpcmVjdGx5IGNhdXNlIGdldE9mZnNldEF0TGluZSB0byBiZSBjYWxsZWQKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZWRUZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkuZXF1YWxzKG5ldyBQb2ludChYSU5TRVQsMCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0UmFuZ2VJSSgpIHsKLQlhc3NlcnRUcnVlKCI6ZzoiLCBzdHlsZWRUZXh0LmdldFRleHRSYW5nZSgwLDApLmVxdWFscygiIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkvLyBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHRlc3QsIG5vdCBjYWxsZWQgYnkgU3R5bGVkVGV4dAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsInRlc3QxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0MSIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwidGVzdDIiKTsKLQlhc3NlcnRUcnVlKCI6aToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoInRlc3QyIikpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoYXJDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lRGVsaW1pdGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dFJhbmdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lciIpKSB0ZXN0X2FkZFRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hhckNvdW50IikpIHRlc3RfZ2V0Q2hhckNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQXRPZmZzZXRJIikpIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUNvdW50IikpIHRlc3RfZ2V0TGluZUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lRGVsaW1pdGVyIikpIHRlc3RfZ2V0TGluZURlbGltaXRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUkiKSkgdGVzdF9nZXRMaW5lSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSIpKSB0ZXN0X2dldE9mZnNldEF0TGluZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRSYW5nZUlJIikpIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4NTc5Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlQ3Vyc29yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlQ3Vyc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um93KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSb3cgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJvdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW4iKSkgdGVzdF9nZXRDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJvdyIpKSB0ZXN0X2dldFJvdygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NzJmZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlRWRpdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3IgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb2x1bW5JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb2x1bW5JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uIikpIHRlc3RfZ2V0Q29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtIikpIHRlc3RfZ2V0SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29sdW1uSSIpKSB0ZXN0X3NldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkiKSkgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpKSB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWEwNzk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIHN0eWxlID0gU1dULk1VTFRJKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rlc2VsZWN0QWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSGVpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSA4OwotCVRhYmxlVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBBZnRlciBhZGRpbmcgaXRlbXMsIGJ1dCBiZWZvcmUgc2VsZWN0aW5nIGFueSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyBnZXRTZWxlY3Rpb24oKSBpcyBmdXJ0aGVyIHRlc3RlZCBpbiB0ZXN0X3NlbGVjdEFsbCBhbmQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCWludCBudW1iZXIgPSA4OwotCVRhYmxlVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBBZnRlciBhZGRpbmcgaXRlbXMsIGJ1dCBiZWZvcmUgc2VsZWN0aW5nIGFueSIsIDAsIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQkvLyBnZXRTZWxlY3Rpb25Db3VudCgpIGlzIGZ1cnRoZXIgdGVzdGVkIGluIHRlc3Rfc2VsZWN0QWxsIGFuZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRhYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZHJlbigpIHsKLQkvKiBPdmVycmlkaW5nIHRlc3RfZ2V0Q2hpbGRyZW4gZnJvbSBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZQotCSAqIHRvIGRvIG5vdGhpbmcsIGJlY2F1c2UgdGhlIGNoaWxkIG9mIGEgVGFibGVUcmVlIGlzIGFsd2F5cyBhIFRhYmxlLgotCSAqLwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQkvKiBGVVRVUkU6IFNob3VsZCBhbHNvIGFkZCBzdWItbm9kZXMsIGFuZCB0ZXN0IGJvdGggc2luZ2xlIGFuZCBtdWx0aSB3aXRoIHRob3NlLgotCSAqIGkuZS4gc3ViaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbShpdGVtc1tpXSwgU1dULk5PTkUpOyAqLwotCi0Jc2VsZWN0QWxsX2hlbHBlcigiRW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCi0JaW50IG51bWJlciA9IDg7Ci0JVGFibGVUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCBTV1QuTk9ORSk7Ci0JfQotCXNlbGVjdEFsbF9oZWxwZXIoInNlbGVjdEFsbCgpIiwgaXRlbXMpOwotCi0JCi0JLyogTm93IHJ1biB0aGUgc2FtZSB0ZXN0cyBvbiBhIHNpbmdsZS1zZWxlY3QgVGFibGVUcmVlLiAqLwotCXNpbmdsZVNlbGVjdCgpOwotCXNlbGVjdEFsbF9oZWxwZXIoIkVtcHR5IHRhYmxlIHRyZWUiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCBTV1QuTk9ORSk7Ci0JfQotCXNlbGVjdEFsbF9oZWxwZXIoInNlbGVjdEFsbCgpIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0JLyogRlVUVVJFOiBTaG91bGQgYWxzbyBhZGQgc3ViLW5vZGVzLCBhbmQgdGVzdCBib3RoIHNpbmdsZSBhbmQgbXVsdGkgd2l0aCB0aG9zZS4KLQkgKiBpLmUuIHN1Yml0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0oaXRlbXNbaV0sIFNXVC5OT05FKTsgKi8KLQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBubyBpdGVtcyBpbiBlbXB0eSB0YWJsZSB0cmVlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0JdHJ5IHsKLQkJdGFibGVUcmVlLnNldFNlbGVjdGlvbigoVGFibGVUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTVVMVEk6IE5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGluZyBudWxsIGluIGVtcHR5IHRhYmxlIHRyZWUiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIDApOwotCX0KLQkKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gdGFibGUgdHJlZSB3aXRoIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0JdHJ5IHsKLQkJdGFibGVUcmVlLnNldFNlbGVjdGlvbigoVGFibGVUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTVVMVEk6IE5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGluZyBudWxsIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgaXRlbSAiICsgaSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbaV19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1tpXX0pOwotCX0KLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgaXRlbXMiLCBpdGVtcywgaXRlbXMpOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSIsIHRhYmxlVHJlZS5nZXRJdGVtcygpLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDIgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzZdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzZdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbNV0sIGl0ZW1zWzddfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHVub3JkZXJlZCBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMl0sIGl0ZW1zWzddfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1szXSwgaXRlbXNbMl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgcmV2ZXJzZS1vcmRlciBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzddLCBpdGVtc1s1XSwgaXRlbXNbMl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbNV0sIGl0ZW1zWzddfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSB0d2ljZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbNF19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgc2FtZSBpdGVtIG11bHRpcGxlIHRpbWVzIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG11bHRpcGxlIGl0ZW1zIG11bHRpcGxlIHRpbWVzIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1s0XX0pOwotCi0JCi0JLyogTm93IHJ1biB0aGUgc2FtZSB0ZXN0cyBvbiBhIHNpbmdsZS1zZWxlY3QgVGFibGVUcmVlLiAqLwotCXNpbmdsZVNlbGVjdCgpOwotCQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBubyBpdGVtcyBpbiBlbXB0eSB0YWJsZSB0cmVlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0JdHJ5IHsKLQkJdGFibGVUcmVlLnNldFNlbGVjdGlvbigoVGFibGVUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiU0lOR0xFOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiBlbXB0eSB0YWJsZSB0cmVlIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIDApOwotCX0KLQkKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gdGFibGUgdHJlZSB3aXRoIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0JdHJ5IHsKLQkJdGFibGVUcmVlLnNldFNlbGVjdGlvbigoVGFibGVUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiU0lOR0xFOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiB0YWJsZSB0cmVlIHdpdGggaXRlbXMiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW0gIiArIGksIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbaV19KTsKLQl9Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW1zIiwgaXRlbXMsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSIsIHRhYmxlVHJlZS5nZXRJdGVtcygpLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMiBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1szXSwgaXRlbXNbNl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHVub3JkZXJlZCBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHVub3JkZXJlZCBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1syXSwgaXRlbXNbN119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyByZXZlcnNlLW9yZGVyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbM10sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgcmV2ZXJzZS1vcmRlciBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzddLCBpdGVtc1s1XSwgaXRlbXNbMl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgc2FtZSBpdGVtIHR3aWNlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBzYW1lIGl0ZW0gbXVsdGlwbGUgdGltZXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG11bHRpcGxlIGl0ZW1zIG11bHRpcGxlIHRpbWVzIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIikpIHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYmxlIikpIHRlc3RfZ2V0VGFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKSkgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJpdmF0ZSBUYWJsZVRyZWUgdGFibGVUcmVlOwotcHJpdmF0ZSBpbnQgc3R5bGU7Ci0KLS8qCi0gKiBTZXRzIGEgc2luZ2xlLXNlbGVjdCBUYWJsZVRyZWUgYXMgdGhlIHRlc3Qgd2lkZ2V0LgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2luZ2xlU2VsZWN0KCkgewotCXRhYmxlVHJlZS5kaXNwb3NlKCk7Ci0JdGFibGVUcmVlID0gbmV3IFRhYmxlVHJlZShzaGVsbCwgc3R5bGUgPSBTV1QuU0lOR0xFKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlKTsKLX0KLQotLyoKLSAqIFVzZWQgaW4gdGVzdF9zZWxlY3RBbGwuCi0gKiBOb3RlOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQuCi0gKi8KLXByaXZhdGUgdm9pZCBzZWxlY3RBbGxfaGVscGVyKFN0cmluZyBtZXNzYWdlLCBUYWJsZVRyZWVJdGVtW10gZXhwZWN0ZWRTZWxlY3Rpb24pIHsKLQl0YWJsZVRyZWUuc2VsZWN0QWxsKCk7Ci0JbWVzc2FnZSA9IChzdHlsZSA9PSBTV1QuTVVMVEkgPyAiTVVMVEkiIDogIlNJTkdMRSIpICsgIjogIiArIG1lc3NhZ2U7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLmxlbmd0aCwgdGFibGVUcmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydFNhbWUobWVzc2FnZSwgZXhwZWN0ZWRTZWxlY3Rpb24sIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLS8qCi0gKiBVc2VkIGluIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uCi0gKiBOb3RlOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQuCi0gKi8KLXByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb25faGVscGVyKFN0cmluZyBtZXNzYWdlLCBUYWJsZVRyZWVJdGVtW10gaXRlbXNUb1NlbGVjdCwgVGFibGVUcmVlSXRlbVtdIGV4cGVjdGVkU2VsZWN0aW9uKSB7Ci0JdGFibGVUcmVlLnNldFNlbGVjdGlvbihpdGVtc1RvU2VsZWN0KTsKLQltZXNzYWdlID0gKHN0eWxlID09IFNXVC5NVUxUSSA/ICJNVUxUSSIgOiAiU0lOR0xFIikgKyAiOiAiICsgbWVzc2FnZTsKLQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRTZWxlY3Rpb24ubGVuZ3RoLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JYXNzZXJ0U2FtZShtZXNzYWdlLCBleHBlY3RlZFNlbGVjdGlvbiwgdGFibGVUcmVlLmdldFNlbGVjdGlvbigpKTsJCi19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZVRyZWUoVmVjdG9yIGV2ZW50cywgYm9vbGVhbiB0cmF2ZXJzZSkgewotICAgIFN0cmluZyB0ZXN0ID0gZ2V0VGVzdE5hbWUoKTsKLSAgICB0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlVHJlZS5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2wgIiArIGNvbCk7Ci0JCWNvbHVtbi5zZXRXaWR0aCg3MCk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhjb2x1bW4sIHRlc3QsIGV2ZW50cyk7Ci0JfQotCWZvciAoaW50IG5vZGUgPSAwOyBub2RlIDwgNDsgbm9kZSsrKSB7Ci0JCVRhYmxlVHJlZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQkJaXRlbS5zZXRUZXh0KGNvbCwgIlRUSXRlbSIgKyBub2RlICsgY29sKTsKLQkJfQotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgdGVzdCwgZXZlbnRzKTsKLQkJVGFibGVUcmVlSXRlbSBzdWJpdGVtID0gbmV3IFRhYmxlVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQkJc3ViaXRlbS5zZXRUZXh0KGNvbCwgIlRUU3ViIiArIG5vZGUgKyBjb2wpOwotCQl9Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhzdWJpdGVtLCB0ZXN0LCBldmVudHMpOwotCX0KLQlTdHJpbmdbXSB0eXBlcyA9IChTdHJpbmdbXSlDb25zaXN0ZW5jeVV0aWxpdHkuZXZlbnRPcmRlcmluZy5nZXQoIlRhYmxlVHJlZVRhYmxlIik7Ci0JaWYoIXRyYXZlcnNlKSB7Ci0JICAgIFN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW3R5cGVzLmxlbmd0aCAtMV07Ci0JICAgIFN5c3RlbS5hcnJheWNvcHkodHlwZXMsIDAsIHRlbXAsIDAsIHR5cGVzLmxlbmd0aC0xKTsKLQkgICAgdHlwZXMgPSB0ZW1wOwotCX0KLQlob29rRXhwZWN0ZWRFdmVudHModGFibGVUcmVlLmdldFRhYmxlKCksIHR5cGVzLCBldmVudHMpOwotCXNldFdpZGdldCh0YWJsZVRyZWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAzMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMSwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICB0YWJsZVRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZVRyZWVJdGVtW10geyB0YWJsZVRyZWUuZ2V0SXRlbXMoKVswXX0pOwotICAgIGludCBjb2RlPVNXVC5BUlJPV19SSUdIVDsKLSAgICBpZihTd3RKdW5pdC5pc0dUSykKLSAgICAgICAgY29kZSA9IFNXVC5LRVlQQURfQUREOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgY29kZSwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIHRhYmxlVHJlZS5nZXRJdGVtSGVpZ2h0KCkqMiwgMSwgMCwgCi0gICAgICAgICAgICAJICAgICBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgZmFsc2UpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDI1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmN2VjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVFZGl0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbHVtbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbHVtbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb2x1bW5JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW4iKSkgdGVzdF9nZXRDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW0iKSkgdGVzdF9nZXRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb2x1bW5JIikpIHRlc3Rfc2V0Q29sdW1uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpKSB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyYzdmMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi0JVGFibGVUcmVlIHRhYmxlVHJlZTsKLQlUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW07Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIDApOwotCXRhYmxlVHJlZUl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIDApOwotCXNldFdpZGdldCh0YWJsZVRyZWVJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QmFja2dyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kc0koKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kc0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGVja2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGVja2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhwYW5kZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEV4cGFuZGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9yZWdyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyYXllZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0R3JheWVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDaGVja2VkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q2hlY2tlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRlZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZGVkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEdyYXllZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hlY2tlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXhwYW5kZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyYXllZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDaGVja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0R3JheWVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHNJIikpIHRlc3RfZ2V0Qm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hlY2tlZCIpKSB0ZXN0X2dldENoZWNrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4cGFuZGVkIikpIHRlc3RfZ2V0RXhwYW5kZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmF5ZWQiKSkgdGVzdF9nZXRHcmF5ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSSIpKSB0ZXN0X2dldEltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEkiKSkgdGVzdF9nZXRUZXh0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2hlY2tlZFoiKSkgdGVzdF9zZXRDaGVja2VkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kZWRaIikpIHRlc3Rfc2V0RXhwYW5kZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRHcmF5ZWRaIikpIHRlc3Rfc2V0R3JheWVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkYjAwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlpbnQgdmVyaWZ5ID0gLTE7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dENoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBzdHlsZWRUZXh0LmdldENvbnRlbnQoKTsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcbnRlc3RpbmciKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiYSIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcckxpbmUgMVxyXG5MaW5lIDIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDYgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDMiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiVGhpc1xuXHIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDggOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG5MMVxyXG5MMiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMXRlc3QiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEwOnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTI6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDFcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMVxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE1OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxdGVzdFxuXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE2OnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE2OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTc6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTg6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDFcclxudGVzdFxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxdGVzdFxyXHJcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyMDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dENoYW5naW5nKFRleHRDaGFuZ2luZ0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkKLQlib29sZWFuIGV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuXG4iKTsKLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6NDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCXZlcmlmeSA9IDU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQl2ZXJpZnkgPSA2OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JdmVyaWZ5ID0gNzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JdmVyaWZ5ID0gODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAxMTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMTogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXZlcmlmeSA9IDEyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE0OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE2OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTY6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDE3OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTc6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLSAJc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTg7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXZlcmlmeSA9IDE5OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDIwOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjIwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHN0eWxlZFRleHQuZ2V0Q29udGVudCgpOwotCVRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQkJc3dpdGNoKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6MmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDUgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjo3YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDggOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA5IDogewotCQkJCQlhc3NlcnRUcnVlKCI6OWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTA6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMjogewotCQkJCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxMmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTNhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNDogewotCQkJCQlhc3NlcnRUcnVlKCI6MTQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTVhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNjp7Ci0JCQkJCWFzc2VydFRydWUoIjoxNjoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE3OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNzoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE4OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIwOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCWJvb2xlYW4gZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwkKLQl2ZXJpZnkgPSAxOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcblxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gNDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gNTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSA2OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gNzsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQotCXZlcmlmeSA9IDg7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSA5OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAxMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTt9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxMTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjExOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDEyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDEzOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDE0OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDE1OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMTY7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDE3OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNzogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxODsKLSAJc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAxOTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQl2ZXJpZnkgPSAyMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjIwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHN0eWxlZFRleHQuZ2V0Q29udGVudCgpOwotCVRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAodmVyaWZ5KSB7Ci0JCQkJY2FzZSAxIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoInRlc3RpbmciKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJhIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCi0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcblxuIik7Ci0KLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCQotCXZlcmlmeSA9IDQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnNldFRleHQobnVsbCk7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6NDoiLCB0cnVlKTt9CQotCWNvbnRlbnQucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpKSB0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQiKSkgdGVzdF90ZXh0Q2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKSkgdGVzdF90ZXh0U2V0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNWIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VkRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZWRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOWEzNGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2luZ0V2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2luZ0V2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JLy8gdGhpcyBtZXRob2QgdGVzdGVkIGJ5IG90aGVyIHRlc3QgY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDc2NzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtIikpIHRlc3RfZ2V0SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZlYTJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JaW50IHZlcmlmeSA9IC0xOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdmVyaWZ5S2V5TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKSB7Ci0JVmVyaWZ5S2V5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCQkJaWYgKHZlcmlmeSAhPSAxKSB7ZXZlbnQuZG9pdCA9IGZhbHNlO30KLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdmVyaWZ5ID0gMTsKLQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JZS5jaGFyYWN0ZXIgPSAnYSc7Ci0Jc3R5bGVkVGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sIGUpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiYSIpKTsKLQotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCIiKTsKLQllID0gbmV3IEV2ZW50KCk7Ci0JZS5jaGFyYWN0ZXIgPSAnYSc7Ci0Jc3R5bGVkVGV4dC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sIGUpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXN0eWxlZFRleHQucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdmVyaWZ5S2V5TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdmVyaWZ5S2V5TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQiKSkgdGVzdF92ZXJpZnlLZXlMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDRlMTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpZW50QXJlYSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BDZW50ZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcENlbnRlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcExlZnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcExlZnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BSaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wUmlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXlvdXRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9sYXlvdXRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJvcmRlclZpc2libGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wQ2VudGVyU2VwYXJhdGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BMZWZ0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BDZW50ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcExlZnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFJpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3JkZXJWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wQ2VudGVyU2VwYXJhdGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BMZWZ0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRlbnQiKSkgdGVzdF9nZXRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BDZW50ZXIiKSkgdGVzdF9nZXRUb3BDZW50ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcExlZnQiKSkgdGVzdF9nZXRUb3BMZWZ0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BSaWdodCIpKSB0ZXN0X2dldFRvcFJpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVoiKSkgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiIpKSB0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGEyMzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyIpKSB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTUwODQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEF2YWlsYWJsZVR5cGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRGlzcG9zZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzIikpIHRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdmFpbGFibGVUeXBlcyIpKSB0ZXN0X2dldEF2YWlsYWJsZVR5cGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIikpIHRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIikpIHRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTA1ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5ECi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5EIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Vycm9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Vycm9ySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySSIpKSB0ZXN0X2Vycm9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJSSIpKSB0ZXN0X2Vycm9ySUkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwNmJjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIikpIHRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNmZXIiKSkgdGVzdF9nZXRUcmFuc2ZlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0MGU4NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjM3OGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzZTVjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJiNmVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIikpIHRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNmZXIiKSkgdGVzdF9nZXRUcmFuc2ZlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDk2YjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOWIzYTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MDc2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ4MmM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2ZlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5zdGFuY2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5zdGFuY2UiKSkgdGVzdF9nZXRJbnN0YW5jZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2NjRlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuUlRGVHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuUlRGVHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2ZlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnN0YW5jZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2ZlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbnN0YW5jZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluc3RhbmNlIikpIHRlc3RfZ2V0SW5zdGFuY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkYWJiMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluc3RhbmNlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2ZlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbnN0YW5jZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnN0YW5jZSIpKSB0ZXN0X2dldEluc3RhbmNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M0MGYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyIpKSB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzFiZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3M2U2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQXJtRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQXJtRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBBcm1FdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0YmVlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0QXJtZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0QXJtZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0QXJtZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCIpKSB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzEzMDI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpKSB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzOTkwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBDb250cm9sRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNDVmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpKSB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMjA1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBEaXNwb3NlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4ZDhiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXREaXNwb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQiKSkgdGVzdF93aWRnZXREaXNwb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2YmExYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKSkgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKSkgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjY2MDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgRm9jdXNFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmJlNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKSkgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKSkgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE3NzhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IEhlbHBFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDM5MTgwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50IikpIHRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2EzZDYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpKSB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpKSB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmMwZjBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IEtleUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YzYjU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Njg3N2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpKSB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpKSB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2YzFmMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBNZW51RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0MmJlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGE5MzIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IE1vZGlmeUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE1ZDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQiKSkgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWU5OTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjAzNTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgTW91c2VFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTNhMTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODQ3NTliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YzRmM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1NDllYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmNlOTg4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFBhaW50RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjEzYWQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWludENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50IikpIHRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTU3NDA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IikpIHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjZjOTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgU2VsZWN0aW9uRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTQ0YzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzJlYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk5OTVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFNoZWxsRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzkzOGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzAxYTE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVHJhdmVyc2VFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZWQxZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlUcmF2ZXJzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlUcmF2ZXJzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlUcmF2ZXJzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQiKSkgdGVzdF9rZXlUcmF2ZXJzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhNzM4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IikpIHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IikpIHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQxYzE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVHJlZUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTkzNzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IikpIHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IikpIHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYmVjY2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlR5cGVkRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JZXZlbnQud2lkZ2V0ID0gc2hlbGw7Ci0JVHlwZWRFdmVudCB0eXBlZEV2ZW50ID0gbmV3VHlwZWRFdmVudChldmVudCk7Ci0JYXNzZXJ0Tm90TnVsbCh0eXBlZEV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWV2ZW50LndpZGdldCA9IHNoZWxsOwotCVR5cGVkRXZlbnQgdHlwZWRFdmVudCA9IG5ld1R5cGVkRXZlbnQoZXZlbnQpOwotCWFzc2VydE5vdE51bGwodHlwZWRFdmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKHR5cGVkRXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci0KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFR5cGVkRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzI0NmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBWZXJpZnlFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjNTMxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IikpIHRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OGNhNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJSSgpIHsKLQkvLyBUZXN0IG5ldyBDb2xvcihEZXZpY2UgZGV2aWNlLCBpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVkLCBncmVlbiBvciBibHVlIGFyZ3VtZW50IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIDI1NQotCi0JLy8gdmFsaWQgY29sb3IgKGJsYWNrKQotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAod2hpdGUpCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yIChyYW5kb20gZ3JleSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyMCwgMjAsIDIwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEwMiwgMjU1LCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIDAsIDAsIDApOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPCAwCi0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgLTEwLCAtMTAsIC0xMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMTAwMCwgMjAwMCwgMzAwMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiID4gMjU1Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgYmx1ZSA+IDI1NQotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEwLCAxMCwgMjU2KTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBibHVlID4gMjU1Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCS8vIFRlc3QgbmV3IENvbG9yKERldmljZSBkZXZpY2UsIFJHQiByZ2IpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZWQsIGdyZWVuIG9yIGJsdWUgYXJndW1lbnQgaXMgbm90IGJldHdlZW4gMCBhbmQgMjU1OyBvciByZ2IgaXMgbnVsbAotCQotCS8vIHZhbGlkIGNvbG9yIChibGFjaykKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDAsIDAsIDApKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHdoaXRlKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tIGdyZXkpCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMCwgMTAsIDEwKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yIChyYW5kb20pCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMDIsIDI1NSwgMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyBkZXZpY2UgPT0gbnVsbCAodmFsaWQpCi0JY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgbmV3IFJHQigwLCAwLCAwKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA8IDAKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKC0xMCwgLTEwLCAtMTApKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPiAyNTUKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDEwMDAsIDIwMDAsIDMwMDApKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGJsdWUgPiAyNTUKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDEwLCAxMCwgMjU2KSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPT0gbnVsbAotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG51bGwpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2lzRGlzcG9zZWQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxLCAyLCAzKTsKLQlDb2xvciBzYW1lQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMSwgMiwgMyk7Ci0JQ29sb3Igc2FtZUNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDEsIDIsIDMpKTsKLQlDb2xvciBvdGhlckNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDUsIDYsIDcpOwotCXRyeSB7Ci0JCS8vIFRlc3QgQ29sb3IuZXF1YWxzKE9iamVjdCkKLQkJYXNzZXJ0VHJ1ZSgiIWNvbG9yLmVxdWFscygoT2JqZWN0KW51bGwpIiwgIWNvbG9yLmVxdWFscygoT2JqZWN0KW51bGwpKTsKLQotCQkvLyBUZXN0IENvbG9yLmVxdWFscyhDb2xvcikKLQkJYXNzZXJ0VHJ1ZSgiIWNvbG9yLmVxdWFscygoQ29sb3IpbnVsbCkiLCAhY29sb3IuZXF1YWxzKChDb2xvciludWxsKSk7Ci0JCWFzc2VydFRydWUoImNvbG9yLmVxdWFscyhjb2xvcikiLCBjb2xvci5lcXVhbHMoY29sb3IpKTsKLQkJYXNzZXJ0VHJ1ZSgiY29sb3IuZXF1YWxzKHNhbWVDb2xvcikiLCBjb2xvci5lcXVhbHMoc2FtZUNvbG9yKSk7Ci0JCWFzc2VydFRydWUoImNvbG9yLmVxdWFscyhzYW1lQ29sb3IyKSIsIGNvbG9yLmVxdWFscyhzYW1lQ29sb3IyKSk7Ci0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMob3RoZXJDb2xvcikiLCAhY29sb3IuZXF1YWxzKG90aGVyQ29sb3IpKTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXNhbWVDb2xvci5kaXNwb3NlKCk7Ci0JCXNhbWVDb2xvcjIuZGlzcG9zZSgpOwotCQlvdGhlckNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qmx1ZSgpIHsKLQkvLyBUZXN0IENvbG9yLmdldEJsdWUoKQotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDI1NSk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKCJjb2xvci5nZXRCbHVlKCkiLCBjb2xvci5nZXRCbHVlKCksIDI1NSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmVlbigpIHsKLQkvLyBUZXN0IENvbG9yLmdldEdyZWVuKCkKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAyNTUsIDApOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscygiY29sb3IuZ2V0R3JlZW4oKSIsIGNvbG9yLmdldEdyZWVuKCksIDI1NSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JYXNzZXJ0Tm90TnVsbChjb2xvci5nZXRSR0IoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSR0IoMjU1LCAyNTUsIDI1NSksIGNvbG9yLmdldFJHQigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZWQoKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRSZWQoKQotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKCJjb2xvci5nZXRSZWQoKSIsIGNvbG9yLmdldFJlZCgpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMTIsIDM0LCA1Nik7Ci0JQ29sb3Igb3RoZXJDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMiwgMzQsIDU2KTsKLQlpZiAoY29sb3IuZXF1YWxzKG90aGVyQ29sb3IpKSB7Ci0JCWFzc2VydEVxdWFscygiSGFzaCBjb2RlcyBvZiBlcXVhbCBvYmplY3RzIHNob3VsZCBiZSBlcXVhbCIsIGNvbG9yLmhhc2hDb2RlKCksIG90aGVyQ29sb3IuaGFzaENvZGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gVGVzdCBDb2xvci5pc0Rpc3Bvc2VkKCkgZmFsc2UKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAzNCwgNjcsIDk4KTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJDb2xvciBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIiwgIWNvbG9yLmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBDb2xvci5pc0Rpc3Bvc2VkKCkgdHJ1ZQotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIkNvbG9yIHNob3VsZCBiZSBkaXNwb3NlZCIsIGNvbG9yLmlzRGlzcG9zZWQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDI1NSk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Tm90TnVsbChjb2xvci50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZShjb2xvci50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JCWFzc2VydEVxdWFscygiQ29sb3IgezAsIDAsIDI1NX0iLCBjb2xvci50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3MgcGxhdGZvcm0gb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCbHVlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmVlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCbHVlIikpIHRlc3RfZ2V0Qmx1ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JlZW4iKSkgdGVzdF9nZXRHcmVlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCIikpIHRlc3RfZ2V0UkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZWQiKSkgdGVzdF9nZXRSZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhZWZhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCS8vIFRlc3QgbmV3IEN1cnNvcihEZXZpY2UgZGV2aWNlLCBpbnQgc3R5bGUpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gYW4gdW5rbm93biBzdHlsZSBpcyBzcGVjaWZpZWQKLQotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9DUk9TUyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9BUFBTVEFSVElORyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9IRUxQKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVBTEwpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5FU1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5TKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOV1NFKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVXRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTik7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFUyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTkUpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVNFKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVTVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTlcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfVVBBUlJPVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9JQkVBTSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9OTyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWN1cnNvciA9IG5ldyBDdXJzb3IobnVsbCwgU1dULkNVUlNPUl9BUlJPVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHN0eWxlID4gU1dULkNVUlNPUl9IQU5EICgyMSkKLQl0cnkgewotCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIDEwMCk7Ci0JCWN1cnNvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0eWxlID4gU1dULkNVUlNPUl9IQU5EICgyMSkiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHN0eWxlIDwgMAotCXRyeSB7Ci0JCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgLTEwMCk7Ci0JCWN1cnNvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0eWxlIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkoKSB7Ci0JLy8gVGVzdCBuZXcgQ3Vyc29yKERldmljZSBkZXZpY2UsIEltYWdlRGF0YSBzb3VyY2UsIEltYWdlRGF0YSBtYXNrLCBpbnQgaG90c3BvdFgsIGludCBob3RzcG90WSkKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF07Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCUltYWdlRGF0YSBzb3VyY2UgPSBsb2FkZXIubG9hZChzdHJlYW0pWzBdOwotCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCWlmIChtYXNrICE9IG51bGwgJiYgKHNvdXJjZS5kZXB0aCA9PSAxKSkgewotCQkJQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgc291cmNlLCBtYXNrLCAwLCAwKTsKLQkJCWN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb250aW51ZTsKLQkJfQotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9pc0Rpc3Bvc2VkCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLyogTm90ZTogVHdvIGN1cnNvcnMgYXJlIG9ubHkgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGVpciBoYW5kbGVzIGFyZSBlcXVhbC4KLQkgKiBTbyBzaW5jZSBXaW5kb3dzIHJldXNlcyBjdXJzb3IgaGFuZGxlcywgYW5kIG90aGVyIHBsYXRmb3JtcyBkbyBub3QsCi0JICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB0ZXN0IHdoZXRoZXIgY3Vyc29yLmVxdWFscyhzYW1lQ3Vyc29yKS4KLQkgKi8KLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCUN1cnNvciBvdGhlckN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9DUk9TUyk7Ci0JdHJ5IHsKLQkJLy8gVGVzdCBDdXJzb3IuZXF1YWxzKE9iamVjdCkKLQkJYXNzZXJ0VHJ1ZSgiIWN1cnNvci5lcXVhbHMoKE9iamVjdCludWxsKSIsICFjdXJzb3IuZXF1YWxzKChPYmplY3QpbnVsbCkpOwotCi0JCS8vIFRlc3QgQ3Vyc29yLmVxdWFscyhDdXJzb3IpCi0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKChDdXJzb3IpbnVsbCkiLCAhY3Vyc29yLmVxdWFscygoQ3Vyc29yKW51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSgiY3Vyc29yLmVxdWFscyhjdXJzb3IpIiwgY3Vyc29yLmVxdWFscyhjdXJzb3IpKTsKLQkJYXNzZXJ0VHJ1ZSgiIWN1cnNvci5lcXVhbHMob3RoZXJDdXJzb3IpIiwgIWN1cnNvci5lcXVhbHMob3RoZXJDdXJzb3IpKTsKLQl9IGZpbmFsbHkgewotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlvdGhlckN1cnNvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9oYXNoQ29kZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gVGVzdCBDdXJzb3IuaXNEaXNwb3NlZCgpIGZhbHNlCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJDdXJzb3Igc2hvdWxkIG5vdCBiZSBkaXNwb3NlZCIsICFjdXJzb3IuaXNEaXNwb3NlZCgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBUZXN0IEN1cnNvci5pc0Rpc3Bvc2VkKCkgdHJ1ZQotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJDdXJzb3Igc2hvdWxkIGJlIGRpc3Bvc2VkIiwgY3Vyc29yLmlzRGlzcG9zZWQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JYXNzZXJ0Tm90TnVsbChjdXJzb3IudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShjdXJzb3IudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNzFkODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2UKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREUEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXB0aCgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVwdGggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXZpY2VEYXRhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXZpY2VEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTeXN0ZW1Db2xvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTeXN0ZW1Gb250KCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTeXN0ZW1Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2FybmluZ3MoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdhcm5pbmdzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRGlzcG9zZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXYXJuaW5nc1ooKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdhcm5pbmdzWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREUEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlcHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXZpY2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXYXJuaW5ncyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdhcm5pbmdzWiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RFBJIikpIHRlc3RfZ2V0RFBJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZXB0aCIpKSB0ZXN0X2dldERlcHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZXZpY2VEYXRhIikpIHRlc3RfZ2V0RGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1oiKSkgdGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIikpIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Gb250IikpIHRlc3RfZ2V0U3lzdGVtRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2FybmluZ3MiKSkgdGVzdF9nZXRXYXJuaW5ncygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXYXJuaW5nc1oiKSkgdGVzdF9zZXRXYXJuaW5nc1ooKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDg0NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2VEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlEZXZpY2VEYXRhIGRhdGEgPSBuZXcgRGV2aWNlRGF0YSgpOwotCWRhdGEuZGVidWcgPSB0cnVlOwotCWRhdGEudHJhY2tpbmcgPSB0cnVlOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1OWZmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EcmF3YWJsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRyYXdhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzODYwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLURpc3BsYXkgZGlzcGxheTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQkKLQkvLyBudWxsICBkZXZpY2UgYXJndW1lbnQKLQkKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IG5ldyBGb250RGF0YVsxXTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQobnVsbCxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyBudWxsIGRhdGEgYXJndW1lbnQKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSBudWxsOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JLy8gemVybyBsZW5ndGggZGF0YSBhcnJheQotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IG5ldyBGb250RGF0YVswXTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyBudWxsIGRhdGEgZWxlbWVudAotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IHsKLQkJCW51bGwsCi0JCQluZXcgRm9udERhdGEoKQotCQl9OwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZSgibnVsbCBkYXRhIGVsZW1lbnQgMCIsZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IHsKLQkJCW5ldyBGb250RGF0YSgpLAotCQkJbnVsbAotCQl9OwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZSgibnVsbCBkYXRhIGVsZW1lbnQgMSIsZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IHRoYXQgRm9udERhdGEgaXMgc2V0IGNvcnJlY3RseQotCQotCUZvbnREYXRhIGRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCUZvbnREYXRhW10gcmV0dXJuZWREYXRhID0gZm9udC5nZXRGb250RGF0YSgpOwotCWFzc2VydEVxdWFscyhkYXRhLHJldHVybmVkRGF0YVswXSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udChEZXZpY2UgZGV2aWNlLCBGb250RGF0YSBmZCkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZkIGFyZ3VtZW50IGlzIG51bGwKLQkvLyBTV1RFcnJvcjogRVJST1JfTk9fSEFORExFUywgaWYgYSBmb250IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIGZvbnQgZGF0YQotCi0JLy8gdmFsaWQgZm9udCB3aXRoIG5vIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YSgiIiwgMTAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCB1bmtub3duIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoImJhZC1mb250IiwgMTAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCAwIGhlaWdodCAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMDAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMDAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBib2xkIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULklUQUxJQykpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBmb250RGF0YSA9PSBudWxsCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIChGb250RGF0YSludWxsKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZvbnREYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIG5hbWUgPT0gbnVsbAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEobnVsbCwgMTAsIFNXVC5OT1JNQUwpKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgaGVpZ2h0IDwgMAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQkvLyBUZXN0IG5ldyBGb250KERldmljZSBkZXZpY2UsIFN0cmluZyBuYW1lLCBpbnQgaGVpZ2h0LCBpbnQgc3R5bGUpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGFyZ3VtZW50IGlzIG51bGwgb3IgdGhlIGhlaWdodCBpcyBuZWdhdGl2ZQotCS8vIFNXVEVycm9yOiBFUlJPUl9OT19IQU5ETEVTLCBpZiBhIGZvbnQgY291bGQgbm90IGJlIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzCi0KLQkvLyB2YWxpZCBmb250IHdpdGggbm8gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIiIsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCB1bmtub3duIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiYmFkLWZvbnQiLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggMCBoZWlnaHQgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgbm9ybWFsIDEwMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGl0YWxpYyAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChudWxsLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIG5hbWUgPT0gbnVsbAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBudWxsLCAxMCwgU1dULk5PUk1BTCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGhlaWdodCA8IDAKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0RmFsc2UoZm9udC5pc0Rpc3Bvc2VkKCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZm9udC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8vIEZvbnRzIGFyZSBvbmx5IGVxdWFsIGlmIHRoZWlyIGhhbmRsZXMgYXJlIHRoZSBzYW1lICg/ISkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250IG90aGVyRm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCS8vIFRlc3QgRm9udC5lcXVhbHMoT2JqZWN0KQotCQlhc3NlcnRUcnVlKCIhZm9udC5lcXVhbHMoKE9iamVjdCludWxsKSIsICFmb250LmVxdWFscygoT2JqZWN0KW51bGwpKTsKLQotCQkvLyBUZXN0IEZvbnQuZXF1YWxzKEZvbnQpCi0JCWFzc2VydFRydWUoIiFmb250LmVxdWFscygoRm9udCludWxsKSIsICFmb250LmVxdWFscygoRm9udCludWxsKSk7Ci0JCWFzc2VydFRydWUoImZvbnQuZXF1YWxzKGZvbnQpIiwgZm9udC5lcXVhbHMoZm9udCkpOwotCQlhc3NlcnRUcnVlKCIhZm9udC5lcXVhbHMob3RoZXJGb250KSIsICFmb250LmVxdWFscyhvdGhlckZvbnQpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQkJb3RoZXJGb250LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udERhdGEoKSB7Ci0JLy8gVGVzdCBGb250LmdldEZvbnREYXRhKCkKLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udAotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZvbnQgZGF0YSIsIGZvbnREYXRhICE9IG51bGwgJiYgZm9udERhdGEubGVuZ3RoID4gMCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgMTAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULk5PUk1BTCwgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCAyMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5CT0xEKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDIwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5CT0xELCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMzAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDMwLCBTV1QuSVRBTElDKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotLy8JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgMzAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULklUQUxJQywgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgNDAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDQwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotLy8JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgNDAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULkJPTEQgfCBTV1QuSVRBTElDLCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvLyB2YWxpZCAxMC1wb2ludCBmb250IHdpdGggdW5rbm93biBuYW1lCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotLy8JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgImJhZC1mb250IiwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDEwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5OT1JNQUwsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZm9udCxmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udC5oYXNoQ29kZSgpLGZvbnQuaGFzaENvZGUoKSk7Ci0JRm9udCBib2xkRm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsKLQlhc3NlcnRGYWxzZShmb250Lmhhc2hDb2RlKCkgPT0gYm9sZEZvbnQuaGFzaENvZGUoKSk7Ci0JYm9sZEZvbnQuZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gVGVzdCBGb250LmlzRGlzcG9zZWQoKSBmYWxzZQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoIkZvbnQgc2hvdWxkIG5vdCBiZSBkaXNwb3NlZCIsICFmb250LmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBGb250LmlzRGlzcG9zZWQoKSB0cnVlCi0JCWZvbnQuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJGb250IHNob3VsZCBiZSBkaXNwb3NlZCIsIGZvbnQuaXNEaXNwb3NlZCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0Tm90TnVsbChmb250LnRvU3RyaW5nKCkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCWFzc2VydE5vdE51bGwoZm9udC50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250RGF0YSIpKSB0ZXN0X2dldEZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjMzNjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udERhdGEoKQotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkvLyBUZXN0IG5ldyBGb250RGF0YShTdHJpbmcgc3RyaW5nKQotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIHJlY29uc3RydWN0ZWRGb250RGF0YSA9IG5ldyBGb250RGF0YShmZC50b1N0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoZmQsIHJlY29uc3RydWN0ZWRGb250RGF0YSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKFN0cmluZyBuYW1lLCBpbnQgaGVpZ2h0LCBpbnQgc3R5bGUpCi0JLy8gdmFsaWQgZm9udCBkYXRhIHdpdGggbm8gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JRm9udERhdGEgZmQgPSBuZXcgRm9udERhdGEoIiIsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIHVua25vd24gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZmQgPSBuZXcgRm9udERhdGEoImJhZC1mb250IiwgMTAsIFNXVC5OT1JNQUwpOwotCi0JLy8gdmFsaWQgZm9udCBkYXRhIHdpdGggMCBoZWlnaHQgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCAxMDAwIGhlaWdodCAocHJldHR5IGJpZywgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMDAwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250IGRhdGEKLQlmZCA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGJvbGQgMTAtcG9pbnQgZm9udCBkYXRhCi0JZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpOwotCi0JLy8gdmFsaWQgaXRhbGljIDEwLXBvaW50IGZvbnQgZGF0YQotCWZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udCBkYXRhCi0JZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIG5hbWUgPT0gbnVsbAotCXRyeSB7Ci0JCWZkID0gbmV3IEZvbnREYXRhKG51bGwsIDEwLCBTV1QuTk9STUFMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBoZWlnaHQgPCAwCi0JdHJ5IHsKLQkJZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRm9udERhdGEgZmQxID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIGZkMiA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZmQxLGZkMSk7Ci0JYXNzZXJ0RXF1YWxzKGZkMSxmZDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLQkvLyBGb250LmdldEhlaWdodCgpIHRlc3RlZCBpbiB0ZXN0X3NldEhlaWdodEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbGUoKSB7Ci0JLy8gRm9udERhdGEuZ2V0TG9jYWxlKCkgdGVzdGVkIGluIHRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCS8vIEZvbnQuZ2V0TmFtZSgpIHRlc3RlZCBpbiB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIEZvbnQuZ2V0U3R5bGUoKSB0ZXN0ZWQgaW4gdGVzdF9zZXRTdHlsZUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlGb250RGF0YSBmZDEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udERhdGEgZmQyID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscyhmZDEsZmQyKTsKLQlhc3NlcnRFcXVhbHMoZmQxLmhhc2hDb2RlKCksZmQyLmhhc2hDb2RlKCkpOwotCUZvbnREYXRhIGZkMyA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0RmFsc2UoZmQxLmhhc2hDb2RlKCkgPT0gZmQzLmhhc2hDb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlaWdodEkoKSB7Ci0JLy8gVGVzdCBGb250LnNldEhlaWdodChpbnQgIGhlaWdodCkKLQkvLyB2YWxpZCBub3JtYWwgZm9udCBkYXRhIGZvciB2YXJpb3VzIGhlaWdodHMKLQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotCi0JLy8gdmFsaWQgaXRhbGljIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULklUQUxJQyk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuRU5HTElTSDsKLQlmZC5zZXRMb2NhbGUobG9jYWxlLnRvU3RyaW5nKCkpOwotCWFzc2VydEVxdWFscyhMb2NhbGUuRU5HTElTSC50b1N0cmluZygpLGZkLmdldExvY2FsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gVGVzdCBGb250LnNldE5hbWUoU3RyaW5nIG5hbWUpCi0JLy8gdmFsaWQgbmFtZQotCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lKTsKLQotCS8vIHZhbGlkIG5hbWUgKHVua25vd24gbmFtZSwgYnV0IHZhbGlkKQotCWZvbnREYXRhLnNldE5hbWUoImJhZC1mb250Iik7Ci0JYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgZm9udERhdGEuZ2V0TmFtZSgpLCAiYmFkLWZvbnQiKTsKLQotCS8vIHZhbGlkIG5hbWUgKGVtcHR5IHN0cmluZywgYnV0IHZhbGlkKQotCS8vIG9ubHkgb24gd2luZG93cyBzaW5jZSBtb3RpZiBzdXBwb3J0cyBzZXBhcmF0ZSBmb250IGZvdW5kcmllcwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJZm9udERhdGEuc2V0TmFtZSgiIik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgIiIpOwotCX0KLQotCS8vIHZhbGlkIG5hbWUKLQlmb250RGF0YS5zZXROYW1lKFN3dEp1bml0LnRlc3RGb250TmFtZSk7CQotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lKTsKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250RGF0YS5zZXROYW1lKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdHlsZUkoKSB7Ci0JLy8gVGVzdCBGb250LnNldFN0eWxlKGludCAgc3R5bGUpCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YQotCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGhlaWdodCwgU1dULk5PUk1BTCk7CQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULk5PUk1BTCk7Ci0KLQkJLy8gdmFsaWQgYm9sZCBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULkJPTEQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULkJPTEQpOwotCi0JCS8vIHZhbGlkIGl0YWxpYyBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULklUQUxJQyk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3R5bGUiLCBmb250RGF0YS5nZXRTdHlsZSgpLCBTV1QuSVRBTElDKTsKLQkJCi0JCS8vIHZhbGlkIGJvbGQgaXRhbGljIGZvbnQgZGF0YQotCQlmb250RGF0YS5zZXRTdHlsZShTV1QuSVRBTElDIHwgU1dULkJPTEQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQotCQkvLyB2YWxpZCBub3JtYWwgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5OT1JNQUwpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULk5PUk1BTCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvbnREYXRhIGRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2FsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdHlsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYWxlIikpIHRlc3RfZ2V0TG9jYWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lIikpIHRlc3RfZ2V0TmFtZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVpZ2h0SSIpKSB0ZXN0X3NldEhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVJIikpIHRlc3Rfc2V0U3R5bGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTYwNjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlnYyA9IG5ldyBHQyhzaGVsbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWdjLmRpc3Bvc2UoKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRm9udE1ldHJpY3MgZm0xID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlGb250TWV0cmljcyBmbTIgPSBnYy5nZXRGb250TWV0cmljcygpOwotCWFzc2VydFRydWUoZm0xLmVxdWFscyhmbTIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBc2NlbnQoKSB7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCWZtLmdldEFzY2VudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF2ZXJhZ2VDaGFyV2lkdGgoKSB7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCWZtLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXNjZW50KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXREZXNjZW50KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVpZ2h0KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRIZWlnaHQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMZWFkaW5nKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRMZWFkaW5nKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JRm9udE1ldHJpY3MgZm0xID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlGb250TWV0cmljcyBmbTIgPSBnYy5nZXRGb250TWV0cmljcygpOwotCWlmIChmbTEuZXF1YWxzKGZtMikpIHsKLQkJYXNzZXJ0RXF1YWxzKGZtMS5oYXNoQ29kZSgpLCBmbTIuaGFzaENvZGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQygpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXNjZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXNjZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExlYWRpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXNjZW50IikpIHRlc3RfZ2V0QXNjZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoIikpIHRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVzY2VudCIpKSB0ZXN0X2dldERlc2NlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGVhZGluZyIpKSB0ZXN0X2dldExlYWRpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQyIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQygpOwotfQotCi0vKiBjdXN0b20gKi8KLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JR0MgZ2M7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjE4N2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygwLDMwLDI0MCwyOTApOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDIwMCwgMjAwKTsKLQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWdjLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUoKSB7Ci0JdHJ5IHsKLQkJR0MgZ2MgPSBuZXcgR0MobnVsbCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJR0MgZ2MxID0gbmV3IEdDKGltYWdlKTsKLQkJR0MgZ2MyID0gbmV3IEdDKGltYWdlKTsKLQkJZ2MxLmRpc3Bvc2UoKTsKLQkJZ2MyLmRpc3Bvc2UoKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIGltYWdlIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHsKLQkJLy8gTm8gcHJpbnRlciBpbnN0YWxsZWQuIFNraXAgdGVzdC4KLQkJcmV0dXJuOwotCX0KLQlDbGFzcyBwcmludGVyQ2xhc3MgPSBudWxsOwotCXRyeSB7Ci0JCXByaW50ZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIFByaW50ZXIgY2xhc3Mgbm90IHByZXNlbnQgKGVTV1QpLiBTa2lwIHRlc3QuCi0JCXJldHVybjsKLQl9Ci0JdHJ5IHsKLQkJLy8gRGlyZWN0IGluc3RhbnRpYXRpb24gcmVzdWx0cyBpbiBhIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGR1cmluZyBjbGFzcyAKLQkJLy8gbG9hZGluZy9pbml0aWFsaXphdGlvbi4gQ2FzdGluZyBzZWVtcyB0byBiZSBvay4KLQkJT2JqZWN0IHByaW50ZXIgPSBwcmludGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJR0MgZ2MxID0gbmV3IEdDKChQcmludGVyKSBwcmludGVyKTsKLQkJR0MgZ2MyID0gbmV3IEdDKChQcmludGVyKSBwcmludGVyKTsKLQkJZ2MxLmRpc3Bvc2UoKTsKLQkJZ2MyLmRpc3Bvc2UoKTsKLQkJKChQcmludGVyKSBwcmludGVyKS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIHByaW50ZXIiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBwcmludGVyIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJKCkgewotCXRyeSB7Ci0JCUdDIGdjID0gbmV3IEdDKG51bGwsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkcmF3YWJsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQl0cnkgewotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCQlHQyBnYzEgPSBuZXcgR0MoaW1hZ2UsIFNXVC5SSUdIVF9UT19MRUZUKTsKLQkJR0MgZ2MyID0gbmV3IEdDKGltYWdlLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCUdDIHRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5SSUdIVF9UT19MRUZUKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCXRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCWNhbnZhcy5kaXNwb3NlKCk7Ci0KLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSB7Ci0JCS8vIE5vIHByaW50ZXIgaW5zdGFsbGVkLiBTa2lwIHRlc3QuCi0JCXJldHVybjsKLQl9Ci0JQ2xhc3MgcHJpbnRlckNsYXNzID0gbnVsbDsKLQl0cnkgewotCQlwcmludGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlciIpOwotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLyBQcmludGVyIGNsYXNzIG5vdCBwcmVzZW50IChlU1dUKS4gU2tpcCB0ZXN0LgotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCS8vIERpcmVjdCBpbnN0YW50aWF0aW9uIHJlc3VsdHMgaW4gYSBOb0NsYXNzRGVmRm91bmRFcnJvciBkdXJpbmcgY2xhc3MgCi0JCS8vIGxvYWRpbmcvaW5pdGlhbGl6YXRpb24uIENhc3Rpbmcgc2VlbXMgdG8gYmUgb2suCi0JCU9iamVjdCBwcmludGVyID0gcHJpbnRlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCUdDIGdjMSA9IG5ldyBHQygoUHJpbnRlcilwcmludGVyLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JCUdDIGdjMiA9IG5ldyBHQygoUHJpbnRlcilwcmludGVyLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCSgoUHJpbnRlcikgcHJpbnRlcikuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBwcmludGVyIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgcHJpbnRlciIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weUFyZWFJSUlJSUkoKSB7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCVJHQiB3aGl0ZVJHQiA9IGdldFJlYWxSR0Iod2hpdGUpOwotCVJHQiBibHVlUkdCID0gZ2V0UmVhbFJHQihibHVlKTsKLQlpbnQgd2lkdGggPSAyMDsKLQlpbnQgaGVpZ2h0ID0gMjA7Ci0JaW50IGRlc3RYID0gMTA7Ci0JaW50IGRlc3RZID0gNTA7Ci0KLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGJsdWUpOwotCWdjLmZpbGxSZWN0YW5nbGUoNSwgMCwgNiwgMSk7Ci0JZ2MuY29weUFyZWEoMCwgMCwgd2lkdGgsIGhlaWdodCwgZGVzdFgsIGRlc3RZKTsKLQotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7IAotCWludCBwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDQsIGRlc3RZKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgNSwgZGVzdFkpOwotIAlhc3NlcnRFcXVhbHMoIjpiOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7CQotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgMTAsIGRlc3RZKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7CQotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgMTEsIGRlc3RZKTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHlBcmVhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCkgewotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlSR0Igd2hpdGVSR0IgPSBnZXRSZWFsUkdCKHdoaXRlKTsKLQlSR0IgYmx1ZVJHQiA9IGdldFJlYWxSR0IoYmx1ZSk7Ci0JCi0JZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShpbWFnZS5nZXRCb3VuZHMoKSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChibHVlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDUsIDAsIDYsIDEpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEyLCAxMik7Ci0JZ2MuY29weUFyZWEoaW1hZ2UsIDAsIDApOwotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7IAotCWludCBwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCg0LCAwKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDUsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgYmx1ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgxMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwkKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgxMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQlnYy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0FyY0lJSUlJSSgpIHsKLQlnYy5kcmF3QXJjKDEwLCAyMCwgNTAsIDI1LCA5MCwgOTApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3Rm9jdXNJSUlJKCkgewotCWdjLmRyYXdGb2N1cygxLCAxLCA1MCwgMjUpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkoKSB7Ci0JQ29sb3IgYzEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQlDb2xvciBjMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQlDb2xvciBjMyA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMCk7Ci0JCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZURhdGEgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtjMS5nZXRSR0IoKSwgYzIuZ2V0UkdCKCksIGMzLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKDMwLDMwLCA4LCBwYWxldHRlRGF0YSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQlpZiAoeCA+IHkpIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzEuZ2V0UkdCKCkpKTsKLQkJCWVsc2UgaWYgKHggPCB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMyLmdldFJHQigpKSk7Ci0JCQllbHNlIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzMuZ2V0UkdCKCkpKTsKLQkJfQotCX0KLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlkYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JZGF0YS50cmFuc3BhcmVudFBpeGVsID0gcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzEuZ2V0UkdCKCkpOwotCUltYWdlIGltYWdlVHJhbnNwYXJlbnQgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQlkYXRhLnNldEFscGhhKHgsIHksIDEyNyk7Ci0JCX0KLQl9CQkKLQlJbWFnZSBpbWFnZUFscGhhID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCQkJCQkJCQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMTAwLCAxMDApOwotCWdjLmRyYXdJbWFnZShpbWFnZVRyYW5zcGFyZW50LCAxMzAsIDEwMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlQWxwaGEsIDE2MCwgMTAwKTsKLQl0cnkgewotCQlnYy5kcmF3SW1hZ2UobnVsbCwgMTAwLCAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2VUcmFuc3BhcmVudC5kaXNwb3NlKCk7Ci0JaW1hZ2VBbHBoYS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJKCkgewotCUNvbG9yIGMxID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JQ29sb3IgYzIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JQ29sb3IgYzMgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDApOwotCQotCVBhbGV0dGVEYXRhIHBhbGV0dGVEYXRhID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7YzEuZ2V0UkdCKCksIGMyLmdldFJHQigpLCBjMy5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YSgzMCwzMCwgOCwgcGFsZXR0ZURhdGEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJaWYgKHggPiB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKSk7Ci0JCQllbHNlIGlmICh4IDwgeSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMi5nZXRSR0IoKSkpOwotCQkJZWxzZSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMzLmdldFJHQigpKSk7Ci0JCX0KLQl9Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKTsKLQlJbWFnZSBpbWFnZVRyYW5zcGFyZW50ID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJZGF0YS5zZXRBbHBoYSh4LCB5LCAxMjcpOwotCQl9Ci0JfQkJCi0JSW1hZ2UgaW1hZ2VBbHBoYSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJCQkJCQkKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCA1MCwgNjApOwotCWdjLmRyYXdJbWFnZShpbWFnZVRyYW5zcGFyZW50LCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgMTAsIDEwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VBbHBoYSwgMTAsIDUsIDIwLCAxNSwgMTAwLCAxMjAsIDIwLCAxNSk7Ci0JdHJ5IHsKLQkJZ2MuZHJhd0ltYWdlKG51bGwsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCA1MCwgNjApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2VBbHBoYS5kaXNwb3NlKCk7Ci0JaW1hZ2VUcmFuc3BhcmVudC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0xpbmVJSUlJKCkgewotCWdjLmRyYXdMaW5lKDAsMCwwLDIwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3T3ZhbElJSUkoKSB7Ci0JZ2MuZHJhd092YWwoMTAsIDAsIDIwLCAzMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdQb2ludElJKCkgewotCWdjLmRyYXdQb2ludCgxMCwgMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdQb2x5Z29uJEkoKSB7Ci0JZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHswLDAsIDUsMTAsIDAsMjB9KTsJCQkJCi0JZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHswLDB9KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1BvbHlsaW5lJEkoKSB7Ci0JZ2MuZHJhd1BvbHlsaW5lKG5ldyBpbnRbXSB7MCwwLCA1LDEwLCAwLDIwfSk7CQkJCQotCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W10gezAsMH0pOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSgpIHsKLQlnYy5kcmF3UmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApOwkJCQkKLQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JZ2MuZHJhd1JlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApKTsJCQkJCi0JZ2MuZHJhd1JlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJKCkgewotCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCAzLCAzKTsJCQkJCi0JZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKDAsIDAsIDAsIDAsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQlnYy5kcmF3U3RyaW5nKCJ0ZXN0IiwgNSwgNSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWigpIHsKLQlnYy5kcmF3U3RyaW5nKCJ0ZXN0IiwgNSwgNSwgdHJ1ZSk7CQkJCQotCWdjLmRyYXdTdHJpbmcoInRlc3QiLCA1LCA1LCBmYWxzZSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQlnYy5kcmF3VGV4dCgidGVzdCIsIDUsIDUpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSUkoKSB7CQkJCi0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIDApOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX01ORU1PTklDKTsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgU1dULkRSQVdfVEFCKTsKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgMCk7Ci0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIFNXVC5EUkFXX0RFTElNSVRFUik7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19NTkVNT05JQyk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19UQUIpOwkJCQkKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCAwKTsKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfREVMSU1JVEVSKTsKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCBTV1QuRFJBV19NTkVNT05JQyk7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfVEFCKTsKLQlnYy5kcmF3VGV4dCgiXHIiLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCJcbiIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoIiYiLCA1LCA1LCBTV1QuRFJBV19NTkVNT05JQyk7Ci0JZ2MuZHJhd1RleHQoIlx0IiwgNSwgNSwgU1dULkRSQVdfVEFCKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaKCkgewotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCB0cnVlKTsJCQkJCi0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIGZhbHNlKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIHRydWUpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgZmFsc2UpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlhc3NlcnRUcnVlKGdjLmVxdWFscyhnYykpOwotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JR0MgdGVzdEdDID0gbmV3IEdDKGNhbnZhcyk7Ci0JYXNzZXJ0RmFsc2UodGVzdEdDLmVxdWFscyhnYykpOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbEFyY0lJSUlJSSgpIHsKLQlnYy5maWxsQXJjKDEwLCAyMCwgNTAsIDI1LCA5MCwgOTApOwkJCQkKLQlnYy5maWxsQXJjKDEwLCAyMCwgNTAsIDI1LCAtMTAsIC0xMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaKCkgewotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCB0cnVlKTsJCQkJCi0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDAsIDAsIHRydWUpOwkJCQkKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgZmFsc2UpOwkJCQkKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgMCwgMCwgZmFsc2UpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsT3ZhbElJSUkoKSB7Ci0JZ2MuZmlsbE92YWwoMTAsIDAsIDIwLCAzMCk7CQkJCQotCWdjLmZpbGxPdmFsKC0xLCAtMSwgLTEsIC0xKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFBvbHlnb24kSSgpIHsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50W10gezAsMCwgNSwxMCwgMCwyMH0pOwkJCQkKLQlnYy5maWxsUG9seWdvbihuZXcgaW50W10gezAsMH0pOwkJCQkKLQlnYy5maWxsUG9seWdvbihuZXcgaW50W10gey0xLCAtMX0pOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsUmVjdGFuZ2xlSUlJSSgpIHsKLQlnYy5maWxsUmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCkpOwkJCQkKLQlnYy5maWxsUmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpOwkJCQkKLQlnYy5maWxsUmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoLTEsIC0xLCAtMSwgLTEpKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWdjLmZpbGxSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCk7CQkJCQotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMCwgMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSgpIHsKLQlnYy5maWxsUm91bmRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgMywgMyk7CQkJCQotCWdjLmZpbGxSb3VuZFJlY3RhbmdsZSgwLCAwLCAwLCAwLCAwLCAwKTsJCQkJCi0JZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIC0xMCwgLTEwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWR2YW5jZVdpZHRoQygpIHsKLQlpbnQgdyA9IGdjLmdldEFkdmFuY2VXaWR0aCgnYScpOwotCWFzc2VydFRydWUodyA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEJhY2tncm91bmQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhcldpZHRoQygpIHsKLQlpbnQgdyA9IGdjLmdldENoYXJXaWR0aCgnYScpOwotCWFzc2VydFRydWUodyA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaXBwaW5nKCkgewotCS8vIHRlc3RlZCBpbiBzZXRDbGlwcGluZyBtZXRob2RzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEZvbnQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udE1ldHJpY3MoKSB7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCWFzc2VydFRydWUoZm0uZ2V0SGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiBzZXRGb3JlZ3JvdW5kIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVTdHlsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0TGluZVN0eWxlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVXaWR0aCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0TGluZVdpZHRoIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JR0MgdGVzdEdDID0gbmV3IEdDKGNhbnZhcywgU1dULkxFRlRfVE9fUklHSFQpOwotCWludCBzdHlsZSA9IHRlc3RHQy5nZXRTdHlsZSgpOwotCWFzc2VydFRydWUoKHN0eWxlICYgU1dULkxFRlRfVE9fUklHSFQpICE9IDApOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci0JdGVzdEdDID0gbmV3IEdDKGNhbnZhcyk7Ci0Jc3R5bGUgPSB0ZXN0R0MuZ2V0U3R5bGUoKTsKLQlhc3NlcnRUcnVlKChzdHlsZSAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCXRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5SSUdIVF9UT19MRUZUKTsKLQlzdHlsZSA9IHRlc3RHQy5nZXRTdHlsZSgpOwotCWFzc2VydFRydWUoKHN0eWxlICYgIFNXVC5SSUdIVF9UT19MRUZUKSAhPSAwKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFhPUk1vZGUoKSB7Ci0JLy8gdGVzdGVkIGluIHNldFhPUk1vZGUgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JYXNzZXJ0VHJ1ZShnYy5oYXNoQ29kZSgpID09IGdjLmhhc2hDb2RlKCkpOwotCUdDIGdjMiA9IG5ldyBHQyhzaGVsbCk7Ci0JYXNzZXJ0RmFsc2UoZ2MuaGFzaENvZGUoKSA9PSBnYzIuaGFzaENvZGUoKSk7Ci0JZ2MyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0NsaXBwZWQoKSB7Ci0JYXNzZXJ0RmFsc2UoZ2MuaXNDbGlwcGVkKCkpOwotCWdjLnNldENsaXBwaW5nKDUsMTAsMTUsMjApOwotCWFzc2VydFRydWUoZ2MuaXNDbGlwcGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JYXNzZXJ0RmFsc2UoZ2MuaXNEaXNwb3NlZCgpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShnYy5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHNoZWxsLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGdjLmdldEJhY2tncm91bmQoKSk7Ci0JdHJ5IHsgCi0JCWdjLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgY29sb3IiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhnYy5nZXRCYWNrZ3JvdW5kKCksZ2MuZ2V0QmFja2dyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2xpcHBpbmdJSUlJKCkgewotCS8vIGludGVybWl0dGVudGx5IGZhaWxzIG9uIFhQIGZvciByZWFzb25zIHVua25vd24sIGNvbW1lbnQgb3V0IHRoZSB0ZXN0IGNhc2UKLQkvLyB1bnRpbCB0aGUgcHJvYmxlbSBpcyBmaWd1cmVkIG91dAotLy8JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIpOwotLy8Jc2hlbGwuc2V0U2l6ZSgxMTAsMTEwKTsKLS8vCWNhbnZhcy5zZXRTaXplKDEwMCwxMDApOwotLy8Jc2hlbGwub3BlbigpOwotLy8JR0MgdGVzdEdjID0gbmV3IEdDKGNhbnZhcyk7Ci0vLwl0ZXN0R2Muc2V0Q2xpcHBpbmcoMCw1LDEwLDIwKTsKLS8vCVJlY3RhbmdsZSByZWN0ID0gdGVzdEdjLmdldENsaXBwaW5nKCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueCA9PSAwKTsKLS8vCWFzc2VydFRydWUocmVjdC55ID09IDUpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LndpZHRoID09IDEwKTsKLS8vCWFzc2VydFRydWUocmVjdC5oZWlnaHQgPT0gMjApOwotLy8JdGVzdEdjLmRpc3Bvc2UoKTsKLS8vCWNhbnZhcy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQkvLyBpbnRlcm1pdHRlbnRseSBmYWlscyBvbiBYUCBmb3IgcmVhc29ucyB1bmtub3duLCBjb21tZW50IG91dCB0aGUgdGVzdCBjYXNlCi0JLy8gdW50aWwgdGhlIHByb2JsZW0gaXMgZmlndXJlZCBvdXQKLS8vCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLS8vCXNoZWxsLnNldFNpemUoMTEwLDExMCk7Ci0vLwljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLS8vCXNoZWxsLm9wZW4oKTsKLS8vCUdDIHRlc3RHYyA9IG5ldyBHQyhjYW52YXMpOwotLy8JdGVzdEdjLnNldENsaXBwaW5nKG5ldyBSZWN0YW5nbGUoMCw1LDEwLDIwKSk7Ci0vLwlSZWN0YW5nbGUgcmVjdCA9IHRlc3RHYy5nZXRDbGlwcGluZygpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnggPT0gMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueSA9PSA1KTsKLS8vCWFzc2VydFRydWUocmVjdC53aWR0aCA9PSAxMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QuaGVpZ2h0ID09IDIwKTsKLS8vCXRlc3RHYy5kaXNwb3NlKCk7Ci0vLwljYW52YXMuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCWdjLnNldEZvbnQoc2hlbGwuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUZvbnQoKSk7Ci0JRm9udCBmb250ID0gZ2MuZ2V0Rm9udCgpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHMoc2hlbGwuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUZvbnQoKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHNoZWxsLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGdjLmdldEZvcmVncm91bmQoKSk7Ci0JdHJ5IHsgCi0JCWdjLnNldEZvcmVncm91bmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgY29sb3IiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhnYy5nZXRGb3JlZ3JvdW5kKCksZ2MuZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCWdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZVN0eWxlSSgpIHsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfU09MSUQpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX0RBU0gpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfRE9UKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9EQVNIRE9UKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVERPVCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9EQVNIRE9URE9UKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lV2lkdGhJKCkgewotCWdjLnNldExpbmVXaWR0aCgxMCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lV2lkdGgoKSA9PSAxMCk7Ci0JZ2Muc2V0TGluZVdpZHRoKDApOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVdpZHRoKCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0WE9STW9kZVooKSB7Ci0JZ2Muc2V0WE9STW9kZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGdjLmdldFhPUk1vZGUoKSk7Ci0JZ2Muc2V0WE9STW9kZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UoZ2MuZ2V0WE9STW9kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlQb2ludCBwdCA9IGdjLnN0cmluZ0V4dGVudCgiYWJjIik7Ci0JYXNzZXJ0VHJ1ZShwdC54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShwdC55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVBvaW50IHB0ID0gZ2MudGV4dEV4dGVudCgiYWJjIik7Ci0JYXNzZXJ0VHJ1ZShwdC54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShwdC55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQlQb2ludCBwdCA9IGdjLnRleHRFeHRlbnQoImFiYyIsIDApOwotCWFzc2VydFRydWUocHQueCA+IDApOwotCWFzc2VydFRydWUocHQueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVN0cmluZyBzID0gZ2MudG9TdHJpbmcoKTsKLQlhc3NlcnROb3ROdWxsKHMpOwotCWFzc2VydFRydWUocy5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHlBcmVhSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0FyY0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0ZvY3VzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdMaW5lSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd092YWxJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UG9pbnRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1BvbHlnb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1BvbHlsaW5lJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdSZWN0YW5nbGVJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdSb3VuZFJlY3RhbmdsZUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbEFyY0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbEdyYWRpZW50UmVjdGFuZ2xlSUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxPdmFsSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFBvbHlnb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFJlY3RhbmdsZUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFJvdW5kUmVjdGFuZ2xlSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBZHZhbmNlV2lkdGhDIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyV2lkdGhDIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGlwcGluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udE1ldHJpY3MiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0WE9STW9kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzQ2xpcHBlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENsaXBwaW5nSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVTdHlsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFhPUk1vZGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weUFyZWFJSUlJSUkiKSkgdGVzdF9jb3B5QXJlYUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkiKSkgdGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdBcmNJSUlJSUkiKSkgdGVzdF9kcmF3QXJjSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3Rm9jdXNJSUlJIikpIHRlc3RfZHJhd0ZvY3VzSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIikpIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkiKSkgdGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdMaW5lSUlJSSIpKSB0ZXN0X2RyYXdMaW5lSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd092YWxJSUlJIikpIHRlc3RfZHJhd092YWxJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UG9pbnRJSSIpKSB0ZXN0X2RyYXdQb2ludElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UG9seWdvbiRJIikpIHRlc3RfZHJhd1BvbHlnb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1BvbHlsaW5lJEkiKSkgdGVzdF9kcmF3UG9seWxpbmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1JlY3RhbmdsZUlJSUkiKSkgdGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkiKSkgdGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWiIpKSB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJIikpIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWiIpKSB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxBcmNJSUlJSUkiKSkgdGVzdF9maWxsQXJjSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWiIpKSB0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsT3ZhbElJSUkiKSkgdGVzdF9maWxsT3ZhbElJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxQb2x5Z29uJEkiKSkgdGVzdF9maWxsUG9seWdvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUmVjdGFuZ2xlSUlJSSIpKSB0ZXN0X2ZpbGxSZWN0YW5nbGVJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSIpKSB0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWR2YW5jZVdpZHRoQyIpKSB0ZXN0X2dldEFkdmFuY2VXaWR0aEMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGFyV2lkdGhDIikpIHRlc3RfZ2V0Q2hhcldpZHRoQygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpcHBpbmciKSkgdGVzdF9nZXRDbGlwcGluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250TWV0cmljcyIpKSB0ZXN0X2dldEZvbnRNZXRyaWNzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZVN0eWxlIikpIHRlc3RfZ2V0TGluZVN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lV2lkdGgiKSkgdGVzdF9nZXRMaW5lV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFhPUk1vZGUiKSkgdGVzdF9nZXRYT1JNb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0NsaXBwZWQiKSkgdGVzdF9pc0NsaXBwZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDbGlwcGluZ0lJSUkiKSkgdGVzdF9zZXRDbGlwcGluZ0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVTdHlsZUkiKSkgdGVzdF9zZXRMaW5lU3R5bGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lV2lkdGhJIikpIHRlc3Rfc2V0TGluZVdpZHRoSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0WE9STW9kZVoiKSkgdGVzdF9zZXRYT1JNb2RlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci1TaGVsbCBzaGVsbDsKLUltYWdlIGltYWdlOwotR0MgZ2M7Ci0KLS8qKgotICogUmV0dXJuIHRoZSBhY3R1YWwgUkdCIHZhbHVlIHVzZWQgZm9yIHJlbmRlcmluZyBmb3IgdGhlIGdpdmVuIENvbG9yLgotICogVGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIENvbG9yJ3MgUkdCIHZhbHVlIG9uIGxvd2VyLWNvbG9yIGRpc3BsYXlzIAotICogKDE2YnBwIG9yIGxlc3MpLgotICovCi1SR0IgZ2V0UmVhbFJHQihDb2xvciBjb2xvcikgewotCUltYWdlIGNvbG9ySW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlHQyBpbWFnZUdjID0gbmV3IEdDKGNvbG9ySW1hZ2UpOwotCUltYWdlRGF0YSBpbWFnZURhdGE7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZTsKLQlpbnQgcGl4ZWw7Ci0JCi0JaW1hZ2VHYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCWltYWdlR2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWltYWdlRGF0YSA9IGNvbG9ySW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOwotCWltYWdlR2MuZGlzcG9zZSgpOwotCWNvbG9ySW1hZ2UuZGlzcG9zZSgpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCXJldHVybiBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1MmM4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQ0RhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQ0RhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzMTlmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKSB7Ci0JSW1hZ2UgaW1hZ2U7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgLTEsIDEwKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAwLCAxMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIC0yMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPD0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPD0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlJbWFnZSBpbWFnZTsKLQlSZWN0YW5nbGUgYm91bmRzID0gbnVsbDsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAxMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAxMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA9PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPT0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAtMSk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAwKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA9PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0ID09IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JLy8gdmFsaWQgaW1hZ2VzCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgtMSwgLTEwLCAxMCwgMTApOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWltYWdlID0gbmV3IEltYWdlKG51bGwsIGJvdW5kcyk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpIHsKLQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0vLwlQbGF0Zm9ybS1zcGVjaWZpYyB0ZXN0LiAgCi0vLwlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKSk7Ci0vLwl0cnkgewotLy8JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotLy8JCWltYWdlLmRpc3Bvc2UoKTsKLS8vCQlmYWlsKCJVbnN1cHBvcnRlZCBjb2xvciBkZXB0aCIpOwotLy8JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vCX0KLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBkYXRhKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKDB4MzAsIDB4MEMsIDB4MDMpKTsKLQkvLyBzZXQgcmVkIHBpeGVsIGF0IHg9OSwgeT05Ci0JZGF0YS5zZXRQaXhlbCg5LCA5LCAweDMwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlJbWFnZSBnY0ltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgZ2MgPSBuZXcgR0MoZ2NJbWFnZSk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQlJbWFnZURhdGEgZ2NJbWFnZURhdGEgPSBnY0ltYWdlLmdldEltYWdlRGF0YSgpOwotCWludCByZWRQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDksIDkpOwotCWFzc2VydEVxdWFscygiOmE6IiwgZ2V0UmVhbFJHQihkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKSwgZ2NJbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IocmVkUGl4ZWwpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZ2NJbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKCkgewotCUltYWdlRGF0YSBkYXRhID0gbnVsbDsKLQlJbWFnZURhdGEgZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSwgZGF0YTEpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2UgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2UgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBudWxsOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgbWFzayA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIG1hc2sgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlIHdpZHRoICE9IEltYWdlRGF0YSBtYXNrIHdpZHRoIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSB3aWR0aCAhPSBJbWFnZURhdGEgbWFzayB3aWR0aCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlIGhlaWdodCAhPSBJbWFnZURhdGEgbWFzayBoZWlnaHQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlIGhlaWdodCAhPSBJbWFnZURhdGEgbWFzayBoZWlnaHQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSwgZGF0YTEpOyAvLyBJbWFnZSBub3cgYWNjZXB0cyBtYXNrcyB3aGVyZSBkZXB0aCAhPSAxCi0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEoMHgzMCwgMHgwQywgMHgwMykpOwotCS8vIHNldCBvcGFxdWUgcmVkIHBpeGVsIGF0IHg9OSwgeT05Ci0JZGF0YS5zZXRQaXhlbCg5LCA5LCAweDMwKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWRhdGExLnNldFBpeGVsKDksIDksIDEpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQlJbWFnZSBnY0ltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgZ2MgPSBuZXcgR0MoZ2NJbWFnZSk7Ci0JQ29sb3IgYmFja2dyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7IAotCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQlJbWFnZURhdGEgZ2NJbWFnZURhdGEgPSBnY0ltYWdlLmdldEltYWdlRGF0YSgpOwotCWludCByZWRQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDksIDkpOwotCWFzc2VydEVxdWFscygiOmE6IiwgZ2V0UmVhbFJHQihkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKSwgZ2NJbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IocmVkUGl4ZWwpKTsKLQlpbnQgYmx1ZVBpeGVsID0gZ2NJbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBnZXRSZWFsUkdCKGJhY2tncm91bmRDb2xvciksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGJsdWVQaXhlbCkpOwotCWdjLmRpc3Bvc2UoKTsKLQlnY0ltYWdlLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtKCkgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZW1wdHkudHh0Iik7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgZSk7Ci0JCX0KLQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmludmFsaWRJbWFnZUZpbGVuYW1lc1swXTsKLQkJRGlzcGxheVtdIGRpc3BsYXlzID0ge2Rpc3BsYXksIG51bGx9OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGRpc3BsYXlzLmxlbmd0aDsgaisrKSB7Ci0JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vIEJ1ZyA3MDE2NyAtIEltYWdlKERldmljZSwgSW5wdXRTdHJlYW0pIHRocm93cyBpbmNvcnJlY3QgZXhjZXB0aW9uIGZvciBiYWQgUE5HCi0vLyByZW1vdmUgY29tbWVudCB3aGVuIGJ1ZyBpcyBmaXhlZC4KLS8vCQkJCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIElucHV0U3RyZWFtIiwgU1dULkVSUk9SX0lOVkFMSURfSU1BR0UsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oU3d0VGVzdENhc2UuaW52YWxpZEltYWdlRmlsZW5hbWVzWzFdKTsKLQkJdHJ5IHsKLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW1hZ2UgSW5wdXRTdHJlYW0iLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCX0JCQotCi0JCS8vIGNyZWF0ZSB2YWxpZCBpbWFnZXMKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJaW50IG51bUZpbGVOYW1lcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGs9MDsgazxudW1GaWxlTmFtZXM7IGsrKykgewotCQkJCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNba107CQkKLQkJCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZSh0ZW1wRGlzcGxheSwgc3RyZWFtKTsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGZpbGVOYW1lKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZpbGUgbmFtZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSAibm9uZXhpc3RlbnQudHh0IjsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5vbi1leGlzdGVudCBmaWxlIG5hbWUiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBub24tZXhpc3RlbnQgZmlsZSBuYW1lIiwgU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlIG5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLQlpZiAoIWlzSjJNRSgpKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKCJlbXB0eS50eHQiKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGUpOwotCQl9Ci0JCi0JCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQkJZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMF07Ci0JCURpc3BsYXlbXSBkaXNwbGF5cyA9IHtkaXNwbGF5LCBudWxsfTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCi0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHBhdGhOYW1lID0gZ2V0UGF0aChmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIpOwotCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJIEJ1ZyA3MDE2NyAtIEltYWdlKERldmljZSwgSW5wdXRTdHJlYW0pIHRocm93cyBpbmNvcnJlY3QgZXhjZXB0aW9uIGZvciBiYWQgUE5HCi0vLwkJCQkJIHJlbW92ZSBjb21tZW50IHdoZW4gYnVnIGlzIGZpeGVkLgotLy8JCQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW1hZ2UgZmlsZSBuYW1lIiwgU1dULkVSUk9SX0lOVkFMSURfSU1BR0UsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQl0cnkgewotCQkJU3RyaW5nIHBhdGhOYW1lID0gZ2V0UGF0aChTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMV0pOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBmaWxlIG5hbWUiKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW1hZ2UgZmlsZSBuYW1lIiwgU1dULkVSUk9SX0lOVkFMSURfSU1BR0UsIGUpOwotCQl9CQkKLQkKLQkJLy8gY3JlYXRlIHZhbGlkIGltYWdlcwotCQlmb3IgKGludCBqID0gMDsgaiA8IGRpc3BsYXlzLmxlbmd0aDsgaisrKSB7Ci0JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlpbnQgbnVtRmlsZU5hbWVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaz0wOyBrPG51bUZpbGVOYW1lczsgaysrKSB7Ci0JCQkJZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1trXTsKLQkJCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gaXNEaXNwb3NlZCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUltYWdlIGltYWdlID0gbnVsbDsKLQlJbWFnZSBpbWFnZTEgPSBudWxsOzsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCWltYWdlMSA9IGltYWdlOwotCQotCQlhc3NlcnRGYWxzZSgiOmE6IiwgaW1hZ2UuZXF1YWxzKG51bGwpKTsKLQkJCi0JCWFzc2VydFRydWUoIjpiOiIsIGltYWdlLmVxdWFscyhpbWFnZTEpKTsKLQkJCi0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJYXNzZXJ0RmFsc2UoIjpjOiIsIGltYWdlLmVxdWFscyhpbWFnZTEpKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlMS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIiwgU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQsIGUpOwotCX0KLQkvLyByZW1haW5kZXIgdGVzdGVkIGluIHNldEJhY2tncm91bmQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlY3RhbmdsZSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAyMCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiLCBTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCwgZSk7Ci0JfQotCQkKLQkvLyBjcmVhdGVzIGJpdG1hcCBpbWFnZQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JUmVjdGFuZ2xlIGJvdW5kczEgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBib3VuZHMsIGJvdW5kczEpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQlib3VuZHMxID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmI6IiwgYm91bmRzLCBib3VuZHMxKTsKLQotCS8vIGNyZWF0ZSBpY29uIGltYWdlCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JYm91bmRzMSA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGJvdW5kcywgYm91bmRzMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VEYXRhKCkgewkKLQlnZXRJbWFnZURhdGExKCk7Ci0JZ2V0SW1hZ2VEYXRhMigyNCwgbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpKTsJCQotCWdldEltYWdlRGF0YTIoMzIsIG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHhmZjAwLCAweGZmKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCUltYWdlIGltYWdlMSA9IG51bGw7OwotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJaW1hZ2UxID0gaW1hZ2U7Ci0JCi0JCWFzc2VydEVxdWFscygiOmE6IiwgaW1hZ2UxLmhhc2hDb2RlKCksIGltYWdlLmhhc2hDb2RlKCkpOwotCQkKLQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCWltYWdlMSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlib29sZWFuIGVxdWFscyA9IChpbWFnZTEuaGFzaENvZGUoKSA9PSBpbWFnZS5oYXNoQ29kZSgpKTsKLQkJYXNzZXJ0RmFsc2UoIjpiOiIsIGVxdWFscyk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZTEuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBqYXZhZG9jIHN0YXRlczoKLQkvLyA8Yj5JTVBPUlRBTlQ6PC9iPiBUaGlzIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgcHVibGljCi0JLy8gQVBJIGZvciA8Y29kZT5JbWFnZTwvY29kZT4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGphdmFkb2Mgc3RhdGVzOgotCS8vIDxiPklNUE9SVEFOVDo8L2I+IFRoaXMgbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiBwYXJ0IG9mIHRoZSBwdWJsaWMKLQkvLyBBUEkgZm9yIDxjb2RlPkltYWdlPC9jb2RlPgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlhc3NlcnRGYWxzZSgiOmE6IiwgaW1hZ2UuaXNEaXNwb3NlZCgpKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgaW1hZ2UuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCi0JdHJ5IHsKLQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCX0KLQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWltYWdlLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBjb2xvciIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGNvbG9yIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQl0cnkgewotCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIsIFNXVC5FUlJPUl9HUkFQSElDX0RJU1BPU0VELCBlKTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotCQotCS8vIHRoaXMgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhIHRyYW5zcGFyZW50IHBpeGVsIGJ5IGRlZmF1bHQgc28gc2V0QmFja2dyb3VuZCBoYXMgbm8gZWZmZWN0Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JY29sb3IgPSBpbWFnZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JYXNzZXJ0TnVsbCgiYmFja2dyb3VuZCBjb2xvciBzaG91bGQgYmUgbnVsbCBmb3Igbm9uLXRyYW5zcGFyZW50IGltYWdlIiwgY29sb3IpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQkvLyBjcmVhdGUgYW4gaW1hZ2Ugd2l0aCB0cmFuc3BhcmVuY3kgYW5kIHRoZW4gc2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAyLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBuZXcgUkdCKDUwLCAxMDAsIDE1MCl9KSk7Ci0JaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAwOyAvLyB0cmFuc3BhcmVudCBwaXhlbCBpcyBjdXJyZW50bHkgYmxhY2sKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCWltYWdlLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQljb2xvciA9IGltYWdlLmdldEJhY2tncm91bmQoKTsKLQlhc3NlcnRFcXVhbHMoImJhY2tncm91bmQgY29sb3Igc2hvdWxkIGhhdmUgYmVlbiBzZXQgdG8gZ3JlZW4iLCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTiksIGNvbG9yKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQl0cnkgewotCQlhc3NlcnROb3ROdWxsKGltYWdlLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKGltYWdlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfaW9fSW5wdXRTdHJlYW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfaW9fSW5wdXRTdHJlYW0iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfaW9fSW5wdXRTdHJlYW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlRGF0YSIpKSB0ZXN0X2dldEltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSgpOwotfQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci0KLS8qKiBUZXN0IGltcGxlbWVudGF0aW9uICoqLwotCi12b2lkIGdldEltYWdlRGF0YTEoKSB7Ci0JaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCUltYWdlRGF0YSBkYXRhMSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YTEpOwotCQlJbWFnZURhdGEgZGF0YTIgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIkltYWdlIHdpZHRoIHNob3VsZCBiZSB0aGUgc2FtZSIsIGRhdGExLndpZHRoLCBkYXRhMi53aWR0aCk7Ci0JCWFzc2VydEVxdWFscygiSW1hZ2UgaGVpZ2h0IHNob3VsZCBiZSB0aGUgc2FtZSIsIGRhdGExLmhlaWdodCwgZGF0YTIuaGVpZ2h0KTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb250aW51ZTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFZlcmlmeSBJbWFnZS5nZXRJbWFnZURhdGEgcmV0dXJucyBwaXhlbHMgd2l0aCB0aGUgc2FtZSBSR0IgdmFsdWUgYXMgdGhlCi0gKiBzb3VyY2UgaW1hZ2UuIFRoaXMgdGVzdCBvbmx5IG1ha2VzIHNlbnNlIHdpdGggZGVwdGggb2YgMjQgYW5kIDMyIGJpdHMuCi0gKi8KLXZvaWQgZ2V0SW1hZ2VEYXRhMihpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUpIHsKLQlpbnQgd2lkdGggPSAxMDsKLQlpbnQgaGVpZ2h0ID0gMTA7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMCk7Ci0JUkdCIGNvbG9yUkdCID0gY29sb3IuZ2V0UkdCKCk7Ci0KLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCi0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCWdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQkJCi0JSW1hZ2VEYXRhIG5ld0RhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlQYWxldHRlRGF0YSBuZXdQYWxldHRlID0gbmV3RGF0YS5wYWxldHRlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgewotCQlmb3IgKGludCBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBuZXdEYXRhLmdldFBpeGVsKGksIGopOwotCQkJUkdCIHJnYiA9IG5ld1BhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLQkJCWFzc2VydFRydWUoInJnYi5lcXVhbHMoY29sb3JSR0IpIiwgcmdiLmVxdWFscyhjb2xvclJHQikpOwotCQl9Ci0JfQotCWNvbG9yLmRpc3Bvc2UoKTsKLQlnYy5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotU3RyaW5nIGdldFBhdGgoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JU3RyaW5nIHVybFBhdGg7Ci0JCi0JU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JaWYgKHZlcmJvc2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JfQotCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHsKLQkJVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShmaWxlTmFtZSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJZmFpbCgiVVJMID09IG51bGwgZm9yIGZpbGUgIiArIGZpbGVOYW1lKTsKLQkJfQotCQl1cmxQYXRoID0gdXJsLmdldEZpbGUoKTsKLQl9IGVsc2UgewotCQl1cmxQYXRoID0gcGx1Z2luUGF0aCArICIvZGF0YS8iICsgZmlsZU5hbWU7Ci0JfQotCQotCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB1cmxQYXRoID0gdXJsUGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsJCi0JaWYgKFN3dEp1bml0LmlzV2luZG93cyAmJiB1cmxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSA9PSAwKSB1cmxQYXRoID0gdXJsUGF0aC5zdWJzdHJpbmcoMSk7Ci0JdXJsUGF0aCA9IHVybFBhdGgucmVwbGFjZUFsbCgiJTIwIiwgIiAiKTsJCi0JCi0JaWYgKHZlcmJvc2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZlZCBmaWxlIG5hbWUgZm9yICIgKyBmaWxlTmFtZSArICIgPSAiICsgdXJsUGF0aCk7Ci0JfQotCXJldHVybiB1cmxQYXRoOwotfQotUkdCIGdldFJlYWxSR0IoQ29sb3IgY29sb3IpIHsKLQlJbWFnZSBjb2xvckltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgaW1hZ2VHYyA9IG5ldyBHQyhjb2xvckltYWdlKTsKLQlJbWFnZURhdGEgaW1hZ2VEYXRhOwotCVBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0JaW50IHBpeGVsOwotCQotCWltYWdlR2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JaW1hZ2VHYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQlpbWFnZURhdGEgPSBjb2xvckltYWdlLmdldEltYWdlRGF0YSgpOwotCXBhbGV0dGUgPSBpbWFnZURhdGEucGFsZXR0ZTsKLQlpbWFnZUdjLmRpc3Bvc2UoKTsKLQljb2xvckltYWdlLmRpc3Bvc2UoKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKTsKLQlyZXR1cm4gcGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjY0ZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKCkgewotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoLTEsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAtMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAxLCBudWxsLCAwLCBuZXcgYnl0ZVtdIHt9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFsZXR0ZURhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAzLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB1bnN1cHBvcnRlZCBkZXB0aCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludFtdIHZhbGlkRGVwdGhzID0gezEsIDIsIDQsIDgsIDE2LCAyNCwgMzJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWREZXB0aHMubGVuZ3RoOyBpKyspIHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCB2YWxpZERlcHRoc1tpXSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl9OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQigpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKC0xLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgLTEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbnVsbCwgMCwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhbGV0dGVEYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDMsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVuc3VwcG9ydGVkIGRlcHRoIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50W10gdmFsaWREZXB0aHMgPSB7MSwgMiwgNCwgOCwgMTYsIDI0LCAzMn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZERlcHRocy5sZW5ndGg7IGkrKykgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIHZhbGlkRGVwdGhzW2ldLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCX07Ci0JCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgZGF0YSBpcyBudWxsCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDQsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGRhdGEiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyBkaXZpZGUgYnkgemVybyBleGNlcHRpb24gaWYgc2NhbmxpbmVQYWQgPT0gMAotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAwLCBuZXcgYnl0ZVtdIHt9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2NhbmxpbmVQYWQgPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlbXB0eS50eHQiKTsKLQkJdHJ5IHsKLQkJCW5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQluZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoZmlsZW5hbWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXSArICIuIiArIFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1swXSk7Ci0JCUltYWdlRGF0YSBkYXRhMSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJSW1hZ2VEYXRhIGRhdGEyID0gKEltYWdlRGF0YSkgZGF0YTEuY2xvbmUoKTsKLQkJLy8gaW1hZ2VEYXRhIGRvZXMgbm90IGltcGxlbWVudCBhbiBlcXVhbHMoT2JqZWN0KSBtZXRob2QKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCBkYXRhMS5hbHBoYSwgZGF0YTIuYWxwaGEpOwotCQlhc3NlcnRFcXVhbHMoIjpiOiIsIGRhdGExLmFscGhhRGF0YSwgZGF0YTIuYWxwaGFEYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCBkYXRhMS5ieXRlc1BlckxpbmUsIGRhdGEyLmJ5dGVzUGVyTGluZSk7Ci0JCWFzc2VydEVxdWFscygiOmQ6IiwgZGF0YTEuZGF0YSwgZGF0YTIuZGF0YSk7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgZGF0YTEuZGVsYXlUaW1lLCBkYXRhMi5kZWxheVRpbWUpOwotCQlhc3NlcnRFcXVhbHMoIjpmOiIsIGRhdGExLmRlcHRoLCBkYXRhMi5kZXB0aCk7Ci0JCWFzc2VydEVxdWFscygiOmc6IiwgZGF0YTEuZGlzcG9zYWxNZXRob2QsIGRhdGEyLmRpc3Bvc2FsTWV0aG9kKTsKLQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCBkYXRhMS5oZWlnaHQsIGRhdGEyLmhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiOmk6IiwgZGF0YTEubWFza0RhdGEsIGRhdGEyLm1hc2tEYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCBkYXRhMS5tYXNrUGFkLCBkYXRhMi5tYXNrUGFkKTsKLQkJYXNzZXJ0RXF1YWxzKCI6azoiLCBkYXRhMS5wYWxldHRlLCBkYXRhMi5wYWxldHRlKTsKLQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCBkYXRhMS5zY2FubGluZVBhZCwgZGF0YTIuc2NhbmxpbmVQYWQpOwotCQlhc3NlcnRFcXVhbHMoIjptOiIsIGRhdGExLnRyYW5zcGFyZW50UGl4ZWwsIGRhdGEyLnRyYW5zcGFyZW50UGl4ZWwpOwotCQlhc3NlcnRFcXVhbHMoIjpuOiIsIGRhdGExLnR5cGUsIGRhdGEyLnR5cGUpOwotCQlhc3NlcnRFcXVhbHMoIjpvOiIsIGRhdGExLndpZHRoLCBkYXRhMi53aWR0aCk7Ci0JCWFzc2VydEVxdWFscygiOnA6IiwgZGF0YTEueCwgZGF0YTIueCk7Ci0JCWFzc2VydEVxdWFscygiOnE6IiwgZGF0YTEueSwgZGF0YTIueSk7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFscGhhSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMjU1LCBpbWFnZURhdGEuZ2V0QWxwaGEoMCwgMCkpOwotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGEoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYShJTUFHRV9ESU1FTlNJT04sIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYSgwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhKDAsIElNQUdFX0RJTUVOU0lPTik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxwaGFzSUlJJEJJKCkgewotCWJ5dGUgdmFsdWU7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlieXRlW10gYWxwaGFEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0JCi0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmE6IiwgMCwgYWxwaGFEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgKGJ5dGUpIDI1NSwgYWxwaGFEYXRhW2ldKTsKLQkJfQotCX0KLQotCXZhbHVlID0gKGJ5dGUpIDB4QUE7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW10ge3ZhbHVlLCAoYnl0ZSkgKHZhbHVlKzEpLCAoYnl0ZSkgKHZhbHVlKzIpLCAoYnl0ZSkgKHZhbHVlKzMpLCAoYnl0ZSkgKHZhbHVlKzQpfTsKLQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBhbHBoYURhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRIKkdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRILCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhbHBoYXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKC0xLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKElNQUdFX0RJTUVOU0lPTiwgMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCAtMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCBJTUFHRV9ESU1FTlNJT04sIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgLTEsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCkpOwotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWwoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbChJTUFHRV9ESU1FTlNJT04sIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbCgwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVsKDAsIElNQUdFX0RJTUVOU0lPTik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW50IHdpZHRoID0gMzsKLQlpbnQgaGVpZ2h0ID0gMzsKLQlpbnQgZGVwdGggPSA0OwotCWJ5dGUgcGl4ZWxWYWx1ZSA9IDE7Ci0JYnl0ZVtdIGRhdGEgPSB7KGJ5dGUpICgocGl4ZWxWYWx1ZSA8PCA0KSArIHBpeGVsVmFsdWUpLCAoYnl0ZSkgKHBpeGVsVmFsdWUgPDwgNCksIChieXRlKSAoKHBpeGVsVmFsdWUgPDwgNCkgKyBwaXhlbFZhbHVlKSwgKGJ5dGUpIChwaXhlbFZhbHVlIDw8IDQpLCAoYnl0ZSkgKChwaXhlbFZhbHVlIDw8IDQpICsgcGl4ZWxWYWx1ZSksIChieXRlKSAocGl4ZWxWYWx1ZSA8PCA0KX07IAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgZGVwdGgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMjU1KSwgbmV3IFJHQigxMTEsIDExMSwgMTExKX0pLCAxLCBkYXRhKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotCQkJaW50IHBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCYWQgcGl4ZWwgZGF0YSIsIHBpeGVsVmFsdWUsIHBpeGVsKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbHNJSUkkQkkoKSB7Ci0JYnl0ZSB2YWx1ZTsKLQlmaW5hbCBpbnQgU0laRSA9IDIwOyAKLQlmaW5hbCBpbnQgR0VUX1dJRFRIID0gMTA7Ci0JZmluYWwgaW50IE9GRlNFVCA9IDEwOwotCWJ5dGVbXSBwaXhlbERhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgxLCAweDEsIDB4MSwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpnOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjppOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmo6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6azoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmw6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgOCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6bToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHhGLCAoYnl0ZSkweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpvOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6cDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRIKkdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKC0xLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKElNQUdFX0RJTUVOU0lPTiwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAtMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCBJTUFHRV9ESU1FTlNJT04sIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgLTEsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsJCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBkZXB0aCIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiLCBTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbHNJSUkkSUkoKSB7Ci0JaW50IHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBHRVRfV0lEVEggPSAxMDsKLQlmaW5hbCBpbnQgT0ZGU0VUID0gMTA7Ci0JaW50W10gcGl4ZWxEYXRhID0gbmV3IGludFtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHgyLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmo6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6azoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA4IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjptOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4RiwgMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6cDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAxNiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxNiwgbmV3IFBhbGV0dGVEYXRhKDB4RjgwMCwgMHg3RTAsIDB4MUYpKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjpxOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4MiwgMHhGLCAweEZGLCAweEZGQUF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpyOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOnM6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMjQgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMjQsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6dToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6djoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp3OiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp4OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDMyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDMyLCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6eToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBMDB9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp6OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmFhOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphYjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgqR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIChpbnRbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygtMSwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgLTEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCcygpIHsKLQlhc3NlcnROdWxsKCI6YToiLCBpbWFnZURhdGEuZ2V0UkdCcygpKTsKLQlSR0JbXSByZ2JzID0gbmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9OwotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShyZ2JzKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCByZ2JzLCBpbWFnZURhdGEuZ2V0UkdCcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrKCkgewotLy8JQnVnIDcxNDcyIC0gdHJhbnNwYXJlbmN5IG1hc2sgc2hvdWxkIGJlIG51bGwJCi0vLwlhc3NlcnROdWxsKCI6YToiLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpKTsKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzWzBdKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JYXNzZXJ0Tm90TnVsbCgiOmI6IiwgbWFza0RhdGEpOwotCi0vLwlCdWcgNzE0NzIgLSB0cmFuc3BhcmVuY3kgbWFzayBzaG91bGQgYmUgbnVsbAkKLS8qCWltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VGaWxlbmFtZXNbMF0gKyAnLicgKyBpbWFnZUZvcm1hdHNbaW1hZ2VGb3JtYXRzLmxlbmd0aC0xXSkpOwotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCW1hc2tEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQlhc3NlcnROdWxsKCI6YzoiLCBtYXNrRGF0YSk7Ci0qLwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc3BhcmVuY3lUeXBlKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgU1dULlRSQU5TUEFSRU5DWV9OT05FLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpKTsKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzWzBdKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWFzc2VydEZhbHNlKCI6YjoiLCBTV1QuVFJBTlNQQVJFTkNZX05PTkUgPT0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSk7Ci0JCi0Jc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlRmlsZW5hbWVzWzBdICsgJy4nICsgaW1hZ2VGb3JtYXRzW2ltYWdlRm9ybWF0cy5sZW5ndGgtMV0pOwotCWltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBTV1QuVFJBTlNQQVJFTkNZX05PTkUsIGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgQVBJCi0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPi4gSXQgaXMgbWFya2VkIHB1YmxpYyBvbmx5IHNvIHRoYXQgaXQKLQkvLyBjYW4gYmUgc2hhcmVkIHdpdGhpbiB0aGUgcGFja2FnZXMgcHJvdmlkZWQgYnkgU1dULiBJdCBpcyBzdWJqZWN0Ci0JLy8gdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tCi0JLy8gYXBwbGljYXRpb24gY29kZS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zY2FsZWRUb0lJKCkgewotCWZpbmFsIGludCBpbWFnZURpbWVuc2lvbiA9IDg7Ci0JUkdCW10gcmdicyA9IG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfTsKLQlieXRlW10gcGl4ZWxEYXRhID0gbmV3IGJ5dGVbKGltYWdlRGltZW5zaW9uKmltYWdlRGltZW5zaW9uKSAvIDhdOwotCQotCXBpeGVsRGF0YVswXSA9IDB4NEY7Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZURpbWVuc2lvbiwgaW1hZ2VEaW1lbnNpb24sIDEsIG5ldyBQYWxldHRlRGF0YShyZ2JzKSwgMSwgcGl4ZWxEYXRhKTsKLQotCUltYWdlRGF0YSBzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oLWltYWdlRGltZW5zaW9uLCAtaW1hZ2VEaW1lbnNpb24pOwotCWJ5dGVbXSBzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbl07Ci0Jc2NhbGVkSW1hZ2VEYXRhLmdldFBpeGVscygwLCBpbWFnZURpbWVuc2lvbiAtIDEsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWJ5dGVbXSBleHBlY3RlZFBpeGVsRGF0YSA9IG5ldyBieXRlW10gezB4MSwgMHgxLCAweDEsIDB4MSwgMCwgMCwgMHgxLCAwfTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGV4cGVjdGVkUGl4ZWxEYXRhLCBzY2FsZWRQaXhlbERhdGEpOwotCi0Jc2NhbGVkSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnNjYWxlZFRvKGltYWdlRGltZW5zaW9uICogMTAsIGltYWdlRGltZW5zaW9uKTsKLQlzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbiAqIDEwXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDAsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWFzc2VydEVxdWFscygiOmI6IiwgMCwgc2NhbGVkUGl4ZWxEYXRhWzBdKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIDAsIHNjYWxlZFBpeGVsRGF0YVsxXSk7Ci0KLQlzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oaW1hZ2VEaW1lbnNpb24sIGltYWdlRGltZW5zaW9uICogMTApOwotCXNjYWxlZFBpeGVsRGF0YSA9IG5ldyBieXRlW2ltYWdlRGltZW5zaW9uXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDAsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWV4cGVjdGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbXSB7MCwgMHgxLCAwLCAwLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWFzc2VydEVxdWFscygiOmQ6IiwgZXhwZWN0ZWRQaXhlbERhdGEsIHNjYWxlZFBpeGVsRGF0YSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxwaGFJSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmE6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoLTEsIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoSU1BR0VfRElNRU5TSU9OLCAxLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKDAsIC0xLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKDAsIElNQUdFX0RJTUVOU0lPTiwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFscGhhc0lJSSRCSSgpIHsKLQlieXRlIHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWJ5dGVbXSBhbHBoYURhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQkKLQl2YWx1ZSA9IChieXRlKSAweEFBOwotCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVtdIHt2YWx1ZSwgKGJ5dGUpICh2YWx1ZSsxKSwgKGJ5dGUpICh2YWx1ZSsyKSwgKGJ5dGUpICh2YWx1ZSszKSwgKGJ5dGUpICh2YWx1ZSs0KX07Ci0JaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIGFscGhhRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIGFscGhhRGF0YVtpXSk7Ci0JCX0KLQl9Ci0JCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04qSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIChieXRlW10pIG51bGwsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWxwaGFzID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoLTEsIDEsIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoSU1BR0VfRElNRU5TSU9OLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIC0xLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCAtMSwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQaXhlbElJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JdmFsdWUgPSAweEFBOwotCWltYWdlRGF0YS5zZXRQaXhlbCgwLCAwLCB2YWx1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB2YWx1ZSwgaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApKTsKLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbCgtMSwgMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbChJTUFHRV9ESU1FTlNJT04sIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgLTEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgSU1BR0VfRElNRU5TSU9OLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxzSUlJJEJJKCkgewotCWJ5dGUgdmFsdWU7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IE9GRlNFVCA9IDE7Ci0JYnl0ZVtdIHBpeGVsRGF0YSA9IG5ldyBieXRlW1NJWkVdOwotCi0JLy8gdGVzdCAxIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHgyLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4NCwgMHhGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmU6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgOCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweEYsIChieXRlKTB4RkZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OKklNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKC0xLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKElNQUdFX0RJTUVOU0lPTiwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAtMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCBJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgLTEsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsJCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBkZXB0aCIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiLCBTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQaXhlbHNJSUkkSUkoKSB7Ci0JaW50IHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWludFtdIHBpeGVsRGF0YSA9IG5ldyBpbnRbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweEYsIDB4RkZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpoOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDE2IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDE2LCBuZXcgUGFsZXR0ZURhdGEoMHhGODAwLCAweDdFMCwgMHgxRikpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweDIsIDB4RiwgMHhGRiwgMHhGRkFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmk6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyNCwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjprOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmw6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMzIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQTAwfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOm06IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04qSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIChpbnRbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvbmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFscGhhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFscGhhc0lJSSRCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxzSUlJJEJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQaXhlbHNJSUkkSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zcGFyZW5jeU1hc2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NjYWxlZFRvSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFscGhhSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbHBoYXNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQaXhlbHNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsc0lJSSRJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQiIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9uZSIpKSB0ZXN0X2Nsb25lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbHBoYUlJIikpIHRlc3RfZ2V0QWxwaGFJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxwaGFzSUlJJEJJIikpIHRlc3RfZ2V0QWxwaGFzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbElJIikpIHRlc3RfZ2V0UGl4ZWxJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxzSUlJJEJJIikpIHRlc3RfZ2V0UGl4ZWxzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbHNJSUkkSUkiKSkgdGVzdF9nZXRQaXhlbHNJSUkkSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQnMiKSkgdGVzdF9nZXRSR0JzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrIikpIHRlc3RfZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSIpKSB0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkiKSkgdGVzdF9pbnRlcm5hbF9uZXdJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCSSRCJEJJSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zY2FsZWRUb0lJIikpIHRlc3Rfc2NhbGVkVG9JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxwaGFJSUkiKSkgdGVzdF9zZXRBbHBoYUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxwaGFzSUlJJEJJIikpIHRlc3Rfc2V0QWxwaGFzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbElJSSIpKSB0ZXN0X3NldFBpeGVsSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbHNJSUkkQkkiKSkgdGVzdF9zZXRQaXhlbHNJSUkkQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBpeGVsc0lJSSRJSSIpKSB0ZXN0X3NldFBpeGVsc0lJSSRJSSgpOwotfQotLyogY3VzdG9tICovCi1JbWFnZURhdGEgaW1hZ2VEYXRhOwotZmluYWwgaW50IElNQUdFX0RJTUVOU0lPTiA9IDEwOwotCi12b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgYnl0ZSBleHBlY3RlZFtdLCBieXRlIGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCXJldHVybjsKLQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQllcXVhbCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pIHsKLQkJCQllcXVhbCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCWlmICghZXF1YWwpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZD0gIiI7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpCi0JCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCQlmYWlsKGZvcm1hdHRlZCsiZXhwZWN0ZWQ6PCIrZXhwZWN0ZWQrIj4gYnV0IHdhczo8IithY3R1YWwrIj4iKTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2MTdmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlJbWFnZUxvYWRlckxpc3RlbmVyIGxvYWRlckxpc3RlbmVyID0gbmV3IEltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGltYWdlRGF0YUxvYWRlZChJbWFnZUxvYWRlckV2ZW50IGUpIHsKLQkJCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RmFsc2UoIjphOiIsIGxvYWRlci5oYXNMaXN0ZW5lcnMoKSk7Ci0JbG9hZGVyLmFkZEltYWdlTG9hZGVyTGlzdGVuZXIobG9hZGVyTGlzdGVuZXIpOwotCWFzc2VydFRydWUoIjpiOiIsIGxvYWRlci5oYXNMaXN0ZW5lcnMoKSk7Ci0KLQlsb2FkZXJMaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImludGVybGFjZWRfdGFyZ2V0LnBuZyIpOwkKLQlsb2FkZXIubG9hZChzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgbG9hZGVyTGlzdGVuZXJDYWxsZWQpOwotCi0JbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0YXJnZXQucG5nIik7CQotCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlhc3NlcnRGYWxzZSgiOmQ6IiwgbG9hZGVyTGlzdGVuZXJDYWxsZWQpOwotCi0JbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlsb2FkZXIubm90aWZ5TGlzdGVuZXJzKG5ldyBJbWFnZUxvYWRlckV2ZW50KGxvYWRlciwgbG9hZGVyLmRhdGFbMF0sIDAsIHRydWUpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBsb2FkZXJMaXN0ZW5lckNhbGxlZCk7Ci0KLQlsb2FkZXIucmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lcihsb2FkZXJMaXN0ZW5lcik7Ci0JYXNzZXJ0RmFsc2UoIjpmOiIsIGxvYWRlci5oYXNMaXN0ZW5lcnMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzTGlzdGVuZXJzKCkgewotCS8vIHRlc3RlZCBpbiBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbG9hZCBpbnB1dFN0cmVhbSA9PSBudWxsIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVtcHR5LnR4dCIpOwotCQl0cnkgewotCQkJbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbG9hZCBmcm9tIGludmFsaWQgaW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JdHJ5IHsKLQkJbG9hZGVyLmxvYWQoZmlsZW5hbWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2FkIGZpbGVuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBqMnNlIGFuZCBqMm1lKGNkYykgY2FuIGxvYWQgZnJvbSBhIGZpbGVuYW1lIGJ1dCwgajJtZShjbGRjKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfbm90aWZ5TGlzdGVuZXJzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KCkgewotCS8vIHRlc3RlZCBpbiBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZEltYWdlTG9hZGVyTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkoKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG51bGw7Ci0JSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIuc2F2ZShvdXRTdHJlYW0sIDApOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F2ZSBvdXRwdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCi0JCW91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCWxvYWRlci5zYXZlKG91dFN0cmVhbSwgLTEpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F2ZSB0byBpbnZhbGlkIG91dHB1dFN0cmVhbSBmb3JtYXQiKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQlib29sZWFuIGpwZ1N1cHBvcnRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpPTA7IGk8aW1hZ2VGb3JtYXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW1hZ2VGb3JtYXRzW2ldLmVxdWFscygianBnIikpIHsKLQkJCQlqcGdTdXBwb3J0ZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChqcGdTdXBwb3J0ZWQpIHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQkJLy8gbXVzdCB1c2UganBnIHNpbmNlIHNhdmUgaXMgbm90IGltcGxlbWVudGVkIHlldCBpbiBwbmcgZm9ybWF0CQkKLQkJCVN0cmluZyBmaWxldHlwZSA9ICJqcGciOwotCQkJaW5TdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lICsgIi4iICsgZmlsZXR5cGUpOwkKLQkJCWxvYWRlci5sb2FkKGluU3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlRm9ybWF0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpbWFnZUZvcm1hdHNbaV0uZXF1YWxzKGZpbGV0eXBlKSkgewotCQkJCQkvLyBzYXZlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQKLQkJCQkJbG9hZGVyLnNhdmUob3V0U3RyZWFtLCBpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCW91dFN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQl0cnkgewotCQlsb2FkZXIuc2F2ZShmaWxlbmFtZSwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdmUgZmlsZW5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGoyc2UgYW5kIGoybWUoY2RjKSBjYW4gbG9hZCBmcm9tIGEgZmlsZW5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc0xpc3RlbmVycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpKSB0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc0xpc3RlbmVycyIpKSB0ZXN0X2hhc0xpc3RlbmVycygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtIikpIHRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpKSB0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JIikpIHRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci19Ci0vKiBjdXN0b20gKi8KLWJvb2xlYW4gbG9hZGVyTGlzdGVuZXJDYWxsZWQ7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDk4ODRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlckV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlaKCkgewotCXRyeSB7Ci0JCW5ldyBJbWFnZUxvYWRlckV2ZW50KG51bGwsIG51bGwsIDAsIHRydWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZUxvYWRlciBzb3VyY2UgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW5ldyBJbWFnZUxvYWRlckV2ZW50KG5ldyBJbWFnZUxvYWRlcigpLCBudWxsLCAwLCB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlJbWFnZUxvYWRlckV2ZW50IGV2ZW50ID0gbmV3IEltYWdlTG9hZGVyRXZlbnQobmV3IEltYWdlTG9hZGVyKCksIG51bGwsIDAsIHRydWUpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJWiIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDY1ZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlckxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpKSB0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JkZDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQl0cnkgewotCQluZXcgUGFsZXR0ZURhdGEobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHt9KTsKLQlhc3NlcnRGYWxzZSgiOmE6IiwgZGF0YS5pc0RpcmVjdCk7Ci0KLQluZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtudWxsLCBudWxsfSk7Ci0JYXNzZXJ0RmFsc2UoIjpiOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pOwotCWFzc2VydEZhbHNlKCI6YzoiLCBkYXRhLmlzRGlyZWN0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDAsIDAsIDApOwotCWFzc2VydFRydWUoIjphOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgtMSwgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBkYXRhLmlzRGlyZWN0KTsKLQotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZGF0YS5pc0RpcmVjdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQkvLyBpbmRleGVkIHBhbGV0dGUgdGVzdHMJCi0JUkdCW10gcmdicyA9IHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBuZXcgUkdCKDUwLCAxMDAsIDE1MCl9OwotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCi0JdHJ5IHsKLQkJZGF0YS5nZXRQaXhlbChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXhlZCBwYWxldHRlIHdpdGggcmdiID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCWRhdGEuZ2V0UGl4ZWwobmV3IFJHQigwLCAwLCAxKSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiBub3QgZm91bmQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCByZ2JzLmxlbmd0aC0xLCBkYXRhLmdldFBpeGVsKHJnYnNbcmdicy5sZW5ndGgtMV0pKTsKLQkKLQkvLyBkaXJlY3QgcGFsZXR0ZSB0ZXN0cwkKLQlSR0IgcmdiID1uZXcgUkdCKDB4MzIsIDB4NjQsIDB4OTYpOwotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JCi0JdHJ5IHsKLQkJZGF0YS5nZXRQaXhlbChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlyZWN0IHBhbGV0dGUgd2l0aCByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjpiOiIsIDB4MzI2NDk2LCBkYXRhLmdldFBpeGVsKHJnYikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQkkoKSB7Ci0JLy8gaW5kZXhlZCBwYWxldHRlIHRlc3RzCQotCVJHQltdIHJnYnMgPSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgbmV3IFJHQig1MCwgMTAwLCAxNTApfTsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCi0JdHJ5IHsKLQkJZGF0YS5nZXRSR0Iocmdicy5sZW5ndGgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBub25leGlzdGVudCBwaXhlbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIHJnYnNbcmdicy5sZW5ndGgtMV0sIGRhdGEuZ2V0UkdCKHJnYnMubGVuZ3RoLTEpKTsKLQotCS8vIGRpcmVjdCBwYWxldHRlIHRlc3RzCQotCVJHQiByZ2IgPW5ldyBSR0IoMHgzMiwgMHg2NCwgMHg5Nik7Ci0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQkKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHJnYiwgZGF0YS5nZXRSR0IoMHgzMjY0OTYpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0JzKCkgewotCS8vIGluZGV4ZWQgcGFsZXR0ZSB0ZXN0cwkKLQlSR0JbXSByZ2JzID0ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9OwotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCByZ2JzLCBkYXRhLmdldFJHQnMoKSk7Ci0JCi0JLy8gZGlyZWN0IHBhbGV0dGUgdGVzdHMJCi0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQkKLQlhc3NlcnROdWxsKCI6YjoiLCBkYXRhLmdldFJHQnMoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCcyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X0NvbnN0cnVjdG9yJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCSSIpKSB0ZXN0X2dldFJHQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQnMiKSkgdGVzdF9nZXRSR0JzKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTIwYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCS8vIFRlc3QgbmV3IFBvaW50IChpbnQgeCwgaW50IHkpCi0JUG9pbnQgcCA9IG5ldyBQb2ludCgzLCA0KTsKLQlhc3NlcnRFcXVhbHMoMywgcC54KTsKLQlhc3NlcnRFcXVhbHMoNCwgcC55KTsKLQotCXAgPSBuZXcgUG9pbnQoLTQsIC0zKTsKLQlhc3NlcnRFcXVhbHMoLTQsIHAueCk7Ci0JYXNzZXJ0RXF1YWxzKC0zLCBwLnkpOwotCi0JcCA9IG5ldyBQb2ludCg1MDAwMDAsIDcwMDAwMCk7Ci0JYXNzZXJ0RXF1YWxzKDUwMDAwMCwgcC54KTsKLQlhc3NlcnRFcXVhbHMoNzAwMDAwLCBwLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVBvaW50IHAxID0gbmV3IFBvaW50KDUsIDUpOwotCVBvaW50IHAyID0gbmV3IFBvaW50KDUsIDUpOwotCWFzc2VydFRydWUoIlBvaW50cyBzaG91bGQgYmUgZXF1YWwiLCBwMS5lcXVhbHMocDIpKTsKLQotCXAxID0gbmV3IFBvaW50KC01LCAtNSk7Ci0JcDIgPSBuZXcgUG9pbnQoLTUsIC01KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIGJlIGVxdWFsIiwgcDEuZXF1YWxzKHAyKSk7Ci0KLQlwMiA9IG5ldyBQb2ludCgzLCA0KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFwMS5lcXVhbHMocDIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlQb2ludCBwMSA9IG5ldyBQb2ludCg1LCA1KTsKLQlQb2ludCBwMiA9IG5ldyBQb2ludCg1LCA1KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaENvZGUiLCBwMS5oYXNoQ29kZSgpID09IHAyLmhhc2hDb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVBvaW50IHAgPSBuZXcgUG9pbnQoMywgNCk7Ci0JYXNzZXJ0Tm90TnVsbChwLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUocC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JYXNzZXJ0RXF1YWxzKCJQb2ludCB7MywgNH0iLCBwLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkMGJhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJKCkgewotCS8vIFRlc3QgUkdCKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpCi0JUkdCIHJnYiA9IG5ldyBSR0IoMjAsMTAwLDIwMCk7Ci0JCi0JcmdiID0gbmV3IFJHQigwLDAsMCk7Ci0KLQlyZ2IgPSBuZXcgUkdCKDI1NSwyNTUsMjU1KTsKLQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoLTEsIDIwLCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlZCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoMjU2LCAyMCwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWQgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoMjAsIC0xLCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdyZWVuIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJcmdiID0gbmV3IFJHQigyMCwgMjU2LCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdyZWVuID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXJnYiA9IG5ldyBSR0IoMjAsIDUwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlyZ2IgPSBuZXcgUkdCKDIwLCA1MCwgMjU2KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlpbnQgciA9IDAsIGcgPSAxMjcsIGIgPSAyNTQ7Ci0JUkdCIHJnYjEgPSBuZXcgUkdCKHIsIGcsIGIpOwotCVJHQiByZ2IyOwotCQotCXJnYjIgPSByZ2IxOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiVHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgUkdCIGluc3RhbmNlIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlyZ2IyID0gbmV3IFJHQihyLCBnLCBiKTsKLQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCWZhaWwoIlJlZmVyZW5jZXMgdG8gdHdvIGRpZmZlcmVudCBSR0IgaW5zdGFuY2VzIHdpdGggc2FtZSBSIEcgQiBwYXJhbWV0ZXJzIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlpZiAocmdiMS5lcXVhbHMobmV3IFJHQihyKzEsIGcsIGIpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKHIsIGcrMSwgYikpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IociwgZywgYisxKSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihyKzEsIGcrMSwgYisxKSkpIHsKLQkJZmFpbCgiQ29tcGFyaW5nIHR3byBSR0IgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9uIG9mIFIgRyBCIHBhcmFtZXRlcnMgZm91bmQgZXF1YWwiKTsgICAgCQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlpbnQgciA9IDI1NSwgZyA9IDEwMCwgYiA9IDA7Ci0JUkdCIHJnYjEgPSBuZXcgUkdCKHIsIGcsIGIpOwotCVJHQiByZ2IyID0gbmV3IFJHQihyLCBnLCBiKTsKLQkKLQlpbnQgaGFzaDEgPSByZ2IxLmhhc2hDb2RlKCk7Ci0JaW50IGhhc2gyID0gcmdiMi5oYXNoQ29kZSgpOwotCQotCWlmIChoYXNoMSAhPSBoYXNoMikgewotCQlmYWlsKCJUd28gUkdCIGluc3RhbmNlcyB3aXRoIHNhbWUgUiBHIEIgcGFyYW1ldGVycyByZXR1cm5lZCBkaWZmZXJlbnQgaGFzaCBjb2RlcyIpOwotCX0KLQkKLQlpZiAocmdiMS5oYXNoQ29kZSgpID09IG5ldyBSR0IoZywgYiwgcikuaGFzaENvZGUoKSB8fAotCQlyZ2IxLmhhc2hDb2RlKCkgPT0gbmV3IFJHQihiLCByLCBnKS5oYXNoQ29kZSgpKSB7Ci0JCWZhaWwoIlR3byBSR0IgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IFIgRyBCIHBhcmFtZXRlcnMgcmV0dXJuZWQgdGhlIHNhbWUgaGFzaCBjb2RlIik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVJHQiByZ2IgPSBuZXcgUkdCKDAsIDEwMCwgMjAwKTsKLQotCVN0cmluZyBzID0gcmdiLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgiUkdCLnRvU3RyaW5nIHJldHVybnMgYSBudWxsIG9yIGVtcHR5IFN0cmluZyIpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE0ZWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUkoKSB7Ci0JLy8gVGVzdCBuZXcgUmVjdGFuZ2xlIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMywgNCwgNSwgNik7Ci0JYXNzZXJ0RXF1YWxzKDMsIHIueCk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKDUsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscyg2LCByLmhlaWdodCk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgtNCwgLTMsIC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKC00LCByLngpOwotCWFzc2VydEVxdWFscygtMywgci55KTsKLQlhc3NlcnRFcXVhbHMoLTIsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscygtMSwgci5oZWlnaHQpOwotCi0JciA9IG5ldyBSZWN0YW5nbGUoNTAwMDAwLCA3MDAwMDAsIDIwMDAwMCwgMTAwMDAwKTsKLQlhc3NlcnRFcXVhbHMoNTAwMDAwLCByLngpOwotCWFzc2VydEVxdWFscyg3MDAwMDAsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDAwMCwgci53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKDEwMDAwMCwgci5oZWlnaHQpOwotfQotCi0vKioKLSAqIERlc3RydWN0aXZlbHkgcmVwbGFjZXMgdGhlIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCi0gKiBpbiB0aGUgcmVjZWl2ZXIgd2l0aCBvbmVzIHdoaWNoIHJlcHJlc2VudCB0aGUgdW5pb24gb2YgdGhlCi0gKiByZWN0YW5nbGVzIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAyLCAyKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMSk7Ci0KLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMSk7Ci0JCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMSk7Ci0KLQlyMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JcjIgPSBuZXcgUmVjdGFuZ2xlKDYsIDYsIDAsIDApOwotCXIxLmFkZChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgYWRkIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNSwgNCksIHIxKTsKLQotCXRyeSB7Ci0JCXIxLmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9pbnQgc3BlY2lmaWVkIGJ5IHRoZQotICogYXJndW1lbnRzIGlzIGluc2lkZSB0aGUgYXJlYSBzcGVjaWZpZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zSUkoKSB7Ci0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMSwgMikiLCByLmNvbnRhaW5zKDEsIDIpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNCkiLCByLmNvbnRhaW5zKDMsIDQpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNSkiLCByLmNvbnRhaW5zKDMsIDUpKTsKLQotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA2KSIsIHIuY29udGFpbnMoMywgNikpOwotLy8KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoNCwgNSkiLCByLmNvbnRhaW5zKDQsIDUpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDYpIiwgci5jb250YWlucyg0LCA2KSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICg5LCAxMCkiLCAhci5jb250YWlucyg5LCAxMCkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBwb2ludCAoLTEsIC0xKSIsICFyLmNvbnRhaW5zKC0xLCAtMSkpOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvaW50IGlzIGluc2lkZSB0aGUKLSAqIGFyZWEgc3BlY2lmaWVkIGJ5IHRoZSByZWNlaXZlci4KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoMSwgMikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgxLCAyKSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIFBvaW50KDMsIDQpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNCkpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNSkiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgzLCA1KSkpOwotCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDYpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNikpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDUpIiwgci5jb250YWlucyhuZXcgUG9pbnQoNCwgNSkpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoNCwgNikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCg0LCA2KSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBQb2ludCg5LCAxMCkiLCAhci5jb250YWlucyhuZXcgUG9pbnQoOSwgMTApKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICgtMSwgLTEpIiwgIXIuY29udGFpbnMobmV3IFBvaW50KC0xLCAtMSkpKTsKLQotCXRyeSB7Ci0JCXIuY29udGFpbnMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAzLCAyKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBiZSBlcXVhbCIsIHIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDQsIDUsIDYpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA0LCA1KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcjEuZXF1YWxzKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMiwgMyk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDQsIDUsIDMsIDIpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDMsIDIpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZSIsIHIxLmhhc2hDb2RlKCkgPT0gcjIuaGFzaENvZGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCQotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMywgMywgMSwgMiksIHIxKTsKLQotCXIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JcjEuaW50ZXJzZWN0KHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3QgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSwgcjEpOwotCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHIxKTsKLQotCXRyeSB7Ci0JCXIxLmludGVyc2VjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDMsIDMsIDEsIDIpLCByMS5pbnRlcnNlY3Rpb24ocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3Rpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNJSUlJKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA3LCA4KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMiwgMywgNywgOCkiLCByMS5pbnRlcnNlY3RzKDIsIDMsIDcsIDgpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMiwgMywgNywgOCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKSIsICFyMS5pbnRlcnNlY3RzKDIwMCwgMzAwLCA0MDAsIDUwMCkpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQkKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIDAsIDApIiwgcjEuaW50ZXJzZWN0cygzLCAzLCAwLCAwKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDMsIDMsIDAsIDApIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkiLCAhcjEuaW50ZXJzZWN0cygzLCAzLCAtMSwgLTEpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgLTEsIC0xKSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCAhcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3RzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDIsIDMsIDcsIDgpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgyLCAzLCA3LCA4KSIsIHIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMiwgMywgNywgOCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCkiLCAhcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKHIxKSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSIsIHIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgMCwgMCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkiLCAhcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3RzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgaXMgZW1wdHkiLCByLmlzRW1wdHkoKSk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAtMywgLTQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBlbXB0eSIsIHIuaXNFbXB0eSgpKTsKLQotCXIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBub3QgZW1wdHkiLCAhci5pc0VtcHR5KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgzLCA0LCA1LCA2KTsKLQlhc3NlcnROb3ROdWxsKHIudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB7MywgNCwgNSwgNn0iLCByLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNCwgNCksIHIxLnVuaW9uKHIyKSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCksIHIxLnVuaW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB1bmlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMS51bmlvbihyMikpOwotCi0JdHJ5IHsKLQkJcjEudW5pb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbXB0eSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0lJIikpIHRlc3RfY29udGFpbnNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzSUlJSSIpKSB0ZXN0X2ludGVyc2VjdHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW1wdHkiKSkgdGVzdF9pc0VtcHR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF91bmlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfdW5pb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDIwZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlZ2lvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlZ2lvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyB0ZXN0IFJlZ2lvbigpCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oKTsKLQlpZiAocmVnLmlzRGlzcG9zZWQoKSkgewotCQlmYWlsKCJDb25zdHJ1Y3RvciBmb3IgUmVnaW9uIGRpZG4ndCBpbml0aWFsaXplIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmlzRGlzcG9zZWQoKSkgewotCQlmYWlsKCJDb25zdHJ1Y3RvciBmb3IgUmVnaW9uIGRpZG4ndCBpbml0aWFsaXplIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkJEkoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JdHJ5IHsKLQkJcmVnLmFkZCgoaW50W10pbnVsbCk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyBhIG51bGwgcmVjdGFuZ2xlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCi0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuYWRkKG5ldyBpbnRbXXt9KTsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlSZWN0YW5nbGUgZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDAsNTAsMjUpOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgiYWRkIDEgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCXJlZy5hZGQobmV3IGludFtdIHswLDI1LCA1MCwyNSwgNTAsNDAsIDAsNDB9KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMCw1MCw0MCk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJhZGQgMiBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotCX0KLQkKLS8vCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0vLwlyZWcuYWRkKG5ldyBpbnRbXSB7MTAsMTAsIDQwLDMwLCAyMCw2MCwgNSw1NX0pOwotLy8JYm94ID0gcmVnLmdldEJvdW5kcygpOwotLy8JcmVnLmRpc3Bvc2UoKTsKLS8vCWV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoNSwxMCwzNSw1MCk7Ci0vLwlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0vLwkJZmFpbCgiYWRkIDMgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLS8vCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkvLyBhZGQgYSByZWN0YW5nbGUKLQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAwLCA1MCkpOwotCS8vIGFkZCBhIHNlY29uZCByZWN0YW5nbGUKLQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMjAwLCAyMDAsIDEwLDEwKSk7CQotCi0JdHJ5IHsKLQkJcmVnLmFkZCgoUmVjdGFuZ2xlKW51bGwpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBudWxsIHJlY3RhbmdsZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMjAsMzAsMTAsNSkpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSByZWN0YW5nbGUgYWZ0ZXIgUmVnaW9uIGdvdCBkaXNwb3NlZCIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCS8vIG1ha2UgYSBzZWNvbmQgcmVnaW9uIGFuZCBhZGQgaXQgdG8gdGhlIGZpcnN0IG9uZQotCVJlZ2lvbiByZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDQwLCA1MCwgMTAsIDIwKSk7Ci0JcmVnMS5hZGQocmVnMik7Ci0KLQl0cnkgewotCQlyZWcxLmFkZCgoUmVnaW9uKW51bGwpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBudWxsIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkJcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgxLDEsMTAwLDIwMCkpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJcmVnMS5hZGQocmVnMik7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyB0byBhIFJlZ2lvbiBhIFJlZ2lvbiB3aGljaCBnb3QgZGlzcG9zZWQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZzEuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSwxMDAsMjAwKSk7Ci0JCXJlZzEuYWRkKHJlZzIpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBSZWdpb24gdG8gYSBSZWdpb24gd2hpY2ggZ290IGRpc3Bvc2VkIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250YWluc0lJKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMjAwLDEwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QxID0gbmV3IFBvaW50KDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDUwLDUwLDEwMDAsMTAwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QyID0gbmV3IFBvaW50KDEwNDksMTAwOSk7Ci0JUG9pbnQgcG9pbnROb3RJblJlY3QxMiA9IG5ldyBQb2ludCg0OSwxMTApOwotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJYm9vbGVhbiByZXMgPSByZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5jb250YWlucyhwb2ludEluUmVjdDEueCwgcG9pbnRJblJlY3QxLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIkVtcHR5IHJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KSB8fAotCQkhcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0Mi54LCBwb2ludEluUmVjdDIueSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCWlmIChyZWcuY29udGFpbnMocG9pbnROb3RJblJlY3QxMi54LCBwb2ludE5vdEluUmVjdDEyLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9CQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMjAwLDEwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QxID0gbmV3IFBvaW50KDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDUwLDUwLDEwMDAsMTAwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QyID0gbmV3IFBvaW50KDEwNDksMTAwOSk7Ci0JUG9pbnQgcG9pbnROb3RJblJlY3QxMiA9IG5ldyBQb2ludCg0OSwxMTApOwotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJYm9vbGVhbiByZXMgPSByZWcuY29udGFpbnMocG9pbnRJblJlY3QxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5jb250YWlucyhwb2ludEluUmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIkVtcHR5IHJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKSB8fAotCQkhcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCWlmIChyZWcuY29udGFpbnMocG9pbnROb3RJblJlY3QxMikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBub3QgY29udGFpbiBwb2ludCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSw1MCwxMDApKTsKLQlpZiAocmVnLmlzRGlzcG9zZWQoKSkgewotCQlmYWlsKCJSZWdpb24gc2hvdWxkIG5vdCBiZSBpbiB0aGUgZGlzcG9zZWQgc3RhdGUiKTsKLQl9Ci0JCi0JLy8gZGlzcG9zZSB0d2ljZSBhcyB0aGlzIGlzIGFsbG93ZWQKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlyZWcuZGlzcG9zZSgpOwotCQlpZiAoIXJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZhaWwoIlJlZ2lvbiBzaG91bGQgYmUgaW4gdGhlIGRpc3Bvc2VkIHN0YXRlIik7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgyNSwgMTAwLCAyMDAsIDc4MCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCwgMTA1LCAyMDUsIDc4NSk7Ci0JCi0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzEuYWRkKHJlY3QxKTsKLQotCVJlZ2lvbiByZWcyID0gcmVnMTsKLQkKLQlpZiAoIXJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgicmVmZXJlbmNlcyB0byB0aGUgc2FtZSBpbnN0YW5jZSBvZiBSZWdpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwiKTsKLQl9Ci0JCi0JcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQocmVjdDEpOwotCQotLy8gQ3VycmVudGx5LCBSZWdpb25zIGFyZSBvbmx5ICJlcXVhbCIgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGhhbmRsZS4KLS8vIFRoaXMgaXMgc28gdGhhdCBpZGVudGljYWwgb2JqZWN0cyBhcmUgcHJvcGVybHkgaGFzaGVkLgotLy8gV2UgYXJlIGNvbnNpZGVyaW5nIGFkZGluZyBhIG5ldyBtZXRob2QgdGhhdCB3aWxsIGNvbXBhcmUgUmVnaW9ucyBmb3IgdGhlIHNhbWUgYXJlYS4KLS8vCWlmICghcmVnMS5lcXVhbHMocmVnMikpIHsKLS8vCQlyZWcxLmRpc3Bvc2UoKTsKLS8vCQlyZWcyLmRpc3Bvc2UoKTsKLS8vCQlmYWlsKCJ0d28gaW5zdGFuY2VzIG9mIFJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIHNhbWUgYXJlYSBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbCIpOwotLy8JfQkJCi0JCi0JcmVnMi5kaXNwb3NlKCk7Ci0JcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm9uIGVtcHR5IHJlZ2lvbiBjb25zaWRlcmVkIGVxdWFsIHRvIGVtcHR5IG9uZSIpOwotCX0KLQkKLQlyZWcyLmFkZChyZWN0Mik7Ci0JaWYgKHJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgidHdvIGRpZmZlcmVudCByZWdpb25zIGNvbnNpZGVyZWQgZXF1YWwiKTsKLQl9Ci0JCi0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSByZWcuZ2V0Qm91bmRzKCk7Ci0JCWZhaWwoIlJlZ2lvbiBkaXNwb3NlZCBzaG91bGQgdGhyb3cgRXhjZXB0aW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsNTAsMzApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMTAwLDEwMCwxMCwxMCk7Ci0JLy8gdGhlIHJlY3RhbmdsZSBlbmNsb3NpbmcgdGhlIHR3byBwcmVjZWRpbmcgcmVjdGFuZ2xlcwotCVJlY3RhbmdsZSByZWN0MTJCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwMCwxMDApOwotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWN0MSk7Ci0JUmVjdGFuZ2xlIHJlY3QxQmlzID0gcmVnLmdldEJvdW5kcygpOwotCWlmIChyZWN0MUJpcy54ICE9IHJlY3QxLnggfHwgcmVjdDFCaXMueSAhPSByZWN0MS55IHx8IAotCQlyZWN0MUJpcy5oZWlnaHQgIT0gcmVjdDEuaGVpZ2h0IHx8IHJlY3QxQmlzLndpZHRoICE9IHJlY3QxLndpZHRoKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImdldEJvdW5kcyBkb2Vzbid0IHJldHVybiB0aGUgYm9yZGVycyBvZiB0aGUgcmVjdGFuZ2xlIGFyZWEgd2hpY2ggd2FzIHNldCB1cCIpOwotCX0KLQkKLQlyZWcuYWRkKHJlY3QyKTsKLQlSZWN0YW5nbGUgcmVjdDEyID0gcmVnLmdldEJvdW5kcygpOwotCWlmIChyZWN0MTIueCAhPSByZWN0MTJCb3VuZHMueCB8fCByZWN0MTIueSAhPSByZWN0MTJCb3VuZHMueSB8fCAKLQkJcmVjdDEyLmhlaWdodCAhPSByZWN0MTJCb3VuZHMuaGVpZ2h0IHx8IHJlY3QxMi53aWR0aCAhPSByZWN0MTJCb3VuZHMud2lkdGgpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiZ2V0Qm91bmRzIGRvZXNuJ3QgcmV0dXJuIHRoZSBib3JkZXJzIG9mIHRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIGFyZWEgd2hpY2ggd2FzIHNldCB1cCIpOwotCX0KLQkKLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCQotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMjUsIDEwMCwgMjAwLCA3ODApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzAsIDEwNSwgMjA1LCA3ODUpOwotCQotCXJlZzEuYWRkKHJlY3QxKTsKLQlyZWcyLmFkZChyZWN0Mik7Ci0JCi0JaWYgKHJlZzEuaGFzaENvZGUoKSA9PSByZWcyLmhhc2hDb2RlKCkpIHsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJ0d28gZGlmZmVyZW50IHJlZ2lvbnMgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGhhc2hDb2RlIik7Ci0JfQotCXJlZzIuZGlzcG9zZSgpOwkKLQotCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKHJlY3QxKTsKLQotCi0vLyBCVUc6IHRoaXMgc2hvdWxkIHBhc3MJCi0vLwlpZiAocmVnMS5oYXNoQ29kZSgpICE9IHJlZzIuaGFzaENvZGUoKSkgewotLy8JCXJlZzEuZGlzcG9zZSgpOwotLy8JCXJlZzIuZGlzcG9zZSgpOwotLy8JCWZhaWwoInR3byByZWdpb25zIHJlcHJlc2VudGluZyBzYW1lIGFyZWEgc2hvdWxkIGhhdmUgc2FtZSBoYXNoQ29kZSIpOwotLy8JfQotCQotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QzID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q0ID0gbmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q1ID0gbmV3IFJlY3RhbmdsZSgyNSwyMCwyNSwxMCk7Ci0KLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5pbnRlcnNlY3QocmVjdDEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuaW50ZXJzZWN0KHJlY3QxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCBmb3IgZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5pbnRlcnNlY3QocmVjdDIpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnLmludGVyc2VjdChyZWN0Myk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MykpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZy5pbnRlcnNlY3QocmVjdDQpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDMiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MS51bmlvbihyZWN0NCkpOwotCXJlZy5pbnRlcnNlY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDUpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuYWRkKHJlY3Q0KTsKLQlyZWcuaW50ZXJzZWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcxLmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSkpOwotCi0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuaW50ZXJzZWN0KHJlZzEpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmludGVyc2VjdChyZWcxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLmludGVyc2VjdChyZWcyKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWcxLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcyLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnMyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMy5hZGQobmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCkpOwotCQotCXJlZy5pbnRlcnNlY3QocmVnMyk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWczLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWczLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnNCA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnNC5hZGQobmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCkpOwotCi0JcmVnLmludGVyc2VjdChyZWc0KTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDMiKTsKLQl9Ci0JCi0JUmVnaW9uIHJlZzUgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzUuYWRkKG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsMTApKTsKLQkKLQlyZWcuYWRkKHJlZzEuZ2V0Qm91bmRzKCkudW5pb24ocmVnNC5nZXRCb3VuZHMoKSkpOwotCXJlZy5pbnRlcnNlY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWc1LmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5hZGQocmVnNCk7Ci0JcmVnLmludGVyc2VjdChyZWc1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnNC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0lJSUkoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwyMCw1MCwzMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDU5LDQ5LDEwLDIwKTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMSA9IG5ldyBSZWN0YW5nbGUoMCw1LDEwLDE1KTsKLQkKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLDQwLDEwLDEwMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjIgPSBuZXcgUmVjdGFuZ2xlKDM5LDEzOSwxLDUpOwotCVJlY3RhbmdsZSByZWN0Tm90SW50ZXIxMiA9IG5ldyBSZWN0YW5nbGUoNDAsNTAsNSwxNSk7Ci0JCi0JCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlib29sZWFuIHJlcyA9IHJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEueCwgcmVjdEludGVyMS55LCByZWN0SW50ZXIxLndpZHRoLCByZWN0SW50ZXIxLmhlaWdodCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0MS54LCByZWN0MS55LCByZWN0MS53aWR0aCwgcmVjdDEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGNhbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QxLngsIHJlY3QxLnksIHJlY3QxLndpZHRoLCByZWN0MS5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMS54LCByZWN0SW50ZXIxLnksIHJlY3RJbnRlcjEud2lkdGgsIHJlY3RJbnRlcjEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSAiKTsKLQl9Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3ROb3RJbnRlcjEueCwgcmVjdE5vdEludGVyMS55LCByZWN0Tm90SW50ZXIxLndpZHRoLCByZWN0Tm90SW50ZXIxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuYWRkKHJlY3QyKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QyLngsIHJlY3QyLnksIHJlY3QyLndpZHRoLCByZWN0Mi5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMi54LCByZWN0SW50ZXIyLnksIHJlY3RJbnRlcjIud2lkdGgsIHJlY3RJbnRlcjIuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSAiKTsKLQl9Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3ROb3RJbnRlcjEyLngsIHJlY3ROb3RJbnRlcjEyLnksIHJlY3ROb3RJbnRlcjEyLndpZHRoLCByZWN0Tm90SW50ZXIxMi5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwyMCw1MCwzMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDU5LDQ5LDEwLDIwKTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMSA9IG5ldyBSZWN0YW5nbGUoMCw1LDEwLDE1KTsKLQkKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLDQwLDEwLDEwMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjIgPSBuZXcgUmVjdGFuZ2xlKDM5LDEzOSwxLDUpOwotCVJlY3RhbmdsZSByZWN0Tm90SW50ZXIxMiA9IG5ldyBSZWN0YW5nbGUoNDAsNTAsNSwxNSk7Ci0JCi0JCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlib29sZWFuIHJlcyA9IHJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmludGVyc2VjdHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgY2FuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmludGVyc2VjdHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIHJldHVybiB0cnVlIG9uIHJlY3RhbmdsZSBub3QgaW50ZXJzZWN0aW5nIHdpdGggcmVnaW9uIik7Ci0JfQotCQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmludGVyc2VjdHMocmVjdDIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxMikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gdGVzdCBpbiBkaXNwb3NlKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCVJlY3RhbmdsZSBlbXB0eVJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwyMCwwLDIwMCk7Ci0JUmVjdGFuZ2xlIGVtcHR5UmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDEwLDApOwotCVJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgxMCwyMCw1MCwxMDApOwotCQotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpc0VtcHR5IGRpZG4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmFkZChlbXB0eVJlY3QxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSBkaWRuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCi0JcmVnLmFkZChlbXB0eVJlY3QyKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSBkaWRuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCi0JcmVnLmFkZChyZWN0KTsKLQlpZiAocmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpc0VtcHR5IHJldHVybmVkIHRydWUgb24gbm9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuZGlzcG9zZSgpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdCRJKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdCgoaW50W10pbnVsbCk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN1YnRyYWN0IGEgbnVsbCBhcnJheSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLnN1YnRyYWN0KG5ldyBpbnRbXXt9KTsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCXJlZy5zdWJ0cmFjdChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjAsIDAsMjB9KTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JUmVjdGFuZ2xlIGV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoMCwyMCw1MCw1KTsKLQlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0JCWZhaWwoInN1YnRyYWN0IDEgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci0JCi0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCXJlZy5hZGQobmV3IGludFtdIHswLDI1LCA1MCwyNSwgNTAsNDAsIDAsNDB9KTsKLQlyZWcuc3VidHJhY3QobmV3IGludFtdIHswLDI1LCA1MCwyNSwgNTAsNDAsIDAsNDB9KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMCw1MCwyNSk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJzdWJ0cmFjdCAyIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDMgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDQgPSBuZXcgUmVjdGFuZ2xlKDUwLDI1LDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDUgPSBuZXcgUmVjdGFuZ2xlKDAsMCw2MCwyMCk7Ci0KLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdChyZWN0MSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5zdWJ0cmFjdChyZWN0MSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCBmb3IgZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5zdWJ0cmFjdChyZWN0Mik7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAxIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5zdWJ0cmFjdChyZWN0Myk7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZy5zdWJ0cmFjdChyZWN0NCk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDMiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MS51bmlvbihyZWN0NCkpOwotCXJlZy5zdWJ0cmFjdChyZWN0NSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsMjAsNjAsMTUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuYWRkKHJlY3Q0KTsKLQlyZWcuc3VidHJhY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcxLmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSkpOwotCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QocmVnMSk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuc3VidHJhY3QocmVnMSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQkKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5zdWJ0cmFjdChyZWcyKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcyLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnMyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMy5hZGQobmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCkpOwotCQotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzMpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlZzEuZ2V0Qm91bmRzKCkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWczLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDIiKTsKLQl9Ci0JcmVnMy5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzQgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzQuYWRkKG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApKTsKLQkKLQlyZWcuc3VidHJhY3QocmVnNCk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWcxLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAzIik7Ci0JfQotCi0JUmVnaW9uIHJlZzUgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzUuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDYwLDIwKSk7Ci0JCi0JcmVnLmFkZChyZWcxLmdldEJvdW5kcygpLnVuaW9uKHJlZzQuZ2V0Qm91bmRzKCkpKTsKLQlyZWcuc3VidHJhY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsMjAsNjAsMTUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCXJlZzUuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5hZGQocmVnNCk7Ci0JcmVnLnN1YnRyYWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlyZWc1LmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQlyZWcxLmRpc3Bvc2UoKTsKLQlyZWc0LmRpc3Bvc2UoKTsKLQlyZWc1LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkKLQlTdHJpbmcgcyA9IHJlZy50b1N0cmluZygpOwotCQotCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCWZhaWwoInRvU3RyaW5nIHJldHVybnMgbnVsbCBvciBlbXB0eSBzdHJpbmciKTsKLQl9Ci0JCi0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSwxMCwyMCkpOwotCXMgPSByZWcudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJ0b1N0cmluZyByZXR1cm5zIG51bGwgb3IgZW1wdHkgc3RyaW5nIik7Ci0JfQotCi0JcmVnLmRpc3Bvc2UoKTsKLQlzID0gcmVnLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgidG9TdHJpbmcgcmV0dXJucyBudWxsIG9yIGVtcHR5IHN0cmluZyIpOwotCX0JCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsKLQkJd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSBub3Qgd3JpdHRlbiIpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGQkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250YWluc0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdHNJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW1wdHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N1YnRyYWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZCRJIikpIHRlc3RfYWRkJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRhaW5zSUkiKSkgdGVzdF9jb250YWluc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdHNJSUlJIikpIHRlc3RfaW50ZXJzZWN0c0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW1wdHkiKSkgdGVzdF9pc0VtcHR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdWJ0cmFjdCRJIikpIHRlc3Rfc3VidHJhY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLX0KLQotLyogY3VzdG9tICovCi0JRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YThhNjYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3Rvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjIxNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDEwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDEwMCwgMTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2hlbGwsIDEwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KHNoZWxsLCAxMCwgU1dULkxFRlQpOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoYXR0YWNobWVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmQyYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzVlNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjM2OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEpOwotCWFzc2VydFRydWUoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5DRU5URVIpOwotCWFzc2VydFRydWUoZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID09IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLndpZHRoSGludCA9PSBTV1QuREVGQVVMVCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhlaWdodEhpbnQgPT0gU1dULkRFRkFVTFQpOwotCWFzc2VydFRydWUoZGF0YS5ob3Jpem9udGFsSW5kZW50ID09IDApOwotCWFzc2VydFRydWUoZGF0YS5ob3Jpem9udGFsU3BhbiA9PSAxKTsKLQlhc3NlcnRUcnVlKGRhdGEudmVydGljYWxTcGFuID09IDEpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID09IGZhbHNlKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhKTsKLQlhc3NlcnRUcnVlKGRhdGEudmVydGljYWxBbGlnbm1lbnQgPT0gR3JpZERhdGEuRklMTCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPT0gR3JpZERhdGEuRklMTCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPT0gdHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUkoKSB7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgxMDAsIDEwMCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhKTsKLQlhc3NlcnRUcnVlKGRhdGEud2lkdGhIaW50ID09IDEwMCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhlaWdodEhpbnQgPT0gMTAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGJmMmNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySVoiKSkgdGVzdF9Db25zdHJ1Y3RvcklaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTQ3YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93RGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTQ5NmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3Rvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2QzZmFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySSIpKSB0ZXN0X2Vycm9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJSSIpKSB0ZXN0X2Vycm9ySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSIpKSB0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiMjc3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQXV0b21hdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREb2N1bWVudGF0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWxwRmlsZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEhlbHBGaWxlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMYXN0RXJyb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExhc3RFcnJvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWVzSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE5hbWVzSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb3BlcnR5SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludm9rZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZU5vUmVwbHlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWxwRmlsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExhc3RFcnJvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVzSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZU5vUmVwbHlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkiKSkgdGVzdF9nZXREb2N1bWVudGF0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkiKSkgdGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVscEZpbGVJIikpIHRlc3RfZ2V0SGVscEZpbGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGFzdEVycm9yIikpIHRlc3RfZ2V0TGFzdEVycm9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lSSIpKSB0ZXN0X2dldE5hbWVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lc0lJIikpIHRlc3RfZ2V0TmFtZXNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkiKSkgdGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJIikpIHRlc3RfZ2V0UHJvcGVydHlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIikpIHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzIikpIHRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VJIikpIHRlc3RfaW52b2tlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VOb1JlcGx5SSIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIikpIHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjcxN2Q1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfaW9fRmlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kb1ZlcmJJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kb1ZlcmJJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXhlY0lJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5kZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbmRlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9ncmFtSUQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb2dyYW1JRCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlydHkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRGlydHkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0ZvY3VzQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNGb2N1c0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9xdWVyeVN0YXR1c0koKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3F1ZXJ5U3RhdHVzSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NhdmVMamF2YV9pb19GaWxlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RvVmVyYkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb2dyYW1JRCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXJ0eSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3F1ZXJ5U3RhdHVzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfaW9fRmlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQiKSkgdGVzdF9kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZG9WZXJiSSIpKSB0ZXN0X2RvVmVyYkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3RfZXhlY0lJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluZGVudCIpKSB0ZXN0X2dldEluZGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvZ3JhbUlEIikpIHRlc3RfZ2V0UHJvZ3JhbUlEKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0RpcnR5IikpIHRlc3RfaXNEaXJ0eSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb2N1c0NvbnRyb2wiKSkgdGVzdF9pc0ZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcXVlcnlTdGF0dXNJIikpIHRlc3RfcXVlcnlTdGF0dXNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zYXZlTGphdmFfaW9fRmlsZVoiKSkgdGVzdF9zYXZlTGphdmFfaW9fRmlsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ZGE4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDb250cm9sU2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDb250cm9sU2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QmFja2dyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb3JlZ3JvdW5kIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l0ZVByb3BlcnR5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2l0ZVByb3BlcnR5SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2l0ZVByb3BlcnR5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9hZGRFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpdGVQcm9wZXJ0eUkiKSkgdGVzdF9nZXRTaXRlUHJvcGVydHlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjVlYjkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmU2ZDdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250YWluZXJNZW51cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udGFpbmVyTWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlTWVudXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZpbGVNZW51cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpbmRvd01lbnVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXaW5kb3dNZW51cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGFpbmVyTWVudXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbGVNZW51cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2luZG93TWVudXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGFpbmVyTWVudXMiKSkgdGVzdF9nZXRDb250YWluZXJNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsZU1lbnVzIikpIHRlc3RfZ2V0RmlsZU1lbnVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXaW5kb3dNZW51cyIpKSB0ZXN0X2dldFdpbmRvd01lbnVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhNzI4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnVuY3Rpb25EZXNjcmlwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGdW5jdGlvbkRlc2NyaXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkYzViYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MjA2MWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2I5MWE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQcm9wZXJ0eURlc2NyaXB0aW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZVByb3BlcnR5RGVzY3JpcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiZDViYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckYoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yRiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJUygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJUyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2ggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvclMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yUyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF1dG9tYXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEF1dG9tYXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb29sZWFuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb29sZWFuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QnlSZWYoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJ5UmVmIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGF0Y2goKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERpc3BhdGNoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmxvYXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZsb2F0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaG9ydCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2hvcnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFR5cGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRVbmtub3duKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRVbmtub3duIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZGKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZkYgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCeVJlZkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJ5UmVmSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmUygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZTIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZlogbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJUyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JTIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEF1dG9tYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvb2xlYW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJ5UmVmIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNwYXRjaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmxvYXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hvcnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHlwZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VW5rbm93biIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZGIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCeVJlZkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmUyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZaIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JGIikpIHRlc3RfQ29uc3RydWN0b3JGKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySVMiKSkgdGVzdF9Db25zdHJ1Y3RvcklTKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2giKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93biIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbiIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JTIikpIHRlc3RfQ29uc3RydWN0b3JTKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcloiKSkgdGVzdF9Db25zdHJ1Y3RvclooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdXRvbWF0aW9uIikpIHRlc3RfZ2V0QXV0b21hdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm9vbGVhbiIpKSB0ZXN0X2dldEJvb2xlYW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJ5UmVmIikpIHRlc3RfZ2V0QnlSZWYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc3BhdGNoIikpIHRlc3RfZ2V0RGlzcGF0Y2goKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZsb2F0IikpIHRlc3RfZ2V0RmxvYXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEludCIpKSB0ZXN0X2dldEludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hvcnQiKSkgdGVzdF9nZXRTaG9ydCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3RyaW5nIikpIHRlc3RfZ2V0U3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUeXBlIikpIHRlc3RfZ2V0VHlwZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VW5rbm93biIpKSB0ZXN0X2dldFVua25vd24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmRiIpKSB0ZXN0X3NldEJ5UmVmRigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QnlSZWZJIikpIHRlc3Rfc2V0QnlSZWZJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZlMiKSkgdGVzdF9zZXRCeVJlZlMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmWiIpKSB0ZXN0X3NldEJ5UmVmWigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjgzMzk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludERpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JcHJpbnREaWFsb2cgPSBuZXcgUHJpbnREaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQlzZXREaWFsb2cocHJpbnREaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCW5ldyBQcmludERpYWxvZyhzaGVsbCk7Ci0JCi0JdHJ5IHsKLQkJbmV3IFByaW50RGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCW5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQotCXRyeSB7Ci0JCW5ldyBQcmludERpYWxvZyhudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmRQYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFbmRQYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbnRUb0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByaW50VG9GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2NvcGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNjb3BlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RhcnRQYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGFydFBhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5kUGFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVuZFBhZ2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpbnRUb0ZpbGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQcmludFRvRmlsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTY29wZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNjb3BlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0YXJ0UGFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFN0YXJ0UGFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5kUGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbnRUb0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNjb3BlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGFydFBhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuZFBhZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcmludFRvRmlsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNjb3BlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3RhcnRQYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5kUGFnZSIpKSB0ZXN0X2dldEVuZFBhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByaW50VG9GaWxlIikpIHRlc3RfZ2V0UHJpbnRUb0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNjb3BlIikpIHRlc3RfZ2V0U2NvcGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0YXJ0UGFnZSIpKSB0ZXN0X2dldFN0YXJ0UGFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuZFBhZ2VJIikpIHRlc3Rfc2V0RW5kUGFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByaW50VG9GaWxlWiIpKSB0ZXN0X3NldFByaW50VG9GaWxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2NvcGVJIikpIHRlc3Rfc2V0U2NvcGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTdGFydFBhZ2VJIikpIHRlc3Rfc2V0U3RhcnRQYWdlSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlQcmludERpYWxvZyBwcmludERpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmUzMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0cmluZyBkZXRhaWwgPSAiIjsKLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSB7Ci0JCS8qIFRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIHNvIHZlcmlmeSB0aGF0IHRoZQotCQkgKiBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gRVJST1JfTk9fSEFORExFUyBTV1RFcnJvci4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcigpOwotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCQlpZiAoZXguY29kZSA9PSBTV1QuRVJST1JfTk9fSEFORExFUykgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJFUlJPUl9OT19IQU5ETEVTIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCX0gZWxzZSB7Ci0JCS8qIFRoZXJlIGlzIGF0IGxlYXN0IGEgZGVmYXVsdCBwcmludGVyLCBzbyB2ZXJpZnkgdGhhdAotCQkgKiB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbnMuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCQlkZXRhaWwgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoIkV4Y2VwdGlvbiB0aHJvd246ICIgKyBkZXRhaWwsIGV4Y2VwdGlvblRocm93bik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0cmluZyBkZXRhaWwgPSAiIjsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCS8qIFRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIHNvIHZlcmlmeSB0aGF0IHRoZQotCQkgKiBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gRVJST1JfTk9fSEFORExFUyBTV1RFcnJvci4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQkJaWYgKGV4LmNvZGUgPT0gU1dULkVSUk9SX05PX0hBTkRMRVMpIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRVJST1JfTk9fSEFORExFUyBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9IGVsc2UgewotCQkvKiBUaGVyZSBpcyBhdCBsZWFzdCBhIGRlZmF1bHQgcHJpbnRlciwgc28gdmVyaWZ5IHRoYXQKLQkJICogdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRocm93IGFueSBleGNlcHRpb25zLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJCWRldGFpbCA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJfQotCQlhc3NlcnRGYWxzZSgiRXhjZXB0aW9uIHRocm93bjogIiArIGRldGFpbCwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2FuY2VsSm9iKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jYW5jZWxKb2Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAxMCwgMTApOwotCWFzc2VydFRydWUoInRyaW0gd2lkdGggb3IgaGVpZ2h0IGlzIGluY29ycmVjdCIsIHRyaW0ud2lkdGggPj0gMTAgJiYgdHJpbS5oZWlnaHQgPj0gMTApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VuZEpvYigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZW5kSm9iIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZW5kUGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZW5kUGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW50ZXIuZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiYm91bmRzIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIiwgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwcmludGVyLmdldENsaWVudEFyZWEoKTsKLQlhc3NlcnRUcnVlKCJjbGllbnRBcmVhIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIiwgY2xpZW50QXJlYS53aWR0aCA+IDAgJiYgY2xpZW50QXJlYS5oZWlnaHQgPiAwKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREUEkoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JYXNzZXJ0VHJ1ZSgiZHBpIHggb3IgeSBpcyB6ZXJvIiwgZHBpLnggPiAwICYmIGRwaS55ID4gMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2dldFByaW50ZXJEYXRhLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW50ZXJEYXRhKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlhc3NlcnRUcnVlKCJnZXRQcmludGVyRGF0YSAhPSBkYXRhIHVzZWQgaW4gY29uc3RydWN0b3IiLAotCQkJZGF0YSA9PSBwcmludGVyLmdldFByaW50ZXJEYXRhKCkpOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW50ZXJMaXN0KCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWlmIChkYXRhID09IG51bGwpIHsKLQkJLyogSWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgdmVyaWZ5IHRoYXQgdGhlCi0JCSAqIHByaW50ZXIgbGlzdCBpcyBlbXB0eS4KLQkJICovCi0JCVByaW50ZXJEYXRhIGxpc3RbXSA9IFByaW50ZXIuZ2V0UHJpbnRlckxpc3QoKTsKLQkJYXNzZXJ0VHJ1ZSgicHJpbnRlciBsaXN0IGNvbnRhaW5zIGl0ZW1zIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBubyBwcmludGVycyIsCi0JCQkJbGlzdC5sZW5ndGggPT0gMCk7Ci0JfSBlbHNlIHsKLQkJLyogSWYgdGhlcmUgaXMgYXQgbGVhc3QgYSBkZWZhdWx0IHByaW50ZXIsIHZlcmlmeQotCQkgKiB0aGF0IHRoZSBwcmludGVyIGxpc3QgaXMgbm90IGVtcHR5LgotCQkgKi8KLQkJUHJpbnRlckRhdGEgbGlzdFtdID0gUHJpbnRlci5nZXRQcmludGVyTGlzdCgpOwotCQlhc3NlcnRUcnVlKCJwcmludGVyIGxpc3QgaXMgZW1wdHkiLCBsaXN0Lmxlbmd0aCA+IDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0UGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc3RhcnRQYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jYW5jZWxKb2IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZW5kSm9iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lbmRQYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERQSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmludGVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbnRlckxpc3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydFBhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jYW5jZWxKb2IiKSkgdGVzdF9jYW5jZWxKb2IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZW5kSm9iIikpIHRlc3RfZW5kSm9iKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lbmRQYWdlIikpIHRlc3RfZW5kUGFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RFBJIikpIHRlc3RfZ2V0RFBJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0UHJpbnRlckRhdGEiKSkgdGVzdF9nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByaW50ZXJEYXRhIikpIHRlc3RfZ2V0UHJpbnRlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByaW50ZXJMaXN0IikpIHRlc3RfZ2V0UHJpbnRlckxpc3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RhcnRQYWdlIikpIHRlc3Rfc3RhcnRQYWdlKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTYxYTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlckRhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gbmV3IFByaW50ZXJEYXRhKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBuZXcgUHJpbnRlckRhdGEoImhlbGxvIiwgInRoZXJlIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IG5ldyBQcmludGVyRGF0YSgpOwotCWFzc2VydE5vdE51bGwoZGF0YS50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ZTVjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi0JcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCWFzc2VydFRydWUocHJvZ3JhbS5lcXVhbHMocHJvZ3JhbSkpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZygpIHsKLQkKLQkvLyBUaGlzIHRlc3QgaXMgaW5jb21wbGV0ZSBiZWNhdXNlIGEgdHJ1ZSB0ZXN0IG9mIGV4ZWN1dGUgd291bGQgb3BlbgotCS8vIGFuIGFwcGxpY2F0aW9uIHRoYXQgY2Fubm90IGJlIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkLgotCQotCXRyeSB7Ci0JCVByb2dyYW1bXSBwcm9ncmFtcyA9IFByb2dyYW0uZ2V0UHJvZ3JhbXMoKTsKLQkJaWYgKHByb2dyYW1zICE9IG51bGwgJiYgcHJvZ3JhbXMubGVuZ3RoID4gMCkgewotCi0JCQkvLyBDYW5ub3QgdGVzdCBlbXB0eSBzdHJpbmcgYXJndW1lbnQgYmVjYXVzZSBpdCBtYXkgbGF1bmNoIHNvbWV0aGluZy4KLQkJCS8vYm9vbGVhbiByZXN1bHQgPSBwcm9ncmFtc1swXS5leGVjdXRlKCIiKTsKLQkJCS8vYXNzZXJ0RmFsc2UocmVzdWx0KTsKLQkJCQotCQkJLy8gdGVzdCBudWxsIGFyZ3VtZW50Ci0JCQkJCi0JCQlwcm9ncmFtc1swXS5leGVjdXRlKG51bGwpOwotCQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiKTsKLQkJfQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgYSBudWxsIHJlc3VsdCBpcyBhbGxvd2VkLgotCQl9Ci0JfQotCQotCXRyeSB7Ci0JCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0obnVsbCk7Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlmYWlsKCJJbnZhbGlkIEV4Y2VwdGlvbiB0aHJvd24gb2YgdHlwZSAiK2UuZ2V0Q2xhc3MoKSk7Ci0JfSBjYXRjaCAoRXJyb3IgZSkgewotCQlmYWlsKCJJbnZhbGlkIEVycm9yIHRocm93biBvZiB0eXBlICIrZS5nZXRDbGFzcygpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXh0ZW5zaW9ucygpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnROb3ROdWxsKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlRGF0YSgpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBkYXRhID0gcHJvZ3JhbS5nZXRJbWFnZURhdGEoKTsKLQkJCQkvLyBOb3RoaW5nIHRvIGRvLgotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHByb2dyYW0uZ2V0TmFtZSgpOwotCQkJCWFzc2VydE5vdE51bGwoIlByb2dyYW0gaGFzIG51bGwgbmFtZSIsbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvZ3JhbXMoKSB7Ci0JUHJvZ3JhbVtdIHByb2dyYW1zID0gUHJvZ3JhbS5nZXRQcm9ncmFtcygpOwotCQotCS8vIFRoZSByZXN1bHQgaXMgbm90IHdlbGwtZG9jdW1lbnRlZCwgYnV0IGl0IHNob3VsZCAKLQkvLyBiZSBub24tbnVsbCBhbmQgY29udGFpbiBubyBudWxsIGVudHJpZXMuCi0JCi0JYXNzZXJ0Tm90TnVsbChwcm9ncmFtcyk7Ci0JCi0JSGFzaHRhYmxlIGxvb2t1cCA9IG5ldyBIYXNodGFibGUoKTsKLQlmb3IgKGludCBpPTA7IGk8cHJvZ3JhbXMubGVuZ3RoOyBpKyspIHsKLQkJCi0JCS8vIHRlc3Qgbm9uLW51bGwgZW50cnkKLQkJYXNzZXJ0Tm90TnVsbChwcm9ncmFtc1tpXSk7Ci0JCQotCQkvLyB0ZXN0IHVuaXF1ZSBoYXNoIGNvZGUKLQkJaW50IGhhc2hDb2RlID0gcHJvZ3JhbXNbaV0uaGFzaENvZGUoKTsKLQkJSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcihoYXNoQ29kZSk7Ci0JCWlmIChsb29rdXAuY29udGFpbnMoa2V5KSkgewotCQkJZmFpbCgiRHVwbGljYXRlIGhhc2ggY29kZSBmb3IgIitwcm9ncmFtc1tpXSsiIChzYW1lIGFzICIrKFByb2dyYW0pbG9va3VwLmdldChrZXkpKyIpIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb29rdXAucHV0KGtleSxwcm9ncmFtc1tpXSk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfZ2V0UHJvZ3JhbXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZygpIHsKLQotCS8vIFRoaXMgdGVzdCBpcyBpbmNvbXBsZXRlIGJlY2F1c2UgYSB0cnVlIHRlc3Qgb2YgbGF1bmNoIHdvdWxkIG9wZW4KLQkvLyBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbm5vdCBiZSBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZC4KLQkKLQkvLyBDYW5ub3QgdGVzdCBlbXB0eSBzdHJpbmcgYXJndW1lbnQgYmVjYXVzZSBpdCBtYXkgbGF1bmNoIHNvbWV0aGluZy4KLQkKLQkvLyB0ZXN0IG51bGwgYXJndW1lbnQKLQkKLQl0cnkgewotCQlQcm9ncmFtLmxhdW5jaChudWxsKTsKLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCVN0cmluZyBzdHJpbmcgPSBwcm9ncmFtLnRvU3RyaW5nKCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgidG9TdHJpbmcgcmV0dXJuZWQgbnVsbCIsc3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEV4dGVuc2lvbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvZ3JhbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZmluZFByb2dyYW1MamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RXh0ZW5zaW9ucyIpKSB0ZXN0X2dldEV4dGVuc2lvbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlRGF0YSIpKSB0ZXN0X2dldEltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZSIpKSB0ZXN0X2dldE5hbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb2dyYW1zIikpIHRlc3RfZ2V0UHJvZ3JhbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xhdW5jaExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwOWRkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbiBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLUJ1dHRvbiBidXR0b247Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXNldFdpZGdldChidXR0b24pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gVGVzdCBCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuTlVMTCk7Ci0KLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlRPR0dMRSk7Ci0KLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQVJST1cpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0ggfCBTV1QuQ0hFQ0spOwotCi0JdHJ5IHsKLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9OwotCX07Ci0JCi0JdHJ5IHsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWJ1dHRvbi5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUobGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCWJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlidXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWJ1dHRvbi5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQlidXR0b24uY29tcHV0ZVNpemUoMCwgMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKC0xMCwgLTEwKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgtMTAsIC0xMCwgZmFsc2UpOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwLCAxMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAsIDEwLCBmYWxzZSk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDAsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QWxpZ25tZW50SSgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNlbGVjdGlvbloKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiAgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRFcXVhbHMoU1dULkxFRlQsIGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5SSUdIVCwgYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWJ1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5DRU5URVIsIGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5VUCk7IC8vIGJhZCB2YWx1ZSBmb3IgcHVzaCBidXR0b24KLQlhc3NlcnRUcnVlKFNXVC5VUCAhPSBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JQnV0dG9uIGFycm93QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhTV1QuTEVGVCwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5SSUdIVCwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5VUCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5VUCwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5ET1dOKTsKLQlhc3NlcnRFcXVhbHMoU1dULkRPV04sIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsgLy8gYmFkIHZhbHVlIGZvciBhcnJvdyBidXR0b24KLQlhc3NlcnRUcnVlKFNXVC5DRU5URVIgIT0gYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCWFycm93QnV0dG9uLmRpc3Bvc2UoKTsKLQotCWludCBhbGlnbm1lbnQgPSA1NTsgLy8gc29tZSBib2d1cyBudW1iZXIKLQlidXR0b24uc2V0QWxpZ25tZW50KGFsaWdubWVudCk7Ci0JYXNzZXJ0VHJ1ZShhbGlnbm1lbnQgIT0gYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQlCdXR0b24gYnRuID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQlidG4uc2V0Rm9jdXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBidXR0b24uZ2V0SW1hZ2UoKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgYnV0dG9uLmdldEltYWdlKCkpOwotCi0JYnV0dG9uLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoYnV0dG9uLmdldEltYWdlKCkpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2Uoc2hlbGwuZ2V0RGlzcGxheSgpLCAxMCwgMTApOwotCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlLCBidXR0b24uZ2V0SW1hZ2UoKSk7Ci0KLQlidXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25aKCkgewotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciBjaGVjayBib3gKLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCWJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCWJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIWJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgYXJyb3cgYnV0dG9uCi0JQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciBwdXNoIGJ1dHRvbgotCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIHJhZGlvIGJ1dHRvbgotCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5SQURJTyk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKG5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIHRvZ2dsZSBidXR0b24KLQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUobmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAic29tZSB0ZXh0IiwgImxka2FzaGRvZWh1Zndlb3ZjbmhzbHZocmVnb2plYmNrcmVhdmJrdWh4Yml1ZnZjeWhiaWZ1eWV3dmJpdXJleWQuLGNtbmVzbGpsaWV3amZjaHZid29pZml2YmV3b3JpeHVpZXVydmJpdXZib2hmbGtzamVhaGZjbGl1cmVhZmd5Y2lhYmVsaXR2eXJ3dGxpY3V5cnRsaXVyZXliY2xpdXlyZXVjZXl2YmxpdXJleWJjdCIsICJcbiBcbiBcYiBcdCAiLCAiXDAifTsKLQlpbnQgZ29vZENhc2VzID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Z29vZENhc2VzOyBpKyspewotCQlidXR0b24uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImdvb2QgY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBidXR0b24uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX07Ci0KLQl0cnkgewotCQlidXR0b24uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWJ1dHRvbi5zZXRUZXh0KCIiKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uWiIpKSB0ZXN0X3NldFNlbGVjdGlvblooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8vY3VzdG9tCi0KLXByb3RlY3RlZCB2b2lkIHNldFVwKGludCBzdHlsZSkgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgc3R5bGUpOwotICAgIHNldFdpZGdldChidXR0b24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNIRUNLKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLS8vICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gcHVzaCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGJ1dHRvbnMKLS8vCSAgZGlmZmVyZW50IGFjcm9zcyBwbGF0Zm9ybXMKLS8vICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIC8vYXJyb3cgZG9lcyBub3QgcHJvZHVjZSBhIHRyYXZlcnNlIG1uZW1vbmljIG9uIHhwCi0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAyMCwgMjAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU2NTExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXMKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1DYW52YXMgY2FudmFzOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIDApOwotCXN1cGVyLnNldFdpZGdldChjYW52YXMpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpCi0JCWNhbnZhcy5kaXNwb3NlKCk7Ci0JY2FudmFzID0gKENhbnZhcyl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCUNhbnZhcyBuZXdDYW52YXM7Ci0JdHJ5IHsKLQkJbmV3Q2FudmFzID0gbmV3IENhbnZhcyhudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Njcm9sbElJSUlJSVooKSB7Ci0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgMCwgMCwgNTAsIDUwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgMCwgMCwgNTAsIDUwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoMTAwMDAsIDEwMDAwLCAxMDAsIDEwMCwgNTAwLCA1MDAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKDEwMDAwLCAxMDAwMCwgMTAwLCAxMDAsIDUwMCwgNTAwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoLTEwMCwgLTEwMCwgMTAsIDEwLCAzMCwgMzAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKC0xMDAsIC0xMDAsIDEwLCAxMCwgMzAsIDMwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoMTAsIDEwLCAtMjAwLCAtMjAwLCAxMDAsIDEwMCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAsIDEwLCAtMjAwLCAtMjAwLCAxMDAsIDEwMCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKDEwMCwgMTAwLCA1MCwgNTAsIC01MCwgLTUwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgNTAsIDUwLCAtNTAsIC01MCwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JQ2FyZXRbXSBjYXJldHMgPSBuZXcgQ2FyZXRbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNhcmV0c1tpXSA9IG5ldyBDYXJldChjYW52YXMsIFNXVC5OT05FKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljYW52YXMuc2V0Q2FyZXQoY2FyZXRzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCJDYXJldCAjICIgKyBpICsgIm5vdCBzZXQgcHJvcGVybHkiLCBjYW52YXMuZ2V0Q2FyZXQoKSwgY2FyZXRzW2ldKTsKLQl9Ci0KLQljYW52YXMuc2V0Q2FyZXQobnVsbCk7Ci0JYXNzZXJ0TnVsbCgiQ2FyZXQgc2hvdWxkIGJlIG51bGwiICwgY2FudmFzLmdldENhcmV0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRm9udERhdGEgZm9udERhdGEgPSBjYW52YXMuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoY2FudmFzLmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCA4LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQljYW52YXMuc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjYW52YXMuZ2V0Rm9udCgpLmVxdWFscyhmb250KSk7Ci0JY2FudmFzLnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zY3JvbGxJSUlJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldCIpKSB0ZXN0X2dldENhcmV0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zY3JvbGxJSUlJSUlaIikpIHRlc3Rfc2Nyb2xsSUlJSUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQiKSkgdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20qLwotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMjAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjliMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FyZXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhcmV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1DYW52YXMgY2FudmFzOwotQ2FyZXQgY2FyZXQ7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JY2FyZXQgPSBuZXcgQ2FyZXQoY2FudmFzLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KGNhcmV0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJKCkgewotCUNhcmV0IG5ld0NhcmV0OwotCXRyeSB7Ci0JCW5ld0NhcmV0ID0gbmV3IENhcmV0KG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgwLDAsMzAsMzApOwotCWNhcmV0LnNldEJvdW5kcyhyZWN0KTsKLQlhc3NlcnRUcnVlKGNhcmV0LmdldEJvdW5kcygpLmVxdWFscyhyZWN0KSk7Ci0KLQlyZWN0ID0gbmV3IFJlY3RhbmdsZSgwLDAsMzAsMzApOwotCWNhcmV0LnNldEJvdW5kcyhyZWN0KTsKLQlhc3NlcnRUcnVlKCFjYXJldC5nZXRCb3VuZHMoKS5lcXVhbHMobmV3IFJlY3RhbmdsZSAoMCwwLDYwLDcwKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMb2NhdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMoY2FudmFzLCBjYXJldC5nZXRQYXJlbnQoKSk7Ci0KLQlhc3NlcnRUcnVlKGNhcmV0LmdldERpc3BsYXkoKT09c2hlbGwuZ2V0RGlzcGxheSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTaXplIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQljYXJldC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIWNhcmV0LmlzVmlzaWJsZSgpKTsgLy9iZWNhdXNlIHRoZSBzaGVsbCBpcyBub3QgdmlzaWJsZQotCi0JY2FyZXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuaXNWaXNpYmxlKCkpOwotCi0JY2FyZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQljYW52YXMuc2V0VmlzaWJsZSh0cnVlKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY2FyZXQuZ2V0VmlzaWJsZSgpID09IHRydWUpOwotCWNhbnZhcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQlpZiAoZkNoZWNrVmlzaWJpbGl0eSkgewotCQlhc3NlcnRUcnVlKCFjYXJldC5nZXRWaXNpYmxlKCkpOwotCX0KLQotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWNhbnZhcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQljYXJldC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjYXJldC5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0lJSUkoKSB7Ci0JY2FyZXQuc2V0Qm91bmRzKDAsIDAsIDMwLCAzMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY2FyZXQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMCwwLDMwLDMwKSk7Ci0KLQl0cnkgewotCQljYXJldC5zZXRCb3VuZHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJvdW5kcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnQgZm9udCA9IGNhcmV0LmdldEZvbnQoKTsKLQljYXJldC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBjYXJldC5nZXRGb250KCkpOwotCWNhcmV0LnNldEZvbnQobnVsbCk7Ci0JCi0JZm9udCA9IG5ldyBGb250KGNhcmV0LmdldERpc3BsYXkoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JY2FyZXQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY2FyZXQuZ2V0Rm9udCgpKTsKLQotCWNhcmV0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY2FyZXQuc2V0Rm9udChmb250KTsKLQkJY2FyZXQuc2V0Rm9udChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlJbWFnZSBpbWFnZSA9IGNhcmV0LmdldEltYWdlKCk7Ci0JY2FyZXQuc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgY2FyZXQuZ2V0SW1hZ2UoKSk7Ci0KLQljYXJldC5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKGNhcmV0LmdldEltYWdlKCkpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2Uoc2hlbGwuZ2V0RGlzcGxheSgpLCAxMCwgMTApOwotCWNhcmV0LnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGNhcmV0LmdldEltYWdlKCkpOwotCi0JY2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNhcmV0LnNldEltYWdlKGltYWdlKTsKLQkJY2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25JSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9jYXRpb25JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTaXplSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQljYXJldC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIkNhcmV0IHNob3VsZCBiZSB2aXNpYmxlIiwgY2FyZXQuZ2V0VmlzaWJsZSgpPT10cnVlKTsKLQotCWNhcmV0LnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIkNhcmV0IHNob3VsZCBub3QgYmUgdmlzaWJsZSIsIGNhcmV0LmdldFZpc2libGUoKT09ZmFsc2UpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYXRpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhc0kiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNJSUlJIikpIHRlc3Rfc2V0Qm91bmRzSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25JSSIpKSB0ZXN0X3NldExvY2F0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGEwZTNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotQ29sb3JEaWFsb2cgY29sb3JEaWFsb2c7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhjb2xvckRpYWxvZyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCW5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCi0JdHJ5IHsKLQkJbmV3IENvbG9yRGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCW5ldyBDb2xvckRpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCQotCXRyeSB7Ci0JCW5ldyBDb2xvckRpYWxvZyhudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0IoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JUkdCIHJnYiA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCBjb2xvckRpYWxvZy5nZXRSR0IoKSA9PSBudWxsKTsJCi0JCQotCWNvbG9yRGlhbG9nLnNldFJHQihyZ2IpOwotCWFzc2VydFRydWUoIjpiOiIsIGNvbG9yRGlhbG9nLmdldFJHQigpID09IHJnYik7Ci0KLQljb2xvckRpYWxvZy5zZXRSR0IobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY29sb3JEaWFsb2cuZ2V0UkdCKCkgPT0gbnVsbCk7CQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQiIpKSB0ZXN0X2dldFJHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOWQ3NTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm8KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLQlDb21ibyBjb21ibzsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY29tYm8pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJY29tYm8gPSBuZXcgQ29tYm8obnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0ge1NXVC5EUk9QX0RPV04sIFNXVC5TSU1QTEV9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIFN0cmluZy52YWx1ZU9mKGkpLCAoY29tYm8uZ2V0U3R5bGUoKSAmIGNhc2VzW2ldKSA9PSBjYXNlc1tpXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWNvbWJvLmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLmFkZCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBuZXcgU3RyaW5nW117IiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoIiIpOwotCWFzc2VydEVxdWFscygiOmI6IiwgbmV3IFN0cmluZ1tdeyIiLCAiIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIpOwotCWFzc2VydEVxdWFscygiOmM6IiwgbmV3IFN0cmluZ1tdeyIiLCAiIiwgImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JdHJ5IHsKLQkJY29tYm8uYWRkKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uYWRkKCJzdHJpbmciLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5hZGQoInN0cmluZzAiLCAwKTsKLQl0cnkgewotCQljb21iby5hZGQoInN0cmluZzEiLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPiBzaXplIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQljb21iby5hZGQoImZyZWQiLCAwKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQiLCBuZXcgU3RyaW5nW117ImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIGZyZWQiLCBuZXcgU3RyaW5nW117ImZyZWQiLCAiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQgZnJlZCBmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkIiwgImZyZWQiLCAiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQlpbnQgbnVtYmVyID0gMzsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQwIGZyZWQxIGZyZWQyIGZyZWQiLCBuZXcgU3RyaW5nW117ImZyZWQwIiwgImZyZWQxIiwgImZyZWQyIiwgImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQludW1iZXIgPSAzOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5hZGQoImZyZWQiLCAxKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQwIGZyZWQgZnJlZDEgZnJlZDIiLCBuZXcgU3RyaW5nW117ImZyZWQwIiwgImZyZWQiLCAiZnJlZDEiLCAiZnJlZDIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIGZyZWQwIGZyZWQgZnJlZDEgZnJlZDIiLCBuZXcgU3RyaW5nW117ImZyZWQiLCAiZnJlZDAiLCAiZnJlZCIsICJmcmVkMSIsICJmcmVkMiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiLCA0KTsKLQlhc3NlcnRFcXVhbHMoImZyZWQgZnJlZDAgZnJlZCBmcmVkMSBmcmVkIGZyZWQyIiwgbmV3IFN0cmluZ1tdeyJmcmVkIiwgImZyZWQwIiwgImZyZWQiLCAiZnJlZDEiLCAiZnJlZCIsICJmcmVkMiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgbWV0aG9kcyBzZW5kIGEgTW9kaWZ5IGV2ZW50CQotCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWNvbWJvLnNldFRleHQoIm5ldyB0ZXh0Iik7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCWNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JY29tYm8uc2V0VGV4dCgibGluZSIpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl0cnkgewotCQljb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQljb21iby5zZWxlY3QoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCWNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0cnkgewotCQljb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyU2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgMCkpKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDUpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDApKSk7ICAvL25vdGhpbmcgaXMgc2VsZWN0ZWQKLQljb21iby5zZXRUZXh0KCJzb21lIHRleHQiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDUpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDUpKSk7Ci0JY29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjb21iby5nZXRTZWxlY3Rpb24oKS54PT1jb21iby5nZXRTZWxlY3Rpb24oKS55KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5KCkgewotCWNvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY29tYm8uY29weSgpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwwKSk7Ci0JY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIyMzEyMzQ1NiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jdXQoKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5jdXQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIxNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCWNvbWJvLmFkZCgiMTIzIik7Ci0JY29tYm8uYWRkKCI0NTYiKTsKLQljb21iby5hZGQoIjc4OSIpOwotCWNvbWJvLnNlbGVjdCgwKTsKLQljb21iby5zZWxlY3QoMik7Ci0JY29tYm8uZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPT0gLTEpOwotfQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0JLy8gaW5kaWNlcyBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQKLQlTdHJpbmdbXSBpdGVtcyA9IHsiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIifTsKLQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JY29tYm8uc2VsZWN0KDEpOwotCWNvbWJvLmRlc2VsZWN0KDEwKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JY29tYm8uZGVzZWxlY3QoMik7Ci0KLQlpbnQgbnVtYmVyID0gMTA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uc2VsZWN0KGkpOwotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT09aSk7Ci0JCWNvbWJvLmRlc2VsZWN0KGkpOwotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT09LTEpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZHJlbigpIHsKLQkvLyBDb21ibyBjYW5ub3QgaGF2ZSBjaGlsZHJlbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gaSk7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmFhOiIsIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IG51bWJlcik7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSBudW1iZXItaSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQljb21iby5nZXRJdGVtSGVpZ2h0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uZ2V0SXRlbSgwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnQgbnVtYmVyID0gMTA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoY29tYm8uZ2V0SXRlbShpKS5lcXVhbHMoImZyZWQiICsgaSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWNvbWJvLmFkZCgiMSIpOwotCWNvbWJvLmFkZCgiMiIpOwotCWNvbWJvLmFkZCgiMyIpOwotCVN0cmluZ1tdIGl0ZW1zID0gY29tYm8uZ2V0SXRlbXMoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBpdGVtcy5sZW5ndGg9PTMpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zWzBdLmVxdWFscygiMSIpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBpdGVtc1sxXS5lcXVhbHMoIjIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXNbMl0uZXF1YWxzKCIzIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWVudGF0aW9uKCkgewotCS8vIHRlc3RlZCBpbiBzZXRPcmllbnRhdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmdldFNlbGVjdGlvbigpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMSwzKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWFzc2VydEVxdWFscygtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5zZWxlY3QoaSk7Ci0JCWFzc2VydEVxdWFscyhpLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uc2VsZWN0KGkpOwotCQljb21iby5kZXNlbGVjdChpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgImZyZWQiLCAiZnJlZGZyZWQifTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YToiICsgU3RyaW5nLnZhbHVlT2YoaSksIGNhc2VzW2ldLmVxdWFscyhjb21iby5nZXRUZXh0KCkpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEhlaWdodCgpIHsKLQljb21iby5nZXRUZXh0SGVpZ2h0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dExpbWl0KCkgewotCWNvbWJvLnNldFRleHRMaW1pdCgzKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0TGltaXQoKT09Myk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzRm9jdXMoKSB7Ci0JLy8gbm90IHB1YmxpYyBhcGkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JY29tYm8uYWRkKCJzdHJpbmcwIik7Ci0JdHJ5IHsKLQkJY29tYm8uaW5kZXhPZihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5yZW1vdmUoImZyZWQzIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0JCWFzc2VydEVxdWFscyhpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoImZyZWQzIikpOwotCWZvciAoaW50IGkgPSA0OyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpIC0gMSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8ucmVtb3ZlKDIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5pbmRleE9mKCJmcmVkMiIpKTsKLQlmb3IgKGludCBpID0gMzsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JY29tYm8uYWRkKCJzdHJpbmcwIik7Ci0JdHJ5IHsKLQkJY29tYm8uaW5kZXhPZihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigic3RyaW5nMCIsIC0xKSk7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGksIDApID09IGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGksIGkgKyAxKSA9PSAtMSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGksIDApID09IGkpOwotCWZvciAoaW50IGkgPSAzOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGksIDMpID09IGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGksIGkpID09IGkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bhc3RlKCkgewotCWNvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY29tYm8uY3V0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTQ1NiIpKTsKLQljb21iby5wYXN0ZSgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjEyMzQ1NiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JY29tYm8uYWRkKCIxIik7Ci0JY29tYm8uYWRkKCIyIik7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0SXRlbXMoKS5sZW5ndGg9PTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUkoKSB7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5yZW1vdmUoLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb21iby5yZW1vdmVBbGwoKTsKLQotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGl0ZW1zIiwgbnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5yZW1vdmUoMCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsgIC8vIGFsbCBpdGVtcyB0aGUgc2FtZQotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGl0ZW1zIiwgbnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5yZW1vdmUoMCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiICsgaSk7IC8vIGRpZmZlcmVudCBpdGVtcwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8uc2VsZWN0KDApOwotCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAwLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzIHx8IFN3dEp1bml0LmlzR1RLIHx8IFN3dEp1bml0LmlzQ2FyYm9uKSB7Ci0JCQkvLyBUaGUgYmVoYXZpb3Igb24gV2luZG93cyBhbmQgR1RLIHdoZW4gdGhlIHNlbGVjdGVkIGl0ZW0gaXMgcmVtb3ZlZAotCQkJLy8gaXMgdG8gc2ltcGx5IHNheSB0aGF0IG5vIGl0ZW1zIGFyZSBzZWxlY3RlZC4KLQkJCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBiZWhhdmlvciBvbiBvdGhlciBwbGF0Zm9ybXMgd2hlbiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyByZW1vdmVkCi0JCQkvLyBpcyB0byBzZWxlY3QgdGhlIGl0ZW0gdGhhdCBpcyBub3cgYXQgdGhlIHNhbWUgaW5kZXgsIGFuZCBzZW5kIGEKLQkJCS8vIHNlbGVjdGlvbiBldmVudC4gSWYgdGhlcmUgaXMgbm8gaXRlbSBhdCB0aGUgc2VsZWN0ZWQgaW5kZXgsIHRoZW4KLQkJCS8vIHRoZSBwbGF0Zm9ybSBzYXlzIHRoYXQgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLgotCQkJaWYgKGkgPCBudW1iZXIgLSAxKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgMCwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsgLy8gZGlmZmVyZW50IGl0ZW1zCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZShudW1iZXItaS0xKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JY29tYm8ucmVtb3ZlKDAsIDQpOwotCWFzc2VydEVxdWFscygwLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMCwgMik7Ci0JYXNzZXJ0RXF1YWxzKDIsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgyLCA0KTsKLQlhc3NlcnRFcXVhbHMoMiwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JY29tYm8ucmVtb3ZlKDMsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKDIsIDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKC0xLCBudW1iZXItMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0YXJ0IGluZGV4IDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5yZW1vdmUoImZyZWQiICsgaSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5yZW1vdmUoImZyZWQiKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiKTsKLQl0cnkgewotCQljb21iby5yZW1vdmUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JdHJ5IHsJCi0JCWNvbWJvLnJlbW92ZSgiZnJlZCIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtIG5vdCBmb3VuZCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYXNzZXJ0RXF1YWxzKG51bWJlciwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZE1vZGlmeUxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFNlbGVjdGlvbkxpc3RlbmVyIG1ldGhvZAotfQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCWNvbWJvLmFkZCgiMTIzIik7Ci0JY29tYm8uYWRkKCI0NTYiKTsKLQljb21iby5hZGQoIjc4OSIpOwotCWNvbWJvLnNlbGVjdCgxKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPT0gMSk7Ci0JCi0JLy8gaW5kaWNlcyBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQKLQljb21iby5zZWxlY3QoMTApOwotCWFzc2VydEVxdWFscygxLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKDMsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oMCwgImZyZWQiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JY29tYm8uYWRkKCJzdHJpbmcwIik7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oLTEsICJuZXcgdmFsdWUiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQljb21iby5hZGQoImpvZSIpOwotCWNvbWJvLnNldEl0ZW0oMCwgImZyZWQiKTsJCi0JYXNzZXJ0VHJ1ZSgiZnJlZCIsIGNvbWJvLmdldEl0ZW0oMCkuZXF1YWxzKCJmcmVkIikpOwotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSg0LCAiZnJlZCIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLnNldEl0ZW0oaSwgImZyZWQiICsgaSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBuZXcgU3RyaW5nW117ImZyZWQwIiwgImZyZWQxIiwgImZyZWQyIiwgImZyZWQzIiwgImZyZWQ0In0sIGNvbWJvLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVN0cmluZ1tdW10gaXRlbXMgPSB7e30sIHsiIn0sIHsiIiwgIiJ9LCB7ImZyZWQifSwgeyJmcmVkMCIsICJmcmVkMCJ9LCB7ImZyZWQiLCAiZnJlZCJ9fTsKLQotCWZvciAoaW50IGkgPSAwIDsgaTwgaXRlbXMubGVuZ3RoOyBpKyspewotCQljb21iby5zZXRJdGVtcyhpdGVtc1tpXSk7Ci0JCWFzc2VydEVxdWFscygiOmE6IiArIGksIGl0ZW1zW2ldLCBjb21iby5nZXRJdGVtcygpKTt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0T3JpZW50YXRpb25JKCkgewotCWNvbWJvLnNldE9yaWVudGF0aW9uKFNXVC5SSUdIVF9UT19MRUZUKTsKLQlpZiAoKGNvbWJvLmdldFN0eWxlKCkgJiBTV1QuTUlSUk9SRUQpICE9IDApIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0T3JpZW50YXRpb24oKT09U1dULlJJR0hUX1RPX0xFRlQpOwotCX0KLQljb21iby5zZXRPcmllbnRhdGlvbihTV1QuTEVGVF9UT19SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29tYm8uZ2V0T3JpZW50YXRpb24oKT09U1dULkxFRlRfVE9fUklHSFQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0U2VsZWN0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwb2ludCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCAwKSkpOwotCWNvbWJvLnNldFRleHQoInNvbWUgdGV4dCIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjpiOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgNSkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldFRleHRMaW1pdCgwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGltaXQgPT0gMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5zZXRUZXh0TGltaXQoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dExpbWl0KCk9PTMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0ZXh0ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAiZnJlZCIsICJmcmVkMCJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjpjOiIgKyBpLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NsZWFyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T3JpZW50YXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRMaW1pdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYXN0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmllbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMaW1pdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NsZWFyU2VsZWN0aW9uIikpIHRlc3RfY2xlYXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SSIpKSB0ZXN0X2Rlc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEhlaWdodCIpKSB0ZXN0X2dldFRleHRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRMaW1pdCIpKSB0ZXN0X2dldFRleHRMaW1pdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJIikpIHRlc3RfcmVtb3ZlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSUkiKSkgdGVzdF9yZW1vdmVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RJIikpIHRlc3Rfc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpKSB0ZXN0X3NldE9yaWVudGF0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCWNvbWJvLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci0JLy8gb25seSBjaGVjayB4LCB5LCBhbmQgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS55ID09IDIwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLndpZHRoID09IDMwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQljb21iby5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotCS8vIG9ubHkgY2hlY2sgeCwgeSwgYW5kIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnggPT0gMTApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkueSA9PSAyMCk7Ci0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS53aWR0aCA9PSAzMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUlJKCkgewotCWNvbWJvLnNldFNpemUoMzAsIDQwKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMCk7Ci0KLQljb21iby5zZXRTaXplKDMyLCA0Myk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCWNvbWJvLnNldFNpemUobmV3IFBvaW50KDMwLCA0MCkpOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMwKTsKLQotCWNvbWJvLnNldEJvdW5kcygzMiwgNDMsIDMzLCA0NCk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzMpOwotCi0JY29tYm8uc2V0Qm91bmRzKDMyLCA0MywgMzAsIDQwKTsKLQljb21iby5zZXRMb2NhdGlvbigxMSwgMjIpOwotCWNvbWJvLnNldFNpemUobmV3IFBvaW50KDMyLCA0MykpOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZCgpIHsKLSAgICBjb21iby5hZGQoInRoaXMiKTsKLSAgICBjb21iby5hZGQoImlzIik7Ci0gICAgY29tYm8uYWRkKCJTV1QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNvbWJvLmdldFNpemUoKS54LTEwLCA1LCAzMCwgY29tYm8uZ2V0SXRlbUhlaWdodCgpKjIsIAotICAgICAgICAgICAgCQkgQ29uc2lzdGVuY3lVdGlsaXR5LlNFTEVDVElPTik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgLy9vbiBhcnJvdwotICAgIGNvbnNpc3RlbmN5RXZlbnQoY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgLy9vbiB0ZXh0Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThhMDg4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlIHsKLQotQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCAwKTsKLQlzdXBlci5zZXRXaWRnZXQoY29tcG9zaXRlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7U1dULkhfU0NST0xMLCBTV1QuVl9TQ1JPTEwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgbmV3IENvbnRyb2xbXXt9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgbmV3IENvbnRyb2xbXXtjMX0sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQotCUxpc3QgYzIgPSBuZXcgTGlzdChjb21wb3NpdGUsIDApOwotCWFzc2VydEVxdWFscygiOmM6IiwgbmV3IENvbnRyb2xbXXtjMSwgYzJ9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQlCdXR0b24gYzMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCBuZXcgQ29udHJvbFtde2MxLCBjMiwgYzN9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQljMi5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCBuZXcgQ29udHJvbFtde2MxLCBjM30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQkKLQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQljaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0KLQlhc3NlcnRFcXVhbHMoIjpmOiIsIG5ldyBDb250cm9sW117fSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExheW91dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFiTGlzdCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2xheW91dFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXlvdXRaKCkgewotCS8vIHRlc3RlZCBpbiBzcGVjaWZpYyBMYXlvdXQgY2xhc3NlcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0JLy8gdGVzdGVkIGluIHNwZWNpZmljIExheW91dCBjbGFzc2VzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCUNvbnRyb2xbXSB0YWJsaXN0ID0gbmV3IENvbnRyb2xbXSB7YnV0dG9uMSwgYnV0dG9uMn07Ci0JY29tcG9zaXRlLnNldFRhYkxpc3QodGFibGlzdCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxpc3QsIGNvbXBvc2l0ZS5nZXRUYWJMaXN0KCkpOwotCWJ1dHRvbjEuZGlzcG9zZSgpOwotCWJ1dHRvbjIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZHJlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJMaXN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkcmVuIikpIHRlc3RfZ2V0Q2hpbGRyZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExheW91dCIpKSB0ZXN0X2dldExheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFiTGlzdCIpKSB0ZXN0X2dldFRhYkxpc3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dCIpKSB0ZXN0X2xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0WiIpKSB0ZXN0X2xheW91dFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKSkgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCWlmIChjb21wb3NpdGUgIT0gbnVsbCkKLQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQljb21wb3NpdGUgPSAoQ29tcG9zaXRlKXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZGVhYTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCUNvbnRyb2xMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdmUsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuUmVzaXplLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKSB7Ci0JRm9jdXNMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c0luLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzT3V0LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZUZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlIZWxwTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSGVscExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKCkgewotCUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlVcCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKSB7Ci0JTW91c2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VEb3duLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlVXAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCkgewotCU1vdXNlTW92ZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkTW91c2VNb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VNb3ZlLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKSB7Ci0JTW91c2VUcmFja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9OwotCX07Ci0JY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VFbnRlciwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZUV4aXQsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VIb3ZlciwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCkgewotCVBhaW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX07Ci0JfTsKLQljb250cm9sLmFkZFBhaW50TGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCUdDIGdjID0gZXZlbnQuZ2MgPSBuZXcgR0MoY29udHJvbCk7CQotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5QYWludCwgZXZlbnQpOwotCWdjLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlUGFpbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JVHJhdmVyc2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCWNvbnRyb2wuYWRkVHJhdmVyc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5UcmF2ZXJzZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJKCkgewotCWNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlQb2ludCBzaXplID0gY29udHJvbC5nZXRTaXplKCk7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29udHJvbC5nZXRTaXplKCkueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgY29udHJvbC5nZXRTaXplKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCVBvaW50IHNpemUgPSBjb250cm9sLmdldFNpemUoKTsKLQljb250cm9sLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55LCBmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29udHJvbC5nZXRTaXplKCkueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgY29udHJvbC5nZXRTaXplKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9yY2VGb2N1cygpIHsKLQkvLyB0aGlzIGlzIGRpZmZpY3VsdCB0byB0ZXN0IGluIENvbnRyb2wuCi0JLy8gc3ViY2xhc3NlcyB0aGF0IHdpc2ggdG8gdGVzdCB0aGlzIHNob3VsZCBvdmVycmlkZS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBY2Nlc3NpYmxlKCkgewotCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpOwotCWFzc2VydFRydWUoIjphOiIsIGFjY2Vzc2libGUgIT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvcmRlcldpZHRoKCkgewotCWNvbnRyb2wuZ2V0Qm9yZGVyV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Qm91bmRzSUlJSSBhbmQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RW5hYmxlZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGF5b3V0RGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHsKLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmdldExvY2F0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgzMiwgNDMpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVudSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNb25pdG9yKCkgewotCU1vbml0b3IgbW9uaXRvciA9IGNvbnRyb2wuZ2V0TW9uaXRvcigpOwotCWFzc2VydE5vdE51bGwobW9uaXRvcik7Ci0JRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbC5nZXREaXNwbGF5KCk7Ci0JTW9uaXRvcltdIG1vbml0b3JzID0gZGlzcGxheS5nZXRNb25pdG9ycygpOwotCWludCBpOwotCS8qIG1vbml0b3IgbXVzdCBiZSBsaXN0ZWQgaW4gRGlzcGxheS5nZXRNb25pdG9ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlpZiAobW9uaXRvci5lcXVhbHMobW9uaXRvcnNbaV0pKSBicmVhazsKLQl9Ci0JaWYgKGkgPT0gbW9uaXRvcnMubGVuZ3RoKSB7Ci0JCWZhaWwoIkNvbnRyb2wuZ2V0TW9uaXRvciBkb2VzIG5vdCByZXR1cm4gYSBtb25pdG9yIGxpc3RlZCBpbiBEaXNwbGF5LmdldE1vbml0b3JzIik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMoc2hlbGwsIGNvbnRyb2wuZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxsKCkgewotCWFzc2VydEVxdWFscyhzaGVsbCwgY29udHJvbC5nZXRTaGVsbCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNpemVJSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGludGVudGlvbmFsbHkgbm90IHRlc3RlZCAtIG5vdCBwdWJsaWMgQVBJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCWNvbnRyb2wuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuaXNFbmFibGVkKCkpOwotCi0JY29udHJvbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0ZvY3VzQ29udHJvbCgpIHsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzRm9jdXNDb250cm9sKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzUmVwYXJlbnRhYmxlKCkgewotCWFzc2VydEVxdWFscyAoImlzUmVwYXJlbnRhYmxlIiwgY29udHJvbC5pc1JlcGFyZW50YWJsZSgpLCBpc1JlcGFyZW50YWJsZVBsYXRmb3JtKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc1Zpc2libGUoKSk7ICAvL2JlY2F1c2UgdGhlIHNoZWxsIGlzIG5vdCB2aXNpYmxlCi0KLQljb250cm9sLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCi0JaWYgKCFTd3RKdW5pdC5pc0FJWCkgewotCQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgYmUgdmlzaWJsZSIsIGNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgiV2luZG93IHNob3VsZCBub3QgYmUgdmlzaWJsZSIsICFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW92ZUFib3ZlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JY29udHJvbC5tb3ZlQWJvdmUobnVsbCk7Ci0KLQljb250cm9sLm1vdmVBYm92ZShjb250cm9sKTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgMCk7Ci0JY29udHJvbC5tb3ZlQWJvdmUoYik7Ci0JYi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW92ZUJlbG93TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JY29udHJvbC5tb3ZlQmVsb3cobnVsbCk7Ci0KLQljb250cm9sLm1vdmVCZWxvdyhjb250cm9sKTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgMCk7Ci0JY29udHJvbC5tb3ZlQmVsb3coYik7Ci0JYi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQljb250cm9sLnBhY2soKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYWNrWigpIHsKLQljb250cm9sLnBhY2sodHJ1ZSk7Ci0JY29udHJvbC5wYWNrKGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXcoKSB7Ci0JY29udHJvbC5yZWRyYXcoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXdJSUlJWigpIHsKLQljb250cm9sLnJlZHJhdygwLCAwLCAwLCAwLCBmYWxzZSk7Ci0KLQljb250cm9sLnJlZHJhdygwLCAwLCAwLCAwLCB0cnVlKTsKLQotCWNvbnRyb2wucmVkcmF3KC0xMCwgLTEwLCAtMTAsIC0xMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygxMCwgMTAsIDEwLCAxMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygxMCwgMTAsIDEwLCAxMCwgZmFsc2UpOwotCi0JY29udHJvbC5yZWRyYXcoMTAwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDAsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGNvbnRyb2wuZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCWNvbnRyb2wuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCBjb250cm9sLmdldEJhY2tncm91bmQoKSk7Ci0JY29udHJvbC5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpLmVxdWFscyhjb2xvcikpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCWNvbnRyb2wuc2V0Qm91bmRzKDEwLCAyMCwgMzAsIDQwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCksIGNvbnRyb2wuZ2V0Qm91bmRzKCkpOwotCi0JY29udHJvbC5zZXRCb3VuZHMoMjAsIDMwLCA0MCwgNTApOwotCWFzc2VydEVxdWFscyhmYWxzZSwgY29udHJvbC5nZXRCb3VuZHMoKS5lcXVhbHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKDEwLCAyMCwgMzAsIDQwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQljb250cm9sLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApLCBjb250cm9sLmdldEJvdW5kcygpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMjAsIDMwLCA0MCwgNTApKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbnRyb2wuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKSk7Ci0KLQl0cnkgewotCQljb250cm9sLnNldEJvdW5kcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29udHJvbC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcHR1cmVaKCkgewotCWNvbnRyb2wuc2V0Q2FwdHVyZSh0cnVlKTsKLQotCWNvbnRyb2wuc2V0Q2FwdHVyZShmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKSB7Ci0JY29udHJvbC5zZXRDdXJzb3IobnVsbCk7Ci0KLQlDdXJzb3IgYyA9IG5ldyBDdXJzb3IoY29udHJvbC5nZXREaXNwbGF5KCksIDApOwotCWNvbnRyb2wuc2V0Q3Vyc29yKGMpOwotCWMuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCWNvbnRyb2wuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuZ2V0RW5hYmxlZCgpKTsKLQotCWNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvY3VzKCkgewotCWNvbnRyb2wuc2V0Rm9jdXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnQgZm9udCA9IGNvbnRyb2wuZ2V0Rm9udCgpOwotCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY29udHJvbC5nZXRGb250KCkpOwotCQotCWZvbnQgPSBuZXcgRm9udChjb250cm9sLmdldERpc3BsYXkoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JY29udHJvbC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBjb250cm9sLmdldEZvbnQoKSk7Ci0KLQljb250cm9sLnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQljb250cm9sLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihjb250cm9sLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQljb250cm9sLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldEZvcmVncm91bmQoKS5lcXVhbHMoY29sb3IpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCkgewotCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0aGlzKTsKLQlhc3NlcnRFcXVhbHModGhpcywgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKCJhc2xkc2FoZGFoY2FzbGNzaGRhYyIpOwotCWFzc2VydEVxdWFscygiYXNsZHNhaGRhaGNhc2xjc2hkYWMiLCBjb250cm9sLmdldExheW91dERhdGEoKSk7Ci0KLQljb250cm9sLnNldExheW91dERhdGEodGhpcy5nZXRDbGFzcygpKTsKLQlhc3NlcnRFcXVhbHModGhpcy5nZXRDbGFzcygpLCBjb250cm9sLmdldExheW91dERhdGEoKSk7Ci0KLQljb250cm9sLnNldExheW91dERhdGEobnVsbCk7Ci0JYXNzZXJ0TnVsbChjb250cm9sLmdldExheW91dERhdGEoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25JSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbigxMSwgMjIpOwotCWNvbnRyb2wuc2V0U2l6ZSgzMiwgNDMpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIG5ldyBQb2ludCgxMSwgMjIpKTsKLQotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTAsIDEwKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBuZXcgUG9pbnQoMTAsIDEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXRyeSB7Ci0JCWNvbnRyb2wuc2V0TG9jYXRpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvY2F0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JUG9pbnQgbG9jID0gbmV3IFBvaW50KDMwLCA0MCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci0KLQlsb2MgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLQotCWxvYyA9IG5ldyBQb2ludCgxMDAwMCwgMTAwMDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24obG9jKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBsb2MpOwotCi0JbG9jID0gbmV3IFBvaW50KC0xMCwgLTEwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUgKCkgewotCS8qIHRoaXMgaXMgYSB2YWxpZCB0aGluZyB0byBkbywgeW91IGNhbiByZXNldCBhIG1lbnUgdG8gbm90aGluZyAqLwotCWNvbnRyb2wuc2V0TWVudShudWxsKTsKLQotCU1lbnUgbSA9IG5ldyBNZW51KGNvbnRyb2wpOwotCWNvbnRyb2wuc2V0TWVudShtKTsKLQlhc3NlcnRFcXVhbHMobSwgY29udHJvbC5nZXRNZW51KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0JaWYgKGNvbnRyb2wuaXNSZXBhcmVudGFibGUoKSkgewotCQlTaGVsbCBvcmlnaW5hbFBhcmVudCA9IG5ldyBTaGVsbCgpOwotCQlTaGVsbCBuZXdQYXJlbnQgPSBuZXcgU2hlbGwoKTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKG9yaWdpbmFsUGFyZW50LCBTV1QuUFVTSCk7Ci0JCWIuc2V0UGFyZW50KG5ld1BhcmVudCk7Ci0JCW9yaWdpbmFsUGFyZW50LmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSghYi5pc0Rpc3Bvc2VkKCkpOwotCQluZXdQYXJlbnQuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWRyYXdaKCkgewotCWNvbnRyb2wuc2V0UmVkcmF3KGZhbHNlKTsKLQotCWNvbnRyb2wuc2V0UmVkcmF3KHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgzMCwgNDApLCBjb250cm9sLmdldFNpemUoKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbigxMSwgMjIpOwotCWNvbnRyb2wuc2V0U2l6ZSgzMiwgNDMpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzIsIDQzKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JY29udHJvbC5zZXRTaXplKDAsIDApOwotCQotCWNvbnRyb2wuc2V0U2l6ZSgxMCwgMTApOwotCi0JY29udHJvbC5zZXRTaXplKDEwMDAwLCAxMDAwMCk7Ci0KLQljb250cm9sLnNldFNpemUoLTEwLCAtMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoMzAsIDQwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgzMCwgNDApLCBjb250cm9sLmdldFNpemUoKSk7Ci0KLQl0cnkgewotCQljb250cm9sLnNldFNpemUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNpemUgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDAsIDApKTsKLQkKLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDEwLCAxMCkpOwotCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgxMDAwMCwgMTAwMDApKTsKLQotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoLTEwLCAtMTApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWNvbnRyb2wuc2V0VG9vbFRpcFRleHQoIlRoaXMgaXMgYSB0aXAiKTsKLQlhc3NlcnRFcXVhbHMoIlRoaXMgaXMgYSB0aXAiLCBjb250cm9sLmdldFRvb2xUaXBUZXh0KCkpOwotCi0JY29udHJvbC5zZXRUb29sVGlwVGV4dChudWxsKTsKLQlhc3NlcnROdWxsKGNvbnRyb2wuZ2V0VG9vbFRpcFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY29udHJvbC5nZXRWaXNpYmxlKCkpOwotCi0JY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldFZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9Db250cm9sSUkoKSB7Ci0JUG9pbnQgY29udHJvbENvb3JkcyA9IGNvbnRyb2wudG9Db250cm9sKDAsIDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMCwgMCksIGNvbnRyb2wudG9EaXNwbGF5KGNvbnRyb2xDb29yZHMueCwgY29udHJvbENvb3Jkcy55KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlQb2ludCBjb250cm9sQ29vcmRzID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KDAsIDApKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvRGlzcGxheShjb250cm9sQ29vcmRzKSk7Ci0JdHJ5IHsKLQkJY29udHJvbC50b0NvbnRyb2wobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNpemUgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9EaXNwbGF5SUkoKSB7Ci0JUG9pbnQgZGlzcGxheUNvb3JkcyA9IGNvbnRyb2wudG9EaXNwbGF5KDAsIDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMCwgMCksIGNvbnRyb2wudG9Db250cm9sKGRpc3BsYXlDb29yZHMueCwgZGlzcGxheUNvb3Jkcy55KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlQb2ludCBkaXNwbGF5Q29vcmRzID0gY29udHJvbC50b0Rpc3BsYXkobmV3IFBvaW50KDAsIDApKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvQ29udHJvbChkaXNwbGF5Q29vcmRzKSk7Ci0JdHJ5IHsKLQkJY29udHJvbC50b0Rpc3BsYXkobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNpemUgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJhdmVyc2VJKCkgewotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX0VTQ0FQRSk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfUkVUVVJOKTsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKTsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUKTsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlKCkgewotCWNvbnRyb2wudXBkYXRlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9yY2VGb2N1cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWNjZXNzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm9yZGVyV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGF5b3V0RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1vbml0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0ZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNSZXBhcmVudGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW92ZUFib3ZlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWNrWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FwdHVyZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvRGlzcGxheUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0Rpc3BsYXlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmF2ZXJzZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3VwZGF0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIikpIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpKSB0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKSkgdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKSkgdGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIikpIHRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIikpIHRlc3RfYWRkVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUkiKSkgdGVzdF9jb21wdXRlU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3JjZUZvY3VzIikpIHRlc3RfZm9yY2VGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWNjZXNzaWJsZSIpKSB0ZXN0X2dldEFjY2Vzc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3JkZXJXaWR0aCIpKSB0ZXN0X2dldEJvcmRlcldpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExheW91dERhdGEiKSkgdGVzdF9nZXRMYXlvdXREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZW51IikpIHRlc3RfZ2V0TWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TW9uaXRvciIpKSB0ZXN0X2dldE1vbml0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGwiKSkgdGVzdF9nZXRTaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZpc2libGUiKSkgdGVzdF9nZXRWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1JlcGFyZW50YWJsZSIpKSB0ZXN0X2lzUmVwYXJlbnRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Zpc2libGUiKSkgdGVzdF9pc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfbW92ZUFib3ZlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfbW92ZUJlbG93TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3BhY2siKSkgdGVzdF9wYWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrWiIpKSB0ZXN0X3BhY2taKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzSUlJSSIpKSB0ZXN0X3NldEJvdW5kc0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcHR1cmVaIikpIHRlc3Rfc2V0Q2FwdHVyZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIikpIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uSUkiKSkgdGVzdF9zZXRMb2NhdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpKSB0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFyZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpKSB0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplSUkiKSkgdGVzdF9zZXRTaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b0NvbnRyb2xJSSIpKSB0ZXN0X3RvQ29udHJvbElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9EaXNwbGF5SUkiKSkgdGVzdF90b0Rpc3BsYXlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyYXZlcnNlSSIpKSB0ZXN0X3RyYXZlcnNlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdXBkYXRlIikpIHRlc3RfdXBkYXRlKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCUNvbnRyb2wgY29udHJvbDsKLQlib29sZWFuIGV2ZW50T2NjdXJyZWQ7Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCWNvbnRyb2wgPSAoQ29udHJvbCl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotLyogYSBkaWZmZXJlbnQgbWV0aG9kIGluIENvbnNpc3RlbmN5VXRpbGl0eSBpcyBpbnZva2VkIGRlcGVuZGluZyBvbiB3aGF0IG1ldGhvZCAKLSAqIGVxdWFscwotICogQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLOgotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCAJCQkJICAKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wKLSAqIAkJCXBhcmFtQyBpcyB0aGUgbW91c2UgYnV0dG9uIHRvIGNsaWNrLgotICogCQkJcGFyYW1EIGlmIGl0IGVxdWFscyBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIHRoZW4gYW5vdGhlciBjbGljawotICogCQkJd2lsbCBiZSBtYWRlIG9uIHRoZSBib3JkZXIgb2YgdGhlIHNoZWxsLCB0byBlc2NhcGUgdGhlIG1lbnUgdGhhdCBjYW1lIHVwCi0gKiAJCQkoaWUgcmlnaHQgY2xpY2tpbmcgaW4gYSB0ZXh0IHdpZGdldCkKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhEaXNwbGF5LCBQb2ludCwgaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLCi0gKiAJCQlwYXJhbUEgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIAkJCQkgIAotICogCQkJcGFyYW1CIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbAotICogCQkJcGFyYW1DIGlzIHRoZSBtb3VzZSBidXR0b24gdG8gY2xpY2suCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlQ2xpY2soRGlzcGxheSwgUG9pbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHOgotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgb3JpZ2luIG9mIGRyYWcKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIG9yaWdpbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUMgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBkZXN0aW5hdGlvbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBkZXN0aW5hdGlvbiBvZiBkcmFnCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RHJhZyhEaXNwbGF5LCBQb2ludCwgUG9pbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTOiAgCi0gKiAJCSAJcGFyYW1BIGlzIHRoZSBjaGFyYWN0ZXIgdG8gcHJlc3MKLSAqIAkJCXBhcmFtQiBpcyB0aGUga2V5Q29kZSAKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RLZXlQcmVzcyhEaXNwbGF5LCBpbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTOiAgCi0gKiAJCSAJcGFyYW1BIGlzIHRoZSBjaGFyYWN0ZXIgdG8gcHJlc3MgYW5kIGhvbGQKLSAqIAkJCXBhcmFtQiBpcyB0aGUga2V5Q29kZSAKLSAqIAkJCXBhcmFtQyBpcyB0aGUgc2Vjb25kIGtleSB0byBwcmVzcyB3aGlsZSB0aGUgZmlyc3Qgb25lIGlzIGhlbGQgKGllIGN0cmwtYSkKLSAqIAkJCXBhcmFtRCBpcyB0aGUgc2Vjb25kIGtleWNvZGUKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3REb3VibGVLZXlQcmVzcyhEaXNwbGF5LCBpbnQsIGludCwgaW50LCBpbnQpIAotICogQ29uc2lzdGVuY3lVdGlsaXR5LlNFTEVDVElPTjoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIGZpcnN0IGNsaWNrCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBmaXJzdCBjbGljawotICogCQkJcGFyYW1DIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgc2Vjb25kIGNsaWNrCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBzZWNvbmQgY2xpY2sKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RTZWxlY3Rpb24oRGlzcGxheSwgUG9pbnQsIFBvaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5LlNIRUxMX0lDT05JRlk6Ci0gKiAJCQlwYXJhbUEgaXMgdGhlIGJ1dHRvbiB0byBjbGljayB3aXRoCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KERpc3BsYXksIFBvaW50LCBpbnQpCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoZmluYWwgaW50IHBhcmFtQSwgZmluYWwgaW50IHBhcmFtQiwgCi0gICAgICAgIAkJCQkJCWZpbmFsIGludCBwYXJhbUMsIGZpbmFsIGludCBwYXJhbUQsCi0gICAgICAgIAkJCQkJCWZpbmFsIGludCBtZXRob2QsIFZlY3RvciBldmVudHMsIGJvb2xlYW4gZm9jdXMpIHsKLSAgICBpZihmVGVzdENvbnNpc3RlbmN5KSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLSAgICAgICAgaWYoZXZlbnRzID09IG51bGwpIAotICAgICAgICAgICAgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdCA9IGdldFRlc3ROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBzaGVsbC5zZXRMYXlvdXQobmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dCgpKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dCgiUGFyZW50Iik7Ci0KLSAgICAgICAgc2hlbGwucGFjaygpOwotICAgIAlzaGVsbC5vcGVuKCk7Ci0gICAgCWlmKGNvbnRyb2wgaW5zdGFuY2VvZiBTaGVsbCkgewotICAgIAkgICAgKChTaGVsbCljb250cm9sKS5wYWNrKCk7Ci0gICAgICAgIAkoKFNoZWxsKWNvbnRyb2wpLm9wZW4oKTsKLSAgICAJfQotICAgIAlmaW5hbCBQb2ludFtdIHB0ID0gZGV0ZXJtaW5lTG9jYXRpb25zKHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kKTsKLSAgICAgICAgaWYoZm9jdXMgJiYgIWNvbnRyb2wuc2V0Rm9jdXMoKSkKLSAgICAgICAgICAgIGNvbnRyb2wuZm9yY2VGb2N1cygpOwotICAgICAgICBTdHJpbmdbXSBleHBlY3RlZEV2ZW50cyA9IGhvb2tFeHBlY3RlZEV2ZW50cyh0ZXN0LCBldmVudHMpOwotICAgICAgICBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpc3BsYXkud2FrZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaChtZXRob2QpIHsKLSAgICAgICAgICAgICAgICAJY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0s6Ci0gICAgICAgICAgICAgICAgCQlBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdENsaWNrKGRpc3BsYXksIHB0WzBdLCBwYXJhbUMpKTsKLSAgICAgICAgICAgICAgICAJCWlmKHBhcmFtRCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUpIHsKLSAgICAgICAgICAgICAgICAJCSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhkaXNwbGF5LCBwdFsxXSwgMSkpOwotICAgICAgICAgICAgICAgIAkJfSAgCi0gICAgICAgICAgICAgICAgCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3REb3VibGVDbGljayhkaXNwbGF5LCBwdFswXSwgcGFyYW1DKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RLZXlQcmVzcyhkaXNwbGF5LCBwYXJhbUEsIHBhcmFtQikpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlS2V5UHJlc3MoZGlzcGxheSwgcGFyYW1BLCBwYXJhbUIsIHBhcmFtQywgcGFyYW1EKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RHJhZyhkaXNwbGF5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0WzBdLCBwdFsxXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LlNFTEVDVElPTjoKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RTZWxlY3Rpb24oZGlzcGxheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFswXSwgcHRbMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoU3d0SnVuaXQuaXNDYXJib24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RTaGVsbEljb25pZnkoZGlzcGxheSwgcHRbMF0sIHBhcmFtQSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KGRpc3BsYXksIHB0WzFdLCBwYXJhbUEpKTsKLSAgICAgICAgICAgICAgICAgICAgCWlmKGNvbnRyb2wgaW5zdGFuY2VvZiBTaGVsbCkgewotICAgICAgICAgICAgICAgICAgICAJICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgKChTaGVsbCljb250cm9sKS5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9fSk7Ci0gICAgICAgICAgICAgICAgICAgIAl9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgCSAgICBmYWlsKCJJY29uaWZ5aW5nIGEgbm9uIHNoZWxsIGNvbnRyb2wiKTsKLSAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgVGhyZWFkKCkgewotCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJICAgIH0KLQkJCQl9KTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0uc3RhcnQoKTsKLQotICAgICAgICB3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgICAgICB9Ci0gICAgICAgIHNldFVwKCk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0cyA9IG5ldyBTdHJpbmdbZXZlbnRzLnNpemUoKV07Ci0gICAgICAgIGV2ZW50cy5jb3B5SW50byhyZXN1bHRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QgKyAiIGV2ZW50IG9yZGVyaW5nIiwgZXhwZWN0ZWRFdmVudHMsIHJlc3VsdHMpOwotICAgIH0KLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lFdmVudChpbnQgcGFyYW1BLCBpbnQgcGFyYW1CLCAKLQkJCQkJCQkJaW50IHBhcmFtQywgaW50IHBhcmFtRCwKLQkJCQkJCQkJaW50IG1ldGhvZCwgVmVjdG9yIGV2ZW50cykgewotICAgIGNvbnNpc3RlbmN5RXZlbnQocGFyYW1BLCBwYXJhbUIsIHBhcmFtQywgcGFyYW1ELCBtZXRob2QsIGV2ZW50cywgdHJ1ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwgCi0JCQkJCQkJCWludCBwYXJhbUMsIGludCBwYXJhbUQsCi0JCQkJCQkJCWludCBtZXRob2QpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kLCBudWxsLCB0cnVlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKSB7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQoKSk7Ci0gICAgc2hlbGwucGFjaygpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbChTaGVsbCBzaGVsbCkgewotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgc2hlbGwucGFjaygpOwotfQotCi0KLXByb3RlY3RlZCBQb2ludFtdIGRldGVybWluZUxvY2F0aW9ucyhpbnQgcGFyYW1BLCBpbnQgcGFyYW1CLAotICAgICAgICAJCQkJCQkgICAgIGludCBwYXJhbUMsIGludCBwYXJhbUQsIGludCBtZXRob2QpIHsKLSAgICBQb2ludFtdIGFycmF5ID0gbmV3IFBvaW50WzJdOwotICAgIGlmKG1ldGhvZCA+PSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spCi0gICAgICAgIGFycmF5WzBdID0gY29udHJvbC50b0Rpc3BsYXkocGFyYW1BLCBwYXJhbUIpOwotICAgIGlmKG1ldGhvZCA+PSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRykgCi0gICAgICAgIGFycmF5WzFdID0gY29udHJvbC50b0Rpc3BsYXkocGFyYW1DLCBwYXJhbUQpOwotICAgIGlmKG1ldGhvZCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0sgJiYgcGFyYW1EID09IENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSkKLSAgICAgICAgYXJyYXlbMV0gPSBzaGVsbC50b0Rpc3BsYXkoMjUsIC0xMCk7Ci0gICAgZWxzZSBpZihtZXRob2QgPT0gQ29uc2lzdGVuY3lVdGlsaXR5LlNIRUxMX0lDT05JRlkpIHsKLSAgICAgICAgYXJyYXlbMF0gPSBjb250cm9sLnRvRGlzcGxheSgwLDApOwotICAgICAgICBhcnJheVsxXSA9IGNvbnRyb2wudG9EaXNwbGF5KGNvbnRyb2wuZ2V0U2l6ZSgpLnggLTIwLCAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5OwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMDBkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCXNldFdpZGdldChjb29sQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCggIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbU9yZGVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtT3JkZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtU2l6ZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1TaXplcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2tlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TG9ja2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V3JhcEluZGljZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdyYXBJbmRpY2VzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NrZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMb2NrZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V3JhcEluZGljZXMkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V3JhcEluZGljZXMkSSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbU9yZGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtU2l6ZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NrZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdyYXBJbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NrZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXcmFwSW5kaWNlcyRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1PcmRlciIpKSB0ZXN0X2dldEl0ZW1PcmRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbVNpemVzIikpIHRlc3RfZ2V0SXRlbVNpemVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NrZWQiKSkgdGVzdF9nZXRMb2NrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdyYXBJbmRpY2VzIikpIHRlc3RfZ2V0V3JhcEluZGljZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9ja2VkWiIpKSB0ZXN0X3NldExvY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdyYXBJbmRpY2VzJEkiKSkgdGVzdF9zZXRXcmFwSW5kaWNlcyRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBDdXN0b20gKi8KLQotQ29vbEJhciBjb29sQmFyOwotCi0KLXByaXZhdGUgdm9pZCBjcmVhdGVDb29sQmFyKFZlY3RvciBldmVudHMpIHsKLSAgICB0ZWFyRG93bigpOwotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgU3RyaW5nIHRlc3QgPSBnZXRUZXN0TmFtZSgpOwotICAgIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQpOwotCVRvb2xCYXJbXSBjb29sSXRlbVRvb2xCYXIgPSBuZXcgVG9vbEJhclsyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJY29vbEl0ZW1Ub29sQmFyW2ldID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29vbEl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhjb29sSXRlbVRvb2xCYXJbaV0sIHRlc3QsIGV2ZW50cyk7Ci0JCWludCB0b29sSXRlbVdpZHRoID0gMDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0oY29vbEl0ZW1Ub29sQmFyW2ldLCBTV1QuQ0hFQ0spOwotCQkJaXRlbS5zZXRUZXh0KCJDQiIgKyAoKGkqMikgKyBqKSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkgKyBqKTsKLQkJCWlmIChpdGVtLmdldFdpZHRoKCkgPiB0b29sSXRlbVdpZHRoKQotCQkJICAgIHRvb2xJdGVtV2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgdGVzdCwgZXZlbnRzKTsKLQkJfQotICAgICAgICBjb29sSXRlbS5zZXRDb250cm9sKGNvb2xJdGVtVG9vbEJhcltpXSk7Ci0gICAgICAgIFBvaW50IHNpemU7Ci0gICAgICAgIGlmKGkgPT0gMSkKLSAgICAgICAgICAgIHNpemUgPSBjb29sSXRlbVRvb2xCYXJbaV0uY29tcHV0ZVNpemUoMjAsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2l6ZSA9IGNvb2xJdGVtVG9vbEJhcltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICBQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSk7Ci0gICAgICAgIGNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xJdGVtV2lkdGgvMywgY29vbFNpemUueSk7Ci0gICAgICAgIGNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotICAgICAgICBjb29sSXRlbS5zZXRTaXplKGNvb2xTaXplLngvMywgY29vbFNpemUueSk7Ci0gICAgICAgIGNvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQlzZXRXaWRnZXQoY29vbEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIC8vY2hldnJvbgotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngsIDIsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVDb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBQb2ludFtdIHBvaW50cyA9IGNvb2xCYXIuZ2V0SXRlbVNpemVzKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwb2ludHNbMF0ueC0xMiwgMCwgcG9pbnRzWzBdLngtMTIsIDUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngsIDAsIHBvaW50c1swXS54LCA1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVDb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBQb2ludFtdIHBvaW50cyA9IGNvb2xCYXIuZ2V0SXRlbVNpemVzKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwb2ludHNbMF0ueC0xMiwgMCwgcG9pbnRzWzBdLngtOCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT04sIGV2ZW50cyk7Ci19Ci0KLWNsYXNzIENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJLyoqCi0JCSAqIEEgc2VsZWN0aW9uIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiB0aGUgY29vbCBpdGVtCi0JCSAqIGlzIHNlbGVjdGVkIGJ5IGl0cyBncmlwcGVyIG9yIGlmIHRoZSBkcm9wIGRvd24gYXJyb3cKLQkJICogKG9yICdjaGV2cm9uJykgaXMgc2VsZWN0ZWQuIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbAotCQkgKiB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIHdpZGdldCB3YXMgc2VsZWN0ZWQuCi0JCSAqLwotCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJLyogSWYgdGhlIHBvcHVwIG1lbnUgaXMgYWxyZWFkeSB1cCAoaS5lLiB1c2VyIHByZXNzZWQgYXJyb3cgdHdpY2UpLAotCQkJICogdGhlbiBkaXNwb3NlIGl0LgotCQkJICovCi0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJbWVudS5kaXNwb3NlKCk7Ci0JCQkJbWVudSA9IG51bGw7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvKiBHZXQgdGhlIGNvb2wgaXRlbSBhbmQgY29udmVydCBpdHMgYm91bmRzIHRvIGRpc3BsYXkgY29vcmRpbmF0ZXMuICovCi0JCQlDb29sSXRlbSBjb29sSXRlbSA9IChDb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBjb29sSXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQlpdGVtQm91bmRzLndpZHRoID0gZXZlbnQueCAtIGl0ZW1Cb3VuZHMueDsKLQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50IChpdGVtQm91bmRzLngsIGl0ZW1Cb3VuZHMueSkpOwotCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCWl0ZW1Cb3VuZHMueSA9IHB0Lnk7Ci0JCQkKLQkJCS8qIEdldCB0aGUgdG9vbGJhciBmcm9tIHRoZSBjb29sIGl0ZW0uICovCi0JCQlUb29sQmFyIHRvb2xCYXIgPSAoVG9vbEJhcikgY29vbEl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCVRvb2xJdGVtW10gdG9vbHMgPSB0b29sQmFyLmdldEl0ZW1zICgpOwotCQkJaW50IHRvb2xDb3VudCA9IHRvb2xzLmxlbmd0aDsKLQkJCQkJCQkKLQkJCS8qIENvbnZlcnQgdGhlIGJvdW5kcyBvZiBlYWNoIHRvb2wgaXRlbSB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLAotCQkJICogYW5kIGRldGVybWluZSB3aGljaCBvbmVzIGFyZSBwYXN0IHRoZSBib3VuZHMgb2YgdGhlIGNvb2wgaXRlbS4KLQkJCSAqLwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0b29sQ291bnQpIHsKLQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCXRvb2xCb3VuZHMueCA9IHB0Lng7Ci0JCQkJdG9vbEJvdW5kcy55ID0gcHQueTsKLQkJICAJCVJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gPSBpdGVtQm91bmRzLmludGVyc2VjdGlvbiAodG9vbEJvdW5kcyk7Ci0JCSAgCQlpZiAoIWludGVyc2VjdGlvbi5lcXVhbHMgKHRvb2xCb3VuZHMpKSBicmVhazsKLQkJICAJCWkrKzsKLQkJCX0KLQkJCQotCQkJLyogQ3JlYXRlIGEgcG9wLXVwIG1lbnUgd2l0aCBpdGVtcyBmb3IgZWFjaCBvZiB0aGUgaGlkZGVuIGJ1dHRvbnMuICovCi0JCQltZW51ID0gbmV3IE1lbnUgKGNvb2xCYXIpOwotCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29sQ291bnQ7IGorKykgewotCQkJCVRvb2xJdGVtIHRvb2wgPSB0b29sc1tqXTsKLQkJCQlTdHJpbmcgdGV4dCA9IHRvb2wuZ2V0VGV4dCgpOwotCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuTk9ORSk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCX0KLQkJCQotCQkJLyogRGlzcGxheSB0aGUgcG9wLXVwIG1lbnUgYXQgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBhcnJvdyBidXR0b24uCi0JCQkgKiBEaXNwb3NlIHRoZSBtZW51IHdoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIGl0LgotCQkJICovCi0JCQlwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBjb29sQmFyLmdldERpc3BsYXkgKCk7Ci0JCQl3aGlsZSAobWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQoKSAmJiBtZW51LmlzVmlzaWJsZSAoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQl9Ci0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJbWVudS5kaXNwb3NlICgpOwotCQkJCW1lbnUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWM5ZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlzZXRXaWRnZXQoY29vbEl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQkKLQl0cnkgewotCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsJCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDApOwotCXRyeSB7Ci0JCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQl9Ci0JdHJ5IHsKLQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IDIiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpOwotCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDEpOwotCWFzc2VydEVxdWFscygyLCBjb29sQmFyLmdldEl0ZW1Db3VudCgpKTsKLQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgY29vbEJhci5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKGNvb2xJdGVtLCBjb29sQmFyLmdldEl0ZW0oMCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQotCVBvaW50IHNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYXNzZXJ0VHJ1ZShzaXplMi54ID09IHNpemUueCk7Ci0KLQlzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoNTAsIDI1KTsKLQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDEwMCwgMjUpOwotCWFzc2VydEVxdWFscyhzaXplLnggKyA1MCwgc2l6ZTIueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgc2l6ZTIueSk7Ci0KLQlzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoMSwxKTsKLQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDI2LCAyNik7Ci0JYXNzZXJ0RXF1YWxzKDI1LCBzaXplMi54IC0gc2l6ZS54KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS54LCByZWN0LndpZHRoKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS55LCByZWN0LmhlaWdodCk7Ci0JCi0JY29vbEl0ZW0uc2V0U2l6ZSgyNSwgMjUpOwotCXJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQljb29sSXRlbS5zZXRTaXplKDEwMCwgMjUpOwotCVJlY3RhbmdsZSBuZXdSZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3Qud2lkdGggKyA3NSwgbmV3UmVjdC53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QueCwgbmV3UmVjdC54KTsKLQlhc3NlcnRFcXVhbHMocmVjdC55LCBuZXdSZWN0LnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWFzc2VydE51bGwoY29vbEl0ZW0uZ2V0Q29udHJvbCgpKTsKLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JQ29udHJvbCBjb250cm9sID0gY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotCWFzc2VydEVxdWFscyhidXR0b24sIGNvbnRyb2wpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCWNvbnRyb2wgPSBjb29sSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bVNpemUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1TaXplIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlhc3NlcnRFcXVhbHMoY29vbEJhciwgY29vbEl0ZW0uZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByZWZlcnJlZFNpemUoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vYmFyIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHByZWYgPSBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShwcmVmKTsKLQlhc3NlcnRFcXVhbHMocHJlZiwgY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3Qud2lkdGgsIHNpemUueCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QuaGVpZ2h0LCBzaXplLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWNvb2xJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0JCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlhc3NlcnRUcnVlKHNpemUyLnggPiBzaXplLngpOwotCQotCWlmICghTUlOSU1BTF9DT05GT1JNQU5DRSkgewotCQlzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXNpemUyID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCQlhc3NlcnRFcXVhbHMoc2l6ZTIsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0JfQotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb250cm9sLmlzRGlzcG9zZWQoKSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXRyeSB7Ci0JCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIGNvbnRyb2wgaGFzIHdyb25nIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bVNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluaW11bVNpemVJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvb2JhciIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoc2l6ZSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29vbEl0ZW0uZ2V0U2l6ZSgpLngpOwotCWNvb2xJdGVtLnNldFNpemUoY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCg1MCwgMzApOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoc2l6ZSk7Ci0JUG9pbnQgc2l6ZTIgPSBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSg1MCwgMzApOwotCWFzc2VydEVxdWFscyhzaXplMiwgY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCi0JY29vbEl0ZW0uc2V0U2l6ZSg1MCwgNTApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoNTAsIDUwKSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLQotCWNvb2xJdGVtLnNldFNpemUoMCwgMCk7Ci0JUG9pbnQgc21hbGxlc3QgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZSgxLCAxKTsKLQlhc3NlcnRFcXVhbHMoc21hbGxlc3QsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFNpemUocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCWFzc2VydEVxdWFscyhzaXplLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gbmV3IFBvaW50KDUwLCA1MCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShzaXplKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRTaXplKDUwLCA1MCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUyLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtU2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmVmZXJyZWRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1TaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJIikpIHRlc3RfY29tcHV0ZVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bVNpemUiKSkgdGVzdF9nZXRNaW5pbXVtU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmVmZXJyZWRTaXplIikpIHRlc3RfZ2V0UHJlZmVycmVkU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1TaXplSUkiKSkgdGVzdF9zZXRNaW5pbXVtU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByZWZlcnJlZFNpemVJSSIpKSB0ZXN0X3NldFByZWZlcnJlZFNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlOSU1BTF9DT05GT1JNQU5DRSA9IGZhbHNlOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E4ZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnMKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JLy8gZG8gbm90aGluZywgZXZlbiB0aG91Z2ggdGhpcyBpcyBub3QgYW4gYWJzdHJhY3QgY2xhc3MsIGl0IHdhcyBuZXZlciBtZWFudCB0byAKLQkvLyBiZSBpbnN0YW50aWF0ZWQKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIGRvIG5vdGhpbmcsIGV2ZW4gdGhvdWdoIHRoaXMgaXMgbm90IGFuIGFic3RyYWN0IGNsYXNzLCBpdCB3YXMgbmV2ZXIgbWVhbnQgdG8gCi0JLy8gYmUgaW5zdGFudGlhdGVkCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCWRlY29yYXRpb25zLmNvbXB1dGVUcmltKDAsMCwwLDApOwotCWRlY29yYXRpb25zLmNvbXB1dGVUcmltKDAsMCwxMCwyMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBkZWNvcmF0aW9ucy5nZXRDbGllbnRBcmVhKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgcmVjdC5oZWlnaHQgPj0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgcmVjdC53aWR0aCA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QnV0dG9uKCkgewotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGRlY29yYXRpb25zLCBTV1QuUFVTSCk7Ci0JZGVjb3JhdGlvbnMuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSA9PSBidXR0b24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCUltYWdlW10gY2FzZXMgPSB7bnVsbCwgbmV3IEltYWdlKG51bGwsIDEwMCwgMTAwKX07Ci0JZm9yKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCQlkZWNvcmF0aW9ucy5zZXRJbWFnZShjYXNlc1tpXSk7Ci0JIAlhc3NlcnRFcXVhbHMoZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSwgY2FzZXNbaV0pOwotCSAJaWYgKGNhc2VzW2ldIT1udWxsKQotCSAgCQljYXNlc1tpXS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2VzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0JZGVjb3JhdGlvbnMuc2V0TG9jYXRpb24oMTAsMTUpOwotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldExvY2F0aW9uKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZGVjb3JhdGlvbnMuZ2V0TG9jYXRpb24oKS55ID09IDE1KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbWl6ZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldE1heGltaXplZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZW51QmFyKCkgewotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldE1lbnVCYXIoKSA9PSBudWxsKTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChkZWNvcmF0aW9ucywgU1dULkJBUik7Ci0JZGVjb3JhdGlvbnMuc2V0TWVudUJhciAoYmFyKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBkZWNvcmF0aW9ucy5nZXRNZW51QmFyKCkgPT0gYmFyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbWl6ZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldE1pbmltaXplZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3Qgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JZGVjb3JhdGlvbnMuc2V0VGV4dCgidGVzdCIpOwotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldFRleHQoKS5lcXVhbHMoInRlc3QiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNSZXBhcmVudGFibGUoKSB7Ci0JLyogRGVjb3JhdGlvbnMgYXJlIG5vdCByZXBhcmVudGFibGUsIHNlZSB3aW4zMiBpbXBsZW1lbnRhdGlvbiBvZiBpc1JlcGFyZW50YWJsZSgpICovCi0JYXNzZXJ0RmFsc2UoZGVjb3JhdGlvbnMuaXNSZXBhcmVudGFibGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oKSB7Ci0JYXNzZXJ0TnVsbChkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGRlY29yYXRpb25zLCBTV1QuTlVMTCk7Ci0JZGVjb3JhdGlvbnMuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCWFzc2VydFRydWUoImJ1dHRvbiBub3QgZGVmYXVsdCIsIGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSA9PSBidXR0b24pOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQlkZWNvcmF0aW9ucy5zZXREZWZhdWx0QnV0dG9uKG51bGwpOwotCQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlsb2FkSW1hZ2VzKCk7Ci0JZGVjb3JhdGlvbnMuc2V0SW1hZ2UoaW1hZ2VzWzBdKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBpbWFnZXNbMF0gPT0gZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgaW1hZ2VzWzFdICE9IGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWRlY29yYXRpb25zLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoIjpkOiIsIGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWZyZWVJbWFnZXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbWl6ZWRaKCkgewotCWRlY29yYXRpb25zLnNldE1heGltaXplZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGVjb3JhdGlvbnMuZ2V0TWF4aW1pemVkKCkgPT0gZmFsc2UpOwotCWRlY29yYXRpb25zLnNldE1heGltaXplZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkZWNvcmF0aW9ucy5nZXRNYXhpbWl6ZWQoKSA9PSB0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkZWNvcmF0aW9ucy5nZXRNaW5pbWl6ZWQoKSA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCkgewotCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0TWVudSgpKTsKLQlNZW51IHRlc3RNZW51ID0gbmV3IE1lbnUoZGVjb3JhdGlvbnMpOwotCWRlY29yYXRpb25zLnNldE1lbnUodGVzdE1lbnUpOwotCWFzc2VydFRydWUoIkluY29ycmVjdCBtZW51IiwgZGVjb3JhdGlvbnMuZ2V0TWVudSgpID09IHRlc3RNZW51KTsKLQlkZWNvcmF0aW9ucy5zZXRNZW51KG51bGwpOwotCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0TWVudSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbWl6ZWRaKCkgewotCWRlY29yYXRpb25zLnNldE1pbmltaXplZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGVjb3JhdGlvbnMuZ2V0TWluaW1pemVkKCkgPT0gZmFsc2UpOwotCWRlY29yYXRpb25zLnNldE1pbmltaXplZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkZWNvcmF0aW9ucy5nZXRNaW5pbWl6ZWQoKSA9PSB0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkZWNvcmF0aW9ucy5nZXRNYXhpbWl6ZWQoKSA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWRlY29yYXRpb25zLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQlkZWNvcmF0aW9ucy5zZXRUZXh0KHRlc3RTdHIpOwotCWFzc2VydFRydWUoImEiLCBkZWNvcmF0aW9ucy5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkZWNvcmF0aW9ucy5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCJiIiwgZGVjb3JhdGlvbnMuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRyeSB7Ci0JCWRlY29yYXRpb25zLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQkvLyB0ZXN0IGluIHN1YmNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEJ1dHRvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltaXplZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVudUJhciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW1pemVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1JlcGFyZW50YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltaXplZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW1pemVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0QnV0dG9uIikpIHRlc3RfZ2V0RGVmYXVsdEJ1dHRvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VzIikpIHRlc3RfZ2V0SW1hZ2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbWl6ZWQiKSkgdGVzdF9nZXRNYXhpbWl6ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lbnVCYXIiKSkgdGVzdF9nZXRNZW51QmFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbWl6ZWQiKSkgdGVzdF9nZXRNaW5pbWl6ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNSZXBhcmVudGFibGUiKSkgdGVzdF9pc1JlcGFyZW50YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24iKSkgdGVzdF9zZXREZWZhdWx0QnV0dG9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNYXhpbWl6ZWRaIikpIHRlc3Rfc2V0TWF4aW1pemVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbWl6ZWRaIikpIHRlc3Rfc2V0TWluaW1pemVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGVjb3JhdGlvbnMgZGVjb3JhdGlvbnM7Ci1JbWFnZVtdIGltYWdlcyA9IG5ldyBJbWFnZSBbU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aCpTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGhdOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlpZiAoZGVjb3JhdGlvbnMgIT0gbnVsbCAmJiAhZGVjb3JhdGlvbnMuaXNEaXNwb3NlZCgpKQotCQlkZWNvcmF0aW9ucy5kaXNwb3NlKCk7Ci0JZGVjb3JhdGlvbnMgPSAoRGVjb3JhdGlvbnMpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgewotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlpbnQgbnVtRmlsZXMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGg7Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlpbnQgaW5kZXggPSBpKm51bUZpbGVzOwotCQlmb3IgKGludCBqPTA7IGo8bnVtRmlsZXM7IGorKyl7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1tqXTsKLQkJCUlucHV0U3RyZWFtICByZXNvdXJjZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCWltYWdlcyBbaW5kZXgral0gPSBuZXcgSW1hZ2UgKHNoZWxsLmdldERpc3BsYXkoKSwgcmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgZnJlZUltYWdlcygpIHsKLQlmb3IgKGludCBpPTA7IGk8aW1hZ2VzLmxlbmd0aDsgaSsrKSBpbWFnZXNbaV0uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTRhYzg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGlhbG9nLmdldFBhcmVudCgpID09IHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyB3ZSB1c2UgdGhpcyBjYWxsIGluIGEgQ29uc3RydWN0b3IgdGVzdCBzbyB0aGF0IHdlIGNhbgotCS8vIGNoZWNrIGlmIHRoZSBzdHlsZSBpcyB0aGUgb25lIHRoYXQgd2FzIGNyZWF0ZWQKLQlkaWFsb2cuZ2V0U3R5bGUoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGRpYWxvZy5nZXRUZXh0KCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQlkaWFsb2cuc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkaWFsb2cuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGlhbG9nLnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGRpYWxvZy5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdHJ5IHsKLQkJZGlhbG9nLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLXByaXZhdGUgRGlhbG9nIGRpYWxvZzsKLXByaXZhdGUgaW50IGp1bml0U3R5bGU7Ci0KLXByb3RlY3RlZCB2b2lkIHNldERpYWxvZyhEaWFsb2cgbmV3RGlhbG9nKSB7Ci0JZGlhbG9nID0gbmV3RGlhbG9nOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlKSB7Ci0Jc3R5bGUgPSBqdW5pdFN0eWxlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTYyZTk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWRpckRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coZGlyRGlhbG9nKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsKTsKLQl0cnkgewotCQluZXcgRGlyZWN0b3J5RGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlclBhdGgoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCWlmIChmVGVzdERpYWxvZ09wZW4pCi0JCWRpckRpYWxvZy5vcGVuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gIi4vKiI7Ci0JZGlyRGlhbG9nLnNldEZpbHRlclBhdGgodGVzdFN0cik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHModGVzdFN0cikpOwotCWRpckRpYWxvZy5zZXRGaWx0ZXJQYXRoKCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkaXJEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscygiIikpOwotCWRpckRpYWxvZy5zZXRGaWx0ZXJQYXRoKG51bGwpOwotCWFzc2VydFRydWUoIjo0OiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGRpckRpYWxvZy5nZXRNZXNzYWdlKCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQlkaXJEaWFsb2cuc2V0TWVzc2FnZSh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkaXJEaWFsb2cuZ2V0TWVzc2FnZSgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGlyRGlhbG9nLnNldE1lc3NhZ2UoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGRpckRpYWxvZy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7Ci0JdHJ5IHsKLQkJZGlyRGlhbG9nLnNldE1lc3NhZ2UobnVsbCk7Ci0JCWZhaWwgKCJudWxsIGFyZ3VtZW50IGRpZCBub3QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbHRlclBhdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lc3NhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWx0ZXJQYXRoIikpIHRlc3RfZ2V0RmlsdGVyUGF0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVzc2FnZSIpKSB0ZXN0X2dldE1lc3NhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpcmVjdG9yeURpYWxvZyBkaXJEaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlNGE4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lIERpc3BsYXkgb2JqZWN0IHBlciB0aHJlYWQuCi0JLy8gSWYgYSBzZWNvbmQgRGlzcGxheSBpcyBjcmVhdGVkIG9uIHRoZSBzYW1lIHRocmVhZCwgYW4gCi0JLy8gSW52YWxpZFRocmVhZEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCi0JLy8KLQkvLyBFYWNoIHRlc3Qgd2lsbCBjcmVhdGUgaXRzIG93biBEaXNwbGF5IGFuZCBtdXN0IGRpc3Bvc2Ugb2YgaXQgCi0JLy8gYmVmb3JlIGNvbXBsZXRpbmcuCi19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCURpc3BsYXkgZGlzcCA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKSB7Ci0JRGlzcGxheSBkaXNwOwotCWRpc3AgPSBuZXcgRGlzcGxheShudWxsKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLQkKLQlkaXNwID0gbmV3IERpc3BsYXkobmV3IERldmljZURhdGEoKSk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5EaXNwb3NlLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEZpbHRlciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEZpbHRlciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0VHJ1ZShjYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSk7Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCWZpbmFsIGludCBDTE9TRV9DQUxMQkFDSyA9IDA7Ci0JZmluYWwgaW50IERJU1BPU0VfQ0FMTEJBQ0sgPSAxOwotCWZpbmFsIGJvb2xlYW5bXSBjYWxsYmFja1JlY2VpdmVkID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIGZhbHNlfTsKLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQkJZWxzZSBpZiAoZS50eXBlID09IFNXVC5EaXNwb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQl9OwotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhZGRMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydEZhbHNlKCI6YToiLCBjYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSk7Ci0KLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcGxheS5iZWVwKCk7Ci0JCQl9Ci0JCX0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9iZWVwKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5iZWVwKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcGxheS5jbG9zZSgpOwotCWFzc2VydFRydWUoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQkvLyBBbHNvIHRlc3RzIGRpc3Bvc2UgYW5kIGlzRGlzcG9zZWQKLQlEaXNwbGF5IHRlc3REaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlkaXNwb3NlRXhlY1JhbiA9IGZhbHNlOwotCXRlc3REaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZGlzcG9zZUV4ZWNSYW4gPSB0cnVlOwotCQl9Ci0JfSk7Ci0JYXNzZXJ0RXF1YWxzKCJEaXNwbGF5IHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCBmYWxzZSwgdGVzdERpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQl0ZXN0RGlzcGxheS5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiRGlzcGxheSBzaG91bGQgYmUgZGlzcG9zZWQiLCB0ZXN0RGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydFRydWUoIkRpc3Bvc2VFeGVjIFJ1bm5hYmxlIGRpZCBub3QgcnVuIiwgZGlzcG9zZUV4ZWNSYW4pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQoKSB7Ci0JYXNzZXJ0TnVsbChEaXNwbGF5LmZpbmREaXNwbGF5KG5ldyBUaHJlYWQoKSkpOwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKGRpc3BsYXksIERpc3BsYXkuZmluZERpc3BsYXkoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kV2lkZ2V0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZmluZFdpZGdldEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBY3RpdmVTaGVsbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCWFzc2VydE5vdE51bGwocmVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSgpOwotCQlhc3NlcnROb3ROdWxsKHJlY3QpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJyZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJzb3JDb250cm9sKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5nZXRDdXJzb3JDb250cm9sKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnNvckxvY2F0aW9uKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUG9pbnQgcHQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwocHQpOwotCQlhc3NlcnRUcnVlKHB0LnggPj0gMCk7Ci0JCWFzc2VydFRydWUocHQueSA+PSAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3Vyc29yU2l6ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q3Vyc29yU2l6ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHNldERhdGEoT2JqZWN0KSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gdGVzdGVkIGluIHNldERhdGEoU3RyaW5nLCBPYmplY3QpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlhc3NlcnROb3ROdWxsKERpc3BsYXkuZ2V0RGVmYXVsdCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IGFsaWdubWVudCA9IGRpc3BsYXkuZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCk7Ci0JCWFzc2VydFRydWUoImdldERpc21pc3NhbEFsaWdubWVudCBzaG91bGQgcmV0dXJuIFNXVC5MRUZUIG9yIFNXVC5SSUdIVCIsCi0JCQlhbGlnbm1lbnQgPT0gU1dULkxFRlQgfHwgYWxpZ25tZW50ID09IFNXVC5SSUdIVCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvdWJsZUNsaWNrVGltZSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCB0aW1lID0gZGlzcGxheS5nZXREb3VibGVDbGlja1RpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aW1lID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzQ29udHJvbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuZ2V0Rm9jdXNDb250cm9sKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEljb25EZXB0aCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBkZXB0aCA9IGRpc3BsYXkuZ2V0SWNvbkRlcHRoKCk7Ci0JCWFzc2VydFRydWUoZGVwdGggPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uaXRvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlNb25pdG9yW10gbW9uaXRvcnMgPSBkaXNwbGF5LmdldE1vbml0b3JzKCk7Ci0JYXNzZXJ0Tm90TnVsbChtb25pdG9ycyk7Ci0JYXNzZXJ0VHJ1ZSgiYXQgbGVhc3Qgb25lIG1vbml0b3Igc2hvdWxkIGJlIHJldHVybmVkIiwgbW9uaXRvcnMubGVuZ3RoID49IDEpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspCi0JCWFzc2VydFRydWUoIm1vbml0b3IgYXQgaW5kZXggIitpKyIgc2hvdWxkIG5vdCBiZSBudWxsIiwgbW9uaXRvcnNbaV0gIT0gbnVsbCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeU1vbml0b3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlNb25pdG9yIG1vbml0b3IgPSBkaXNwbGF5LmdldFByaW1hcnlNb25pdG9yKCk7Ci0JYXNzZXJ0Tm90TnVsbChtb25pdG9yKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbHMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbDEgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFNoZWxscygpLmxlbmd0aCA9PSAyKTsKLQkJc2hlbGwxLmRpc3Bvc2UoKTsKLQkJc2hlbGwyLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3luY1RocmVhZCgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aHJlYWRSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCVRocmVhZCBub25VSVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEFzc3VtZSBubyBzeW5jRXhlYyBydW5uYWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW52b2tlZC4KLQkJCQlhc3NlcnROdWxsKGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkKLQkJCQkvLyBDcmVhdGUgYSBydW5uYWJsZSBhbmQgaW52b2tlIHdpdGggc3luY0V4ZWMgdG8gdmVyaWZ5IHRoYXQKLQkJCQkvLyB0aGUgaW52b2tpbmcgdGhyZWFkIGlzIHRoZSBzeW5jVGhyZWFkLgotCQkJCWZpbmFsIFRocmVhZCBpbnZva2luZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWFzc2VydEVxdWFscyhpbnZva2luZ1RocmVhZCwgZGlzcGxheS5nZXRTeW5jVGhyZWFkKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQkJLy8gQ3JlYXRlIGEgcnVubmFibGUgYW5kIGludm9rZSB3aXRoIGFzeW5jRXhlYyB0byB2ZXJpZnkgdGhhdAotCQkJCS8vIHRoZSBzeW5jVGhyZWFkIGlzIG51bGwgd2hpbGUgaXQncyBydW5uaW5nLgotCQkJCWZpbmFsIGJvb2xlYW5bXSBhc3luY0V4ZWNSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlhc3NlcnROdWxsKGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkJCWFzeW5jRXhlY1JhblswXSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQl3aGlsZSAoIWFzeW5jRXhlY1JhblswXSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQl0aHJlYWRSYW5bMF0gPSB0cnVlOwotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9KTsKLQkJbm9uVUlUaHJlYWQuc3RhcnQoKTsKLQkJCi0JCXdoaWxlICghdGhyZWFkUmFuWzBdKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IFtdIGNvbG9ySWRzID0gewotCQkJU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVywgU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XLAotCQkJU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1csIFNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVywKLQkJCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCwgU1dULkNPTE9SX1dJREdFVF9CT1JERVIsCi0JCQlTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQsIFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQsCi0JCQlTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5ELCBTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04sCi0JCQlTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCwKLQkJfTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydE5vdE51bGwoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcklkc1tpXSkpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUZvbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlGb250IGZvbnQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKTsKLQkJYXNzZXJ0Tm90TnVsbChmb250KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGhyZWFkKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJUG9pbnQgcmVzdWx0OwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCwtMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgLTEwLCAtMjApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMTAsLTEyMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDMwLCA0MCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE3MCwtNjApLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIC01LCAtMTUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDE5NSw4NSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDI1LCAzNSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjI1LDEzNSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIC0yLCAtNCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMiAtIHNoZWxsT2Zmc2V0LngsLTEwNCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCA2LCA4KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTk0IC0gc2hlbGxPZmZzZXQueCwtOTIgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIC0zLCAtNik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCA5LCAxMik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDIwOSxzaGVsbE9mZnNldC55ICsgMTEyKSwgcmVzdWx0KTsKLQkJCi0JCWJ1dHRvbjEuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgMCwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUlJSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJUmVjdGFuZ2xlIHJlc3VsdDsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCwtMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAtMTAsIC0yMCwgMTMwLCAxNDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjEwLC0xMjAsMTMwLDE0MCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDUwLCA2MCwgMTcwLCAxODApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTUwLC00MCwxNzAsMTgwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjAwLDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgLTUsIC0xNSwgMTI1LCAxMzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxOTUsODUsMTI1LDEzNSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDQ1LCA1NSwgMTY1LCAxNzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyNDUsMTU1LDE2NSwxNzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMCwgMCwgMTAwLCAxMDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgLTIsIC00LCAxMDYsIDEwOCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55LDEwNiwxMDgpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAxMCwgMTIsIDExNCwgMTE2KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE5MCAtIHNoZWxsT2Zmc2V0LngsLTg4IC0gc2hlbGxPZmZzZXQueSwxMTQsMTE2KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIwMCxzaGVsbE9mZnNldC55ICsgMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAtMywgLTYsIDEwOSwgMTEyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQsMTA5LDExMiksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDE1LCAxOCwgMTIxLCAxMjQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZShzaGVsbE9mZnNldC54ICsgMjE1LHNoZWxsT2Zmc2V0LnkgKyAxMTgsMTIxLDEyNCksIHJlc3VsdCk7Ci0JCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDAsIDEwMCwgMTAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHJlc3VsdDsKLQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMCwwKTsKLQkJUG9pbnQgc2hlbGxPZmZzZXQgPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCi0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCwtMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFBvaW50KC0xMCwtMjApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjEwLC0xMjApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUG9pbnQoMzAsNDApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTcwLC02MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIG5ldyBQb2ludCgtNSwtMTUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxOTUsODUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUG9pbnQoMjUsMzUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyMjUsMTM1KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIHBvaW50KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBQb2ludCgtMiwtNCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgbmV3IFBvaW50KDYsOCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0xOTQgLSBzaGVsbE9mZnNldC54LC05MiAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBQb2ludCgtMywtNikpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgbmV3IFBvaW50KDksMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjA5LHNoZWxsT2Zmc2V0LnkgKyAxMTIpLCByZXN1bHQpOwotCQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBwb2ludCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBwb2ludCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAoUG9pbnQpIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBwb2ludCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcG9pbnQgYmVpbmcgbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlSZWN0YW5nbGUgcmVzdWx0OwotCQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDEwMCwxMDApOwotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCwtMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKC0xMCwgLTIwLCAxMzAsIDE0MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjEwLC0xMjAsMTMwLDE0MCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoNTAsIDYwLCAxNzAsIDE4MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTUwLC00MCwxNzAsMTgwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIHJlY3QpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyMDAsMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUmVjdGFuZ2xlKC01LCAtMTUsIDEyNSwgMTM1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDE5NSw4NSwxMjUsMTM1KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFJlY3RhbmdsZSg0NSwgNTUsIDE2NSwgMTc1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDI0NSwxNTUsMTY1LDE3NSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnksMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoLTIsIC00LCAxMDYsIDEwOCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSwxMDYsMTA4KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgbmV3IFJlY3RhbmdsZSgxMCwgMTIsIDExNCwgMTE2KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0xOTAgLSBzaGVsbE9mZnNldC54LC04OCAtIHNoZWxsT2Zmc2V0LnksMTE0LDExNiksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIwMCxzaGVsbE9mZnNldC55ICsgMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUmVjdGFuZ2xlKC0zLCAtNiwgMTA5LCAxMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQsMTA5LDExMiksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBSZWN0YW5nbGUoMTUsIDE4LCAxMjEsIDEyNCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZShzaGVsbE9mZnNldC54ICsgMjE1LHNoZWxsT2Zmc2V0LnkgKyAxMTgsMTIxLDEyNCksIHJlc3VsdCk7Ci0JCQotCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIHJlY3QpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcmVjdCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAoUmVjdGFuZ2xlKSBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcG9pbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSBiZWluZyBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JZmluYWwgaW50IEtFWUNPREUgPSBTV1QuU0hJRlQ7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5wb3N0KG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcG9zdCB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvc3Qgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCXNoZWxsLnNldEJvdW5kcyhkaXNwbGF5LmdldEJvdW5kcygpKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCUV2ZW50IGV2ZW50OwotCQkKLQkJLy8gVGVzdCBrZXkgZXZlbnRzIChkb3duL3VwKQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGUgPSAtMTsgIAkJCQkvLyBib2d1cyBrZXkgY29kZQotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwkvLyB1c2VzIGRlZmF1bHQgMCBjaGFyYWN0ZXIKLQkJLy8gZG9uJ3QgdGVzdCBLZXlEb3duL0tleVVwIHdpdGggYSBjaGFyYWN0ZXIgdG8gYXZvaWQgc2VuZGluZyB0byAKLQkJLy8gcmFuZG9tIHdpbmRvdyBpZiB0ZXN0IHNoZWxsIGxvb3NlcyBmb2N1cwotCQkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQotCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGUgPSBLRVlDT0RFOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQlldmVudC50eXBlID0gU1dULktleVVwOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQkKLQkJLy8gVGVzdCBtb3VzZSBldmVudHMgKGRvd24vdXAvbW92ZSkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJZXZlbnQueCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoLzI7Ci0JCWV2ZW50LnkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMjsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsgIC8vIG1pc3NpbmcgYnV0dG9uCi0JCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCWFzc2VydEZhbHNlKGRpc3BsYXkucG9zdChldmVudCkpOyAgLy8gbWlzc2luZyBidXR0b24KLQkJZXZlbnQuYnV0dG9uID0gMTsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCS8vIFRlc3QgdW5zdXBwb3J0ZWQgZXZlbnQKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvdWJsZUNsaWNrOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCi0JCS8vIGNhbid0IHZlcmlmeSB0aGF0IHRoZSBldmVudHMgd2VyZSBhY3R1YWxseSBzZW50IHRvIGEgbGlzdGVuZXIuCi0JCS8vIHRoZSB0ZXN0IHNoZWxsIHdvbid0IHJlY2VpdmUgYW55IGV2ZW50cyBpZiBpdCBoYXMgbG9zdCBmb2N1cywgCi0JCS8vIGUuZy4sIGR1ZSB0byB1c2VyIGludGVydmVudGlvbiBvciBhbm90aGVyIHByb2Nlc3MgcG9wcGluZyB1cCAKLQkJLy8gYSB3aW5kb3cuIAotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWFkQW5kRGlzcGF0Y2goKSB7Ci0JLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyByZWx5IG9uIHJlYWRBbmREaXNwYXRjaCBpbiBvcmRlciB0byBzdWNjZWVkLAotCS8vIHRodXMgbm8gdGVzdCBpcyBuZWVkZWQgaGVyZS4KLQkvLyAgICB0ZXN0X2dldFN5bmNUaHJlYWQoKQotCS8vICAgIHRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5EaXNwb3NlLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUZpbHRlciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUZpbHRlciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCQlkaXNwbGF5LnJlbW92ZUZpbHRlcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdKTsKLQlhc3NlcnRGYWxzZShjYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JZmluYWwgaW50IENMT1NFX0NBTExCQUNLID0gMDsKLQlmaW5hbCBpbnQgRElTUE9TRV9DQUxMQkFDSyA9IDE7Ci0JZmluYWwgYm9vbGVhbltdIGNhbGxiYWNrUmVjZWl2ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5DbG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCQllbHNlIGlmIChlLnR5cGUgPT0gU1dULkRpc3Bvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCX07Ci0JfTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LnJlbW92ZUxpc3RlbmVyKFNXVC5DbG9zZSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCQlkaXNwbGF5LnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5jbG9zZSgpOwotCX0KLQlhc3NlcnRGYWxzZShjYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSk7Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVsZWFzZSgpIHsKLQkvLyBPdmVycmlkaW5nIHRlc3RfcmVsZWFzZSBmcm9tIERldmljZS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBcHBOYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JRGlzcGxheS5zZXRBcHBOYW1lKCJNeSBBcHBsaWNhdGlvbiBOYW1lIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25JSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0Q3Vyc29yTG9jYXRpb24oMCwwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXRDdXJzb3JMb2NhdGlvbihuZXcgUG9pbnQoMCwwKSk7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LnNldEN1cnNvckxvY2F0aW9uKG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBhcmd1bWVudCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igc2V0Q3Vyc29yTG9jYXRpb24gd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0RGF0YShuZXcgSW50ZWdlcigxMCkpOwotCQlJbnRlZ2VyIGkgPSAoSW50ZWdlcilkaXNwbGF5LmdldERhdGEoKTsKLQkJYXNzZXJ0Tm90TnVsbChpKTsKLQkJYXNzZXJ0VHJ1ZShpLmVxdWFscyhuZXcgSW50ZWdlcigxMCkpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldERhdGEoIkludGVnZXIiLCBuZXcgSW50ZWdlcigxMCkpOwotCQlkaXNwbGF5LnNldERhdGEoIlN0cmluZyIsICJ4eXoiKTsKLQkJSW50ZWdlciBpID0gKEludGVnZXIpZGlzcGxheS5nZXREYXRhKCJJbnRlZ2VyIik7Ci0JCWFzc2VydE5vdE51bGwoaSk7Ci0JCWFzc2VydFRydWUoaS5lcXVhbHMobmV3IEludGVnZXIoMTApKSk7Ci0JCVN0cmluZyBzID0gKFN0cmluZylkaXNwbGF5LmdldERhdGEoIlN0cmluZyIpOwotCQlhc3NlcnROb3ROdWxsKHMpOwotCQlhc3NlcnRUcnVlKHMuZXF1YWxzKCJ4eXoiKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBib29sZWFuW10gYXN5bmNFeGVjUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LnNldFN5bmNocm9uaXplcihudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvc3Qgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBzZXQgc3luY2hyb25pemVyIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJY2xhc3MgTXlTeW5jaHJvbml6ZXIgZXh0ZW5kcyBTeW5jaHJvbml6ZXIgewotCQkJYm9vbGVhbiBpbnZva2VkID0gZmFsc2U7Ci0JCQlNeVN5bmNocm9uaXplcihEaXNwbGF5IGQpIHsKLQkJCQlzdXBlcihkKTsKLQkJCX0KLQkJCXByb3RlY3RlZCB2b2lkIGFzeW5jRXhlYyAoUnVubmFibGUgcnVubmFibGUpIHsKLQkJCQlpbnZva2VkID0gdHJ1ZTsKLQkJCQlzdXBlci5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJfQotCQl9Ci0JCQotCQlNeVN5bmNocm9uaXplciBteVN5bmNocm9uaXplciA9IG5ldyBNeVN5bmNocm9uaXplcihkaXNwbGF5KTsKLQkJZGlzcGxheS5zZXRTeW5jaHJvbml6ZXIobXlTeW5jaHJvbml6ZXIpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYXN5bmNFeGVjUmFuWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7fQotCQlhc3NlcnRUcnVlKG15U3luY2hyb25pemVyLmludm9rZWQpOwotCQlhc3NlcnRUcnVlKGFzeW5jRXhlY1JhblswXSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NsZWVwKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJVGhyZWFkIHRocmVhZDsKLQkJYm9vbGVhbiBldmVudFF1ZXVlZDsKLQkJCi0JCS8vIEVuc3VyZSBldmVudCBxdWV1ZSBpcyBlbXB0eSwgb3RoZXJ3aXNlIHNsZWVwKCkgd2lsbCBqdXN0IHJldHVybi4KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBEZWxheSB0byBlbnN1cmUgdGhlIFVJIHRocmVhZCBoYXMgYmVlbiBwdXQgdG8gc2xlZXAuCi0JCQkJCXNsZWVwKDMwMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJCS8vIFVzZSB3YWtlKCkgdG8gcmV2aXZlIGZyb20gc2xlZXAoKS4KLQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCS8vIE5vdGUgdGhhdCBzbGVlcCBzZWVtcyB0byBhbHdheXMgcmV0dXJuIHRydWUsIGF0IGxlYXN0Ci0JCS8vIG9uIFdpbmRvd3MsIHNpbmNlIHdha2UoKSB1c2VzIGEgbnVsbCBldmVudC4gCi0JCWV2ZW50UXVldWVkID0gZGlzcGxheS5zbGVlcCgpOwotCQkKLQkJLy8gRW5zdXJlIGV2ZW50IHF1ZXVlIGlzIGVtcHR5LCBvdGhlcndpc2Ugc2xlZXAoKSB3aWxsIGp1c3QgcmV0dXJuLgotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7fQotCQl0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIERlbGF5IHRvIGVuc3VyZSB0aGUgVUkgdGhyZWFkIGhhcyBiZWVuIHB1dCB0byBzbGVlcC4KLQkJCQkJc2xlZXAoMzAwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQkJLy8gQ2F1c2UgT1MgdG8gZ2VuZXJhdGUgYW4gZXZlbnQgdG8gcmV2aXZlIGZyb20gc2xlZXAoKS4KLQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJU2hlbGwgcyA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCQkJCXMub3BlbigpOwotCQkJCQkJcy5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCWV2ZW50UXVldWVkID0gZGlzcGxheS5zbGVlcCgpOwotCQlhc3NlcnRUcnVlKGV2ZW50UXVldWVkKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcGxheS5iZWVwKCk7Ci0JCQl9Ci0JCX0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90aW1lckV4ZWNJTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lckV4ZWNSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aHJlYWRSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCQotCQl0cnkgewotCQkJZGlzcGxheS50aW1lckV4ZWMoMCwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0aW1lckV4ZWMgd2l0aCBudWxsIHJ1bm5hYmxlIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB0aW1lckV4ZWMgd2l0aCBudWxsIHJ1bm5hYmxlIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LnRpbWVyRXhlYygtMTAwLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdGltZXJFeGVjUmFuWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCQkJCi0JCWZpbmFsIGludCBkZWxheSA9IDMwMDA7Ci0JCWZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWRpc3BsYXkudGltZXJFeGVjKGRlbGF5LCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJLy8gZGVidWcgaW50ZXJtaXR0ZW50IHRlc3QgZmFpbHVyZQotCQkJCWlmIChlbmRUaW1lIDwgKHN0YXJ0VGltZSArIGRlbGF5KSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRpc3BsYXkudGltZXJFeGVjIHJhbiBlYXJseSAiICsgKChzdGFydFRpbWUgKyBkZWxheSkgLSBlbmRUaW1lKSk7Ci0JCQkJfQotCQkJCS8vYXNzZXJ0VHJ1ZSgiVGltZXIgcmFuIGVhcmx5ISBtcyBlYXJseTogIiwgZW5kVGltZSA+PSAoc3RhcnRUaW1lICsgZGVsYXkpKTsKLQkJCQl0aHJlYWRSYW5bMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJd2hpbGUgKCF0aHJlYWRSYW5bMF0pIHsKLQkJCS8vIFRoZSByZWFkIGFuZCBkaXNwYXRjaCBsb29wIG11c3QgYmUgcnVubmluZyBpbiBvcmRlcgotCQkJLy8gZm9yIHRoZSBydW5uYWJsZSBpbiB0aGUgdGltZXIgZXhlYyB0byBiZSBleGVjdXRlZC4KLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQkKLQkJLy8gVmVyaWZ5IHRoZSB0aW1lckV4ZWMgd2l0aCBsZXNzIHRoYW4gemVybyBtaWxsaXNlY29uZHMgZGlkbid0IGV4ZWN1dGUuCi0JCWFzc2VydEZhbHNlKCI8IDAgbXMgdGltZXIgZGlkIGV4ZWN1dGUiLCB0aW1lckV4ZWNSYW5bMF0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF91cGRhdGUoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnVwZGF0ZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93YWtlKCkgewotCS8vIHRlc3RlZCBpbiBzbGVlcCgpIG1ldGhvZAotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2JlZXAiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbmRXaWRnZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBY3RpdmVTaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDdXJyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDdXJzb3JDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDdXJzb3JMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yU2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZWZhdWx0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNtaXNzYWxBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvdWJsZUNsaWNrVGltZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJY29uRGVwdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1vbml0b3JzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmltYXJ5TW9uaXRvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGxzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeW5jVGhyZWFkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Db2xvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN5c3RlbUZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRocmVhZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlYWRBbmREaXNwYXRjaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBcHBOYW1lTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3luY2hyb25pemVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2xlZXAiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3VwZGF0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2FrZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3RfYXN5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYmVlcCIpKSB0ZXN0X2JlZXAoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb3NlIikpIHRlc3RfY2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmluZERpc3BsYXlMamF2YV9sYW5nX1RocmVhZCIpKSB0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmRXaWRnZXRJIikpIHRlc3RfZmluZFdpZGdldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFjdGl2ZVNoZWxsIikpIHRlc3RfZ2V0QWN0aXZlU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnJlbnQiKSkgdGVzdF9nZXRDdXJyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDdXJzb3JDb250cm9sIikpIHRlc3RfZ2V0Q3Vyc29yQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24iKSkgdGVzdF9nZXRDdXJzb3JMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q3Vyc29yU2l6ZSIpKSB0ZXN0X2dldEN1cnNvclNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERhdGEiKSkgdGVzdF9nZXREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHQiKSkgdGVzdF9nZXREZWZhdWx0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNtaXNzYWxBbGlnbm1lbnQiKSkgdGVzdF9nZXREaXNtaXNzYWxBbGlnbm1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvdWJsZUNsaWNrVGltZSIpKSB0ZXN0X2dldERvdWJsZUNsaWNrVGltZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9jdXNDb250cm9sIikpIHRlc3RfZ2V0Rm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJY29uRGVwdGgiKSkgdGVzdF9nZXRJY29uRGVwdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1vbml0b3JzIikpIHRlc3RfZ2V0TW9uaXRvcnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByaW1hcnlNb25pdG9yIikpIHRlc3RfZ2V0UHJpbWFyeU1vbml0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxscyIpKSB0ZXN0X2dldFNoZWxscygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3luY1RocmVhZCIpKSB0ZXN0X2dldFN5bmNUaHJlYWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUNvbG9ySSIpKSB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3lzdGVtRm9udCIpKSB0ZXN0X2dldFN5c3RlbUZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRocmVhZCIpKSB0ZXN0X2dldFRocmVhZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSIpKSB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkiKSkgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVhZEFuZERpc3BhdGNoIikpIHRlc3RfcmVhZEFuZERpc3BhdGNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBcHBOYW1lTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRBcHBOYW1lTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvY2F0aW9uSUkiKSkgdGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRDdXJzb3JMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3luY2hyb25pemVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplciIpKSB0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NsZWVwIikpIHRlc3Rfc2xlZXAoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X3N5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF90aW1lckV4ZWNJTGphdmFfbGFuZ19SdW5uYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdXBkYXRlIikpIHRlc3RfdXBkYXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93YWtlIikpIHRlc3Rfd2FrZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLWJvb2xlYW4gZGlzcG9zZUV4ZWNSYW47Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdmlydHVhbGx5IGV2ZXJ5IG1ldGhvZCBhbmQgaW4gcGFydGljdWxhcgotCS8vICAgdGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUKLX0KLQotLyogT3ZlcmxvYWRlZCB0ZXN0cyBmcm9tIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSAqLwotcHVibGljIHZvaWQgdGVzdF9nZXREUEkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlQb2ludCBwID0gZGlzcGxheS5nZXREUEkoKTsKLQkJYXNzZXJ0VHJ1ZSgiaG9yaXpvbnRhbCBEUEkgbm90IGdyZWF0ZXIgdGhhbiB6ZXJvIiwgcC54ID4gMCk7Ci0JCWFzc2VydFRydWUoInZlcnRpY2FsIERQSSBub3QgZ3JlYXRlciB0aGFuIHplcm8iLCBwLnkgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVwdGgoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlpbnQgZCA9IGRpc3BsYXkuZ2V0RGVwdGgoKTsKLQkJYXNzZXJ0VHJ1ZSgiZGVwdGggbm90IGdyZWF0ZXIgdGhhbiB6ZXJvIiwgZCA+IDApOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gc2NhbGFibGUgPSBkaXNwbGF5LmdldEZvbnRMaXN0KG51bGwsIHRydWUpOwotCQlGb250RGF0YVtdIG5vbl9zY2FsYWJsZSA9IGRpc3BsYXkuZ2V0Rm9udExpc3QobnVsbCwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJubyBmb250cyBkZXRlY3RlZCIsIChzY2FsYWJsZS5sZW5ndGggKyBub25fc2NhbGFibGUubGVuZ3RoKSA+IDApOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXYXJuaW5ncygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZGlzcGxheS5nZXRXYXJuaW5ncygpOwotCQkvLyBTaW5jZSB0aGUgYmVoYXZpb3IgaXMgcGxhdGZvcm0gc3BlY2lmaWMsIHRoZXJlJ3MKLQkJLy8gbm8gZ29vZCB0ZXN0IGZvciB0aGUgcmVzdWx0IHZhbHVlLgotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCURpc3BsYXkgZGlzcCA9IG5ldyBEaXNwbGF5KCk7Ci0JYXNzZXJ0RmFsc2UoZGlzcC5pc0Rpc3Bvc2VkKCkpOwotCWRpc3AuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZGlzcC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdhcm5pbmdzWigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0V2FybmluZ3ModHJ1ZSk7Ci0JCWRpc3BsYXkuc2V0V2FybmluZ3MoZmFsc2UpOwotCQkvLyBTaW5jZSB0aGUgYmVoYXZpb3IgaXMgcGxhdGZvcm0gc3BlY2lmaWMsIHRoZXJlJ3MKLQkJLy8gbm8gZ29vZCB0ZXN0IGZvciBpbnZva2luZyB0aGlzIG1ldGhvZC4KLQkJLy8gTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLgotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTUwN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmNhY2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coZmlsZURpYWxvZyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JLy8gVGVzdCBGaWxlRGlhbG9nKFNoZWxsKQotCUZpbGVEaWFsb2cgZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IEZpbGVEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JLy8gVGVzdCBGaWxlRGlhbG9nKFNoZWxsLCBpbnQpCi0JRmlsZURpYWxvZyBmZDsKLQlmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0JYXNzZXJ0VHJ1ZShmZC5nZXRTdHlsZSgpPT1TV1QuTlVMTCk7Ci0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQlhc3NlcnRUcnVlKGZkLmdldFN0eWxlKCk9PVNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlBSSU1BUllfTU9EQUwpOwotCWFzc2VydFRydWUoZmQuZ2V0U3R5bGUoKT09U1dULlBSSU1BUllfTU9EQUwpOwotCWZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TWVNURU1fTU9EQUwpOwotCWFzc2VydFRydWUoZmQuZ2V0U3R5bGUoKT09U1dULlNZU1RFTV9NT0RBTCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbGVOYW1lKCkgewotCS8vCXRlc3RlZCBpbiB0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbGVOYW1lcygpIHsKLQlTdHJpbmdbXSBuYW1lcyA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lcy5sZW5ndGg9PTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlckV4dGVuc2lvbnMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyTmFtZXMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlclBhdGgoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQlpZiAoZlRlc3REaWFsb2dPcGVuKQotCQlmaWxlRGlhbG9nLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbGVEaWFsb2cuc2V0RmlsZU5hbWUoIiIpOwotCVN0cmluZyBuYW1lID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCWFzc2VydFRydWUobmFtZS5lcXVhbHMoIiIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbGVOYW1lKG51bGwpOwotCW5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lPT1udWxsKTsKLQlmaWxlRGlhbG9nLnNldEZpbGVOYW1lKCJzb21lZmlsZS50ZXN0Iik7Ci0JbmFtZSA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQlhc3NlcnRUcnVlKG5hbWUuZXF1YWxzKCJzb21lZmlsZS50ZXN0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7InR4dCIsImphdmEifSk7Ci0JU3RyaW5nIGZpbHRlcnNbXSA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzBdLmVxdWFscygidHh0IikpOwotCWFzc2VydFRydWUoZmlsdGVyc1sxXS5lcXVhbHMoImphdmEiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiJ9KTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJFeHRlbnNpb25zKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzLmxlbmd0aCA9PSAxKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobnVsbCk7Ci0JZmlsdGVycyA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWFzc2VydFRydWUoZmlsdGVycz09bnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyJhLnR4dCIsImIuamF2YSJ9KTsKLQlTdHJpbmcgZmlsdGVyc1tdID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJOYW1lcygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzBdLmVxdWFscygiYS50eHQiKSk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzFdLmVxdWFscygiYi5qYXZhIikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsiIn0pOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlck5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzLmxlbmd0aCA9PSAxKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG51bGwpOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlck5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzPT1udWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gIi4vKiI7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHMoIiIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWxlTmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsZU5hbWVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWx0ZXJOYW1lcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyUGF0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsZU5hbWUiKSkgdGVzdF9nZXRGaWxlTmFtZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsZU5hbWVzIikpIHRlc3RfZ2V0RmlsZU5hbWVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zIikpIHRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyTmFtZXMiKSkgdGVzdF9nZXRGaWx0ZXJOYW1lcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyUGF0aCIpKSB0ZXN0X2dldEZpbHRlclBhdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUZpbGVEaWFsb2cgZmlsZURpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDc5ZDk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZvbnREaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZvbnREaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGZvbnREaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQlGb250RGlhbG9nIGZkID0gbmV3IEZvbnREaWFsb2coc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBGb250RGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXRyeSB7Ci0JCW5ldyBGb250RGlhbG9nKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnREYXRhKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRMaXN0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250TGlzdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X29wZW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0JRm9udERhdGEgW10gZm9udERhdGEgPSBuZXcgRm9udERhdGEgWzFdOwotCWZvbnREYXRhIFswXSA9IG5ldyBGb250RGF0YSAoKTsKLQotCWFzc2VydE51bGwoZm9udERpYWxvZy5nZXRGb250TGlzdCgpKTsJCi0JCQotCWZvbnREaWFsb2cuc2V0Rm9udExpc3QoZm9udERhdGEpOwotCWFzc2VydEVxdWFscyhmb250RGlhbG9nLmdldEZvbnRMaXN0KCksIGZvbnREYXRhKTsKLQotCWZvbnREaWFsb2cuc2V0Rm9udExpc3QobnVsbCk7Ci0JYXNzZXJ0TnVsbChmb250RGlhbG9nLmdldEZvbnRMaXN0KCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TGlzdCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TGlzdCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JUkdCIHJnYiA9IG5ldyBSR0IoMjU1LCAwLCAwKTsKLQlmb250RGlhbG9nLnNldFJHQihyZ2IpOwotCVJHQiByZ2IyID0gZm9udERpYWxvZy5nZXRSR0IoKTsKLQlhc3NlcnRFcXVhbHMocmdiLCByZ2IyKTsJCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udExpc3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TGlzdCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udERhdGEiKSkgdGVzdF9nZXRGb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udExpc3QiKSkgdGVzdF9nZXRGb250TGlzdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCIikpIHRlc3RfZ2V0UkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIikpIHRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TGlzdCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIikpIHRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUZvbnREaWFsb2cgZm9udERpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjgzOTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoZ3JvdXApOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJZ3JvdXAgPSBuZXcgR3JvdXAobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0ge1NXVC5TSEFET1dfSU4sIFNXVC5TSEFET1dfT1VULCBTV1QuU0hBRE9XX0VUQ0hFRF9JTiwgU1dULlNIQURPV19FVENIRURfT1VUfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlncm91cCA9IG5ldyBHcm91cChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVRyaW1JSUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpZW50QXJlYSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAic29tZSB0ZXh0IiwgImxka2FzaGRvZWh1Zndlb3ZjbmhzbHZocmVnb2plYmNrcmVhdmJrdWh4Yml1ZnZjeWhiaWZ1eWV3dmJpdXJleWQuLGNtbmVzbGpsaWV3amZjaHZid29pZml2YmV3b3JpeHVpZXVydmJpdXZib2hmbGtzamVhaGZjbGl1cmVhZmd5Y2lhYmVsaXR2eXJ3dGxpY3V5cnRsaXVyZXliY2xpdXlyZXVjZXl2YmxpdXJleWJjdCJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJZ3JvdXAuc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwgZ3JvdXAuZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX07Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUdyb3VwIGdyb3VwOwotCi0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDk5ZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsb2FkSW1hZ2VzKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci0JZnJlZUltYWdlcygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwoaXRlbS5nZXRJbWFnZSgpKTsKLQlpdGVtLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgaXRlbS5nZXRJbWFnZSgpKTsKLQlhc3NlcnRUcnVlKGl0ZW0uZ2V0SW1hZ2UoKSAhPSBpbWFnZXNbMV0pOwotCWl0ZW0uc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChpdGVtLmdldEltYWdlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgdGVzdFN0ciA9ICJ0ZXN0IHN0cmluZyI7Ci0JaXRlbS5zZXRUZXh0KHRlc3RTdHIpOwotCWFzc2VydFRydWUoImEiLCBpdGVtLmdldFRleHQoKS5lcXVhbHModGVzdFN0cikpOwotCWl0ZW0uc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiYiIsIGl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRyeSB7Ci0JCWl0ZW0uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldElJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUl0ZW0gaXRlbTsKLUltYWdlW10gaW1hZ2VzID0gbmV3IEltYWdlIFtTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoKlN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aF07Ci0KLXByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgewotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlpbnQgbnVtRmlsZXMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGg7Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlpbnQgaW5kZXggPSBpKm51bUZpbGVzOwotCQlmb3IgKGludCBqPTA7IGo8bnVtRmlsZXM7IGorKyl7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1tqXTsKLQkJCUlucHV0U3RyZWFtICByZXNvdXJjZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCWltYWdlcyBbaW5kZXgral0gPSBuZXcgSW1hZ2UgKHNoZWxsLmdldERpc3BsYXkoKSwgcmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JfQotfQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3aWRnZXQpIHsKLQlpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQlzdXBlci5zZXRXaWRnZXQod2lkZ2V0KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGZyZWVJbWFnZXMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlpZiAoaW1hZ2VzW2ldICE9IG51bGwpCi0JCQlpbWFnZXNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzAwNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGxhYmVsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0vLwlzdXBlci50ZWFyRG93bigpOwotCi0JaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKHNoZWxsLmlzRGlzcG9zZWQoKSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobGFiZWwuaXNEaXNwb3NlZCgpLCBmYWxzZSk7Ci0JfQotCi0Jc2hlbGwuZGlzcG9zZSgpOwotCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCWFzc2VydFRydWUoc2hlbGwuaXNEaXNwb3NlZCgpKTsKLQkJYXNzZXJ0VHJ1ZShsYWJlbC5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCl7Ci0JdHJ5IHsKLQkJbGFiZWwgPSBuZXcgTGFiZWwobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIDApOwotCi0JaW50W10gY2FzZXMgPSB7U1dULkxFRlQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgU1dULlNFUEFSQVRPUiwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTCwgU1dULlNIQURPV19JTiwgU1dULlNIQURPV19PVVR9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCl7Ci0JaW50W10gY2FzZXMgPSB7U1dULkxFRlQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUn07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLSAJICBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgY2FzZXNbaV0pOwotCSAgYXNzZXJ0RXF1YWxzKGxhYmVsLmdldEFsaWdubWVudCgpLCBjYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpewotCUltYWdlW10gY2FzZXMgPSB7bnVsbCwgbmV3IEltYWdlKG51bGwsIDEwMCwgMTAwKX07Ci0JZm9yKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCSBsYWJlbC5zZXRJbWFnZShjYXNlc1tpXSk7Ci0JIGFzc2VydEVxdWFscyhsYWJlbC5nZXRJbWFnZSgpLCBjYXNlc1tpXSk7Ci0JIGlmIChjYXNlc1tpXSE9bnVsbCkKLQkgIGNhc2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAic29tZSBuYW1lIiwgInNkYXNkbGtqc2hjZGFzY2Vjb2V3Y3dlIn07Ci0JZm9yKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCSBsYWJlbC5zZXRUZXh0KGNhc2VzW2ldKTsKLQkgYXNzZXJ0RXF1YWxzKGxhYmVsLmdldFRleHQoKSwgY2FzZXNbaV0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbGlnbm1lbnRJKCl7Ci0JaW50W10gY2FzZXMgPSB7U1dULkxFRlQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUn07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLSAJICBsYWJlbC5zZXRBbGlnbm1lbnQoY2FzZXNbaV0pOwotCSAgYXNzZXJ0RXF1YWxzKGxhYmVsLmdldEFsaWdubWVudCgpLCBjYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JLy8gdGVzdGVkIGluIGdldEltYWdlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpewotCXRyeSB7Ci0JCWxhYmVsLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbGlnbm1lbnQiKSkgdGVzdF9nZXRBbGlnbm1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbGlnbm1lbnRJIikpIHRlc3Rfc2V0QWxpZ25tZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUxhYmVsIGxhYmVsOwotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzU3ODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgMCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCX0KLQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE3ZTYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbmsKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbmsKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluayBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLQlMaW5rIGxpbms7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCXNldFdpZGdldChsaW5rKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIFRlc3QgTGluayhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuTlVMTCk7Ci0JbGluay5kaXNwb3NlKCk7Ci0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGluay5kaXNwb3NlKCk7Ci0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsaW5rLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlsaW5rID0gbmV3IExpbmsobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZFNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpbmsubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQlsaW5rLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWxpbmsucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpbmsubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JbGluay5jb21wdXRlU2l6ZSgwLCAwKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpOwotCi0JbGluay5jb21wdXRlU2l6ZSgtMTAsIC0xMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKC0xMCwgLTEwLCBmYWxzZSk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDEwLCAxMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDEwLCAxMCwgZmFsc2UpOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDApOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDAsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiAgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGNhc2VzID0gewotCQkJIiIsCi0JCQkiYSIsCi0JCQkiYWEiLAotCQkJImFhYWFhYWFhYWEiLAotCQkJImEmIiwKLQkJCSImIiwKLQkJCSImYSIsCi0JCQkiJmEmIiwKLQkJCSImYSIsCi0JCQkiJjxhPiIsCi0JCQkiPGE+IiwKLQkJCSImYTxhPiIsCi0JCQkiPGE+PC9hPiIsCi0JCQkiPGE+PC9hPiYiLAotCQkJIjxhPjwvYT5hJiIsCi0JCQkiPGE+PC9hPiZhIiwKLQkJCSImYTxhPmE8L2E+JmEiLAotCQkJIiZhPGE+JmE8L2E+JmEiLAotCQkJIlRleHQgPGEgaHJlZj1cInVybC5jb21cIj5MaW5rPC9hPiB0ZXh0IDxBIGNvbG9yPSMyMTIxMjE+TGluayAyPC9BPiAiLAotCQkJIlRleHQ8YSAgXHQgICB4eHg9XCJ5eXkgIFwiICAgICAgICBpZD1cImlkc1wiIGhyZWY9XCJIUkVGXCIgICAgID5MaW5rPCAvYT5FbmQiLAotCQkJIlRlJiZ4dCAmdGV4dCAmJiA8YT5MJmluazwvYT4gaCZpIDxhPmZlJiZsaXBlPC9hPiAmbCAmZW5kJiYiLAotCQkJIlRleHQgPGEgaWQ9XCIxXCI+TGluazwvYT4gc29tZXRoaW5nIDxhIGhyZWY9XCJibGEgYmxhMlwiID5MaW5rMjwvYT4gc29tZXRoaW5nZWxzZSA8YT5MaW5rMyBsYXJnZSBsYXJnZTwvYT4uIHNvbWUgdGV4dCB0byB0ZXN0IHRoaXMgd3JhcHBpbmcgdGhpbmcgPEEgaHJlZj1cImxhc3RcIj50aGlzIGlzIHN1cHBvc2UgdG8gYmUgYSB2ZXJ5IGxvbmcgbGluayB0ZXh0IHRoZSBzcHJhd3Mgb3ZlciBzZXZlcmFsIGxpbmVzIGluIHRoZSB0ZXh0IGxheW91dDwvYT4uZW5kIiwKLQkJCSJUaGUgU1dUIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIDxBPmVmZmljaWVudDwvQT4sIDxBPnBvcnRhYmxlPC9BPiA8QT5hY2Nlc3MgdG8gdGhlIHVzZXItaW50ZXJmYWNlIGZhY2lsaXRpZXMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW1zPC9BPiBvbiB3aGljaCBpdCBpcyBpbXBsZW1lbnRlZC4iLAotCQkJInNvbWUgdGV4dCIsIAotCQkJImxka2FzaGRvZWh1Zndlb3ZjbmhzbHZocmVnb2plYmNrcmVhdmJrdWh4Yml1ZnZjeWhiaWZ1eWV3dmJpdXJleWQuLGNtbmVzbGpsaWV3amZjaHZid29pZml2YmV3b3JpeHVpZXVydmJpdXZib2hmbGtzamVhaGZjbGl1cmVhZmd5Y2lhYmVsaXR2eXJ3dGxpY3V5cnRsaXVyZXliY2xpdXlyZXVjZXl2YmxpdXJleWJjdCIsIAotCQkJIlxuIFxuIFxiIFx0ICIsIAotCQkJIlwwIn07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkJbGluay5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKGxpbmsuZ2V0VGV4dCgpICwgY2FzZXNbaV0pOwotCX0KLQl0cnkgewotCQlsaW5rLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTE3YWE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxpc3QgPSBuZXcgTGlzdChzaGVsbCwgU1dULk1VTFRJKTsKLQotCXNldFdpZGdldChsaXN0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWxpc3QgPSBuZXcgTGlzdChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPQotCQl7Ci0JCQkwLAotCQkJU1dULlNJTkdMRSwKLQkJCVNXVC5NVUxUSSwKLQkJCVNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCwKLQkJCVNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCwKLQkJCVNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWxpc3QgPSBuZXcgTGlzdChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdC5hZGQoIiIpOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIpOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQiLCAic29tZSB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3QKLQotCXNldFNpbmdsZUxpc3QoKTsKLQotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5hZGQoIiIpOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIpOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQiLCAic29tZSB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzb21lIHRleHQiLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QuYWRkKCIiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0IiwgMSk7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyJzb21lIHRleHQiLCAiIiwgInNvbWUgXG4gdGV4dCIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLQl0cnkgewotCQlsaXN0LmFkZChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBzdHJpbmcgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5hZGQoInN0cmluZyIsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gbGlzdAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JdHJ5IHsKLQkJbGlzdC5hZGQoInNvbWUgdGV4dCIsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JCi0JbGlzdC5hZGQoIiIsIDApOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiLCAxKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIsIDApOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7InNvbWUgdGV4dCIsICIiLCAic29tZSBcbiB0ZXh0IiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LmFkZCgic3RyaW5nIiwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0Ci0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0JCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0JEkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlTdHJpbmdbXSBlbXB0eSA9IHsKLQl9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JdHJ5IHsKLQkJbGlzdC5kZXNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgaXRlbXMpOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsKLQl9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaXNTZWxlY3RlZCgwKSwgZmFsc2UpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDIsIDAsIDAgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMyB9KTsKLQkvKglhc3NlcnQoIjpkOiIsICFsaXN0LmlzU2VsZWN0ZWQoMCkpOwotCWFzc2VydCgiOmRkOiIsICFsaXN0LmlzU2VsZWN0ZWQoMikpOwotCWFzc2VydCgiOmRkZDoiLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWFzc2VydCgiOmRkZDoiLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOyovCi0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQl0cnkgewotCQlsaXN0LmRlc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAyLCAwLCAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JU3RyaW5nW10gZW1wdHkgPSB7Ci0JfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShpdGVtcywgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhlbXB0eSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJKCkgewotCWludCBudW1iZXIgPSA1OwotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gImZyZWQiICsgaTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCVN0cmluZ1tdIGVtcHR5ID0gewotCX07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JYXNzZXJ0U2FtZShpdGVtczIsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoNSk7Ci0JYXNzZXJ0U2FtZShpdGVtczIsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoNSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCgyKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgyKSk7Ci0JbGlzdC5kZXNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JbGlzdC5kZXNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJmcmVkIiArIGk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCi0JLy8gdGVzdHMgaWYgZGVzZWxlY3QoaSwgaikgaXMgdGhlIHNhbWUgYXMgZm9yIChpPTA7IGk8PWo7ICsraSkgZGVzZWxlY3QoaSk7Ci0JaW50W11bXSBjYXNlcyA9IHsgeyAzLCAxIH0sIHsKLQkJCS0zLCAtMiB9LCB7Ci0JCQktMiwgLTEgfSwgewotCQkJLTEsIC0xIH0sIHsKLQkJCTEwLCAxIH0KLQl9OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7ICsraSkgewotCQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgY2FzZXNbaV1bMF0sIGNhc2VzW2ldWzFdLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCX0KLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMywgbmV3IGludFtdIHsgNCB9KTsKLQkJZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzMCwgbmV3IGludFtdIHsKLQkJfSk7Ci0JfQotCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAzLCBuZXcgaW50W10geyAwLCA0IH0pOwotCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAxLCBuZXcgaW50W10geyAwLCAyLCAzLCA0IH0pOwotCS8vIGRvbmUKLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCVN0cmluZ1tdIGVtcHR5ID0gewotCX07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgaXRlbXMyLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDAsIDApOwotCWFzc2VydFNhbWUoIjpiOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCWxpc3QuZGVzZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmJiYjoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KDIsIDMpOwotCWFzc2VydEVxdWFscygiOmJiOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMyKTsKLQlsaXN0LmRlc2VsZWN0KDAsIDIpOwotCWFzc2VydEVxdWFscygiOmRkZGQ6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWxpc3QuZGVzZWxlY3QoMiwgMCk7Ci0JYXNzZXJ0U2FtZSgKLQkJIjpkZGRkZDoiLAotCQlsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCQotCWxpc3Quc2VsZWN0KDApOwotCi0JbGlzdC5kZXNlbGVjdCgtMywgLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3QuZGVzZWxlY3QoLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KDEsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQotCWxpc3QuZGVzZWxlY3QoMywgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QoMCwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KDEsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb2N1c0luZGV4KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIifTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRGb2N1c0luZGV4KCkpOwotCWxpc3Quc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldEZvY3VzSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlKDIpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlKDIpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JRm9udERhdGEgZm9udERhdGEgPSBsaXN0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCWludCBsaW5lSGVpZ2h0OwotCUZvbnQgZm9udDsKLQkKLQlmb250ID0gbmV3IEZvbnQobGlzdC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgOCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWxpbmVIZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKTsKLQlsaXN0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDEyLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQlsaXN0LnNldEZvbnQoZm9udCk7Ci0JaW50IG5ld0xpbmVIZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBuZXdMaW5lSGVpZ2h0ID4gbGluZUhlaWdodCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JU3RyaW5nW10gZW1wdHkgPSB7Ci0JfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlTdHJpbmcgaXRlbSA9IG51bGw7Ci0JdHJ5IHsKLQkJaXRlbSA9IGxpc3QuZ2V0SXRlbSg1KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJaXRlbSA9IGxpc3QuZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMyksICJpdGVtMyIpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCXRyeSB7Ci0JCWl0ZW0gPSBsaXN0LmdldEl0ZW0oNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlpdGVtID0gbGlzdC5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JLy9hc3NlcnQoIjphOiIsIGxpc3QuZ2V0SXRlbSg1KT09bnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJpdGVtMyIsIGxpc3QuZ2V0SXRlbSgzKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlTdHJpbmdbXVtdIGNhc2VzID0geyB7Ci0JCX0sIHsKLQkJCSIiIH0sIHsKLQkJCSIiLCAiIiB9LCB7Ci0JCQkidGV4dDEiLCAidGV4dDIiIH0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRJdGVtcyhjYXNlc1tpXSk7Ci0JCWFzc2VydEVxdWFscygiY2FzZTogIiArIGksIGNhc2VzW2ldLCBsaXN0LmdldEl0ZW1zKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JU3RyaW5nW11bXSBjYXNlcyA9IHsgewotCQl9LCB7Ci0JCQkiIiB9LCB7Ci0JCQkiIiwgIiIgfSwgewotCQkJInRleHQxIiwgInRleHQyIiB9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb3A6IiArIGkpOwotCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oY2FzZXNbaV0pOwotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJsaXN0OiIgKyBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiY2FzZToiICsgaSArIGNhc2VzW2ldKTsKLQkJYXNzZXJ0U2FtZSgiY2FzZTogIiArIGksIGNhc2VzW2ldLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMTsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotCQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwKLQkJCWxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7IGNhc2VzW2ldWzBdIH0pOwotCX0KLQotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JaW50W10gc2VsID0geyAwLCAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgsIDIpOwotCVN0cmluZ1tdIHNlbEl0ZW1zID0gbmV3IFN0cmluZ1tdIHtpdGVtc1swXSwgaXRlbXNbMl19OwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgc2VsSXRlbXMpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoLCAyKTsKLQlzZWxJdGVtcyA9IG5ldyBTdHJpbmdbXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIHNlbEl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpWzBdLCBpdGVtc1sxXSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigxLCAwKTsKLQlTdHJpbmdbXSBlbXB0eSA9IHsKLQl9OwotCWFzc2VydEVxdWFscyhlbXB0eSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQlTdHJpbmdbXSBib2d1c19pdGVtcyA9IHsgImJvZ3VzX3RleHQxIiwgImJvZ3VzX3RleHQyIiwgImJvZ3VzX3RleHQzIiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKGJvZ3VzX2l0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3RzIAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0Jc2VsID0gbmV3IGludFtdIHsgMCB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXNbMF0sIGxpc3QuZ2V0U2VsZWN0aW9uKClbMF0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXNbMV0sIGxpc3QuZ2V0U2VsZWN0aW9uKClbMF0pOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcwotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotICogICAgPGxpPkVSUk9SX0NBTk5PVF9HRVRfQ09VTlQgLSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGJlY2F1c2Ugb2YgYW4gb3BlcmF0aW5nIHN5c3RlbSBmYWlsdXJlPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgMCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDIiIH0pOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQkvLyBub3QgcHJvcGVybHkgc3BlYydkIGZvciBtdWx0aS1zZWxlY3QgbGlzdHMKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQxIiB9KTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MiIgfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDMiIH0pOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlpbnRbXSBzZWwgPSB7IDAsIDEsIDIgfTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMCB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDEgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMyB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IC0xLCAwLCAxLCAyLCAzIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7IDAsIDEsIDIgfSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10geyAxLCAyIH0sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMCB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDEgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMyB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BJbmRleCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaW5kZXhPZigidGV4dDMiKSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaW5kZXhPZigidGV4dDQiKSwgLTEpOwotCi0JaW50IGluZDsKLQl0cnkgewotCQlpbmQgPSBsaXN0LmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JU3RyaW5nW10gaXRlbXMyID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDIiIH07IC8vdHdvIGlkZW50aWNhbAotCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQyIiksIDEpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQzIiwgNCkpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuaW5kZXhPZigidGV4dDMiKSk7Ci0KLQkKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDQiKSk7Ci0KLQkKLQl0cnkgewotCQlpbmQgPSBsaXN0LmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCQotCWFzc2VydEVxdWFscygxLCBsaXN0LmluZGV4T2YoInRleHQyIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIsIDQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIsIDIpKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDApKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDEpKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAyKSk7Ci0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MiIgfTsgLy90d28gaWRlbnRpY2FsCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQyIiwgMiksIDIpOwotCi0JdHJ5IHsKLQkJIGxpc3QuaW5kZXhPZihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JLy8JYXNzZXJ0KCJsaXN0LmluZGV4T2YoXCJ0ZXh0MlwiLCAtMSk9PTEiLCBsaXN0LmluZGV4T2YoInRleHQyIiwgLTEpPT0xKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDApKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDIpKTsKLQotCXRyeSB7Ci0JCWxpc3QuaW5kZXhPZihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1NlbGVjdGVkSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQyIiB9OyAvL3R3byBpZGVudGljYWwKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgwKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDIpKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgzKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgwKSk7Ci0JCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMikpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgzKSk7Ci0JfQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlJEkoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kaWNlcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MCIsICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDAsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQkvLyBpbmRleCA+IG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgNCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDMsIDEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IC0xLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmI6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAtMiwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMSwgMSB9KTsKLQlhc3NlcnRFcXVhbHMoCi0JCSI6ZDoiLAotCQlsaXN0LmdldEl0ZW1zKCksIG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIsICJ0ZXh0MyIgfSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydEVxdWFscygiOmU6IiwgbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiIH0pOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JdHJ5IHsKLQkJaW50W10gaW5kaWNlcyA9IG51bGw7Ci0JCWxpc3QucmVtb3ZlKGluZGljZXMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRpY2VzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydEVxdWFscygiOmY6IiwgbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiIH0pOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMywgMSB9KTsKLQlhc3NlcnRFcXVhbHMoIjpnOiIsIGxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiB9KTsKLQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCS8vIGluZGV4ID4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGxpc3QKLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyA0LCAxfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0JYXNzZXJ0RXF1YWxzKCI6aDoiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDMsIDEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCWFzc2VydEVxdWFscygiOmg6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAtMSwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiOmk6IiwgaXRlbXMsIGxpc3QuZ2V0SXRlbXMoKSk7Ci0KLQkKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAxLCAxIH0pOwotCWFzc2VydEVxdWFscygiOmo6IiwKLQkJbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiwgInRleHQzIiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiLCAidGVzdDIiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDEpLCAidGV4dDMiKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCAzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDApLCAidGV4dDMiKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5yZW1vdmUoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMCksICJ0ZXh0MSIpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlsaXN0LnJlbW92ZSgxKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JYXNzZXJ0VHJ1ZShsaXN0LmdldEl0ZW0oMSkuZXF1YWxzKCJ0ZXh0MyIpKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgwKSwgInRleHQzIik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUlJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ0ZXh0MyIsIGxpc3QuZ2V0SXRlbSgxKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0YXJ0IGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoMCwgMik7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgyLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0YXJ0IGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkKLQlsaXN0LnJlbW92ZSgxLCAyKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ0ZXh0MSIsIGxpc3QuZ2V0SXRlbSgwKSk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgyLCAxMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ0ZXh0MiIsIGxpc3QuZ2V0SXRlbSgxKSk7Ci0KLQlsaXN0LnJlbW92ZSgyLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIsICJ0ZXN0MiIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKChTdHJpbmcpIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoIml0ZW1zOTg5Iik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZSgidGV4dDMiKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgidGV4dDIiKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoKFN0cmluZykgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKCJpdGVtczk4OSIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoInRleHQzIik7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoInRleHQyIik7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0JEkoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5zZWxlY3QoKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAwLCAyIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDIgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LmFkZCgiaXRlbTQiKTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IC0xLCAwLCAxLCAyLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JaW50W10gaW5kID0gbmV3IGludFszMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbmQubGVuZ3RoOyBpKyspIGluZFtpXSA9IGk7Ci0JbGlzdC5zZWxlY3QoaW5kKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludFtdIHt9KTsKLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7fSk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgLTEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWl0ZW1zID0gbGlzdC5nZXRJdGVtcygpOwotCi0Jc2VsZWN0JElfaGVscGVyKGl0ZW1zLCAwLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCXNlbGVjdCRJX2hlbHBlcihpdGVtcywgLTEsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0Jc2VsZWN0JElfaGVscGVyKGl0ZW1zLCAtMSwgMzAsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQgfSk7Ci0KLQkKLQkvKi0tLSBTaW5nbGUtc2VsZWN0IC0tLSovCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCQotCXRyeSB7Ci0JCWxpc3Quc2VsZWN0KChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgLTEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDIgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0JCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgNCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyA1IH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgNCB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdChuZXcgaW50W117IDAsIDEsIDIsIDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdeyAtMSwgMCwgMSwgMiwgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlpbnRbXSBzZWxlY3Rpb24gPSBuZXcgaW50WzMyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc2VsZWN0aW9uW2ldID0gaTsKLQlsaXN0LnNlbGVjdChzZWxlY3Rpb24pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgMSwgMSwgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXXt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIsICJ0ZXN0MiIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDApOwotCWxpc3Quc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgNCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlsaXN0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JbGlzdC5zZWxlY3QoMik7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoMik6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxKTsKLQlhc3NlcnRTYW1lKCJzZWxlY3QoMSk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgzKTsKLQlhc3NlcnRTYW1lKAotCQkic2VsZWN0KDMpOiIsCi0JCWxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoNSk7Ci0JYXNzZXJ0U2FtZSgKLQkJInNlbGVjdCg1KToiLAotCQlsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgwKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQkKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTEpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0xKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMik7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTIpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDQpOwotCWFzc2VydEVxdWFscygic2VsZWN0KDQpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JbGlzdC5zZWxlY3QoMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZWxlY3QoMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZWxlY3QoNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygic2VsZWN0KDApOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTEpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KC0yKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgtMik6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoNCk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoNCk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SUkoKSB7Ci0JbGlzdC5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgwLCAxKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWludCBudW1iZXIgPSA1OwotCi0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JaW50W10gZW1wdHkgPSB7fTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gIml0ZW0iICsgaTsKLQotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMTAsIDEsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDMsIDEsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAtMSwgZW1wdHkpOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNSwgNSwgZW1wdHkpOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNCwgNSwgbmV3IGludFtdIHsgNCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAwLCBuZXcgaW50W10geyAwIH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMiwgNCwgbmV3IGludFtdIHsgMiwgMywgNCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDAsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAxLCBuZXcgaW50W10geyAxIH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMwLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LnNlbGVjdCgtMTAsIC05KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCi0JbGlzdC5zZWxlY3QoMTAwMCwgMjAwMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgMCk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoMSwgMik7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDMpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCgyLCAyKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoMywgNSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMywgNCB9KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDAsIDEpOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoLTEsIDApOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCWxpc3Quc2VsZWN0KC0xMCwgLTkpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQlsaXN0LnNlbGVjdCgxMDAwLCAyMDAwKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQlsaXN0LnNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNlbGVjdCgyLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgzLCAzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCg0LCA0KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LnNlbGVjdCg1LCA1KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoNSwgNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMSwgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMywgNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAwLCAwLCBuZXcgaW50W117MH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMSwgbmV3IGludFtdezF9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDIsIDIsIG5ldyBpbnRbXXsyfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAzLCAzLCBuZXcgaW50W117M30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNCwgNCwgbmV3IGludFtdezR9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDUsIDUsIG5ldyBpbnRbXXt9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEwLCAxLCBuZXcgaW50W117fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAzLCAxLCBuZXcgaW50W117fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgLTEsIG5ldyBpbnRbXXt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gbGlzdC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBsaXN0LmdldEZvbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiaXRlbUhlaWdodD0iICsgbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKyAiLCBsaW5lSGVpZ2h0PSIgKyBsaW5lSGVpZ2h0LCBsaXN0LmdldEl0ZW1IZWlnaHQoKSA+IGxpbmVIZWlnaHQpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCWludFtdIGNhc2VzID0geyAtMTAsIDAsIDEwIH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXNbaV0sICIiKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0KLQlpbnQgY2FzZXMyW10gPSB7IDEwLCAxNSwgMCB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMyLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXMyW2ldLCAiZnJlZCIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQl9Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldEl0ZW0oMSwgIm5ldzEiKTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0wIiwgIm5ldzEiLCAiaXRlbTIiLCAiaXRlbTMiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXNbaV0sIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQl9Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCAiIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlczIubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlczJbaV0sICJmcmVkIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0SXRlbSgxLCAibmV3MSIpOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTAiLCAibmV3MSIsICJpdGVtMiIsICJpdGVtMyIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQlsaXN0LnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBUT0RPIEFuIFNXVEVycm9yIHNob3VsZCBuZXZlciBoYXBwZW4gYW5kIHNob3VsZCBub3QKLQkvLyBiZSBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2UuICBMaXN0IHNob3VsZCB0aHJvdyBhbiAKLQkvLyBTV1RFeGNlcHRpb24uCi0vLwlTdHJpbmdbXVtdIGNhc2VzID0geyB7IG51bGwgfSwgewotLy8JCQkiZHNhZGEiLCBudWxsLCAiZHNkYXNkYXNkIiB9Ci0vLwl9OwotLy8JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotLy8JCXRyeSB7Ci0vLwkJCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotLy8JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyBub3QgZm91bmQiKTsKLS8vCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0vLwkJfQotLy8JfQotCi0JU3RyaW5nW11bXSBpdGVtQXJyID0geyB7Ci0JCX0sIHsKLQkJCSIiIH0sIHsKLQkJCSJzZGFzZCIgfSwgewotCQkJInNkYXNkIiwgIjMyMzQzNCIgfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQXJyLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoaXRlbUFycltpXSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtQXJyW2ldLCBsaXN0LmdldEl0ZW1zKCkpOwotCX0KLQotCXRyeSB7Ci0JCWxpc3Quc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1BcnIubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRJdGVtcyhpdGVtQXJyW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYXNlOiIgKyBpLCBpdGVtQXJyW2ldLCBsaXN0LmdldEl0ZW1zKCkpOwotCX0KLQotCQotCXRyeSB7Ci0JCWxpc3Quc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kSSgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCIgKyBpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgTVVMVEk6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MywgMSwgNSwgMn0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MywgMSwgNSwgMn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MSwgMiwgMywgNX0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgMX0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSk7Ci0KLQlpbnRbXSBpbmRpY2VzID0gbmV3IGludCBbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWluZGljZXNbaV0gPSBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpbmRpY2VzKTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKGluZGljZXMpIiwgaW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSkiLCBuZXcgaW50WzBdLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCBudW1iZXIsIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezAsIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCBudW1iZXIgLSAyLCBudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCkiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBTSU5HTEU6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludCBbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlpbmRpY2VzID0gbmV3IGludCBbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWluZGljZXNbaV0gPSBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpbmRpY2VzKTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKGluZGljZXMpIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCBudW1iZXIsIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIDAsIG51bWJlciAtIDJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIDAsIG51bWJlciAtIDJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCAiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDEiLCAiZnJlZCAwIn0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkIDEifSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAtMSIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSksICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgLTEiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIn0pOwotCQotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZyBbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gImZyZWQgIiArIGk7Ci0JfQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpLCAiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAxIn0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsiZnJlZCAwIiwgImZyZWQgMSJ9KTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCAiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgMiJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAxIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIC0xIiwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCi0JaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9ICJmcmVkICIgKyBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlciwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpLCAiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkICIgKyBudW1iZXIsICJmcmVkIDEifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0JfQotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC01KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAwKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCX0KLQotCWxpc3Quc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJmcmVkIiArIGk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAyKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezEsIDJ9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMywgLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDIsIG51bWJlciAtIDEpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMiwgbnVtYmVyIC0gMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlciArIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDIsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigtMiwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDQsIDQpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHs0fSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCA0KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMywgLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMiwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIgKyAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0JbGlzdC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRUb3BJbmRleCgzKSBpbiBlbXB0eSBsaXN0IiwgMCwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRUb3BJbmRleChpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0VG9wSW5kZXgoaT0iICsgaSArICIpIiwgaSwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQl9Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0VG9wSW5kZXgoMykgaW4gZW1wdHkgbGlzdCIsIDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRUb3BJbmRleChpPSIgKyBpICsgIikiLCBpLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCX0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JbGlzdC5zaG93U2VsZWN0aW9uKCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JbGlzdC5zaG93U2VsZWN0aW9uKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1NlbGVjdGVkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3QkSSIpKSB0ZXN0X2Rlc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SSIpKSB0ZXN0X2Rlc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJSSIpKSB0ZXN0X2Rlc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzSW5kZXgiKSkgdGVzdF9nZXRGb2N1c0luZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1NlbGVjdGVkSSIpKSB0ZXN0X2lzU2VsZWN0ZWRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmUkSSIpKSB0ZXN0X3JlbW92ZSRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUkiKSkgdGVzdF9yZW1vdmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJSSIpKSB0ZXN0X3JlbW92ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0JEkiKSkgdGVzdF9zZWxlY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RJIikpIHRlc3Rfc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SUkiKSkgdGVzdF9zZWxlY3RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kSSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JSSIpKSB0ZXN0X3NldFNlbGVjdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJbmRleEkiKSkgdGVzdF9zZXRUb3BJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUxpc3QgbGlzdDsKLS8qKgotICogVGVzdCBpZiAnZGVzZWxlY3QodSwgdiknIGlzIHRoZSBzYW1lIGFzICdmb3IgKGk9dTsgaTw9djsgKytpKSBkZXNlbGVjdChpKTsnCi0gKi8KLXByb3RlY3RlZCB2b2lkIGRlc2VsZWN0SUlfaGVscGVyKAotCVN0cmluZ1tdIGl0ZW1zLAotCWludCBzdGFydCwKLQlpbnQgZW5kLAotCWludFtdIGV4cGVjdGVkSW5kaWNlcykgewotCQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0KLQlsaXN0LmRlc2VsZWN0KHN0YXJ0LCBlbmQpOwotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlpZiAoIDAgIT0gKGxpc3QuZ2V0U3R5bGUoKSAmIFNXVC5NVUxUSSkgKSB7Ci0JCWFzc2VydFNhbWUoInNldFNlbGVjdGlvbihpdGVtcyk6IiwgaXRlbXMsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgewotCQlsaXN0LmRlc2VsZWN0KGkpOwotCX0KLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci19Ci0vKioKLSAqIERpc3Bvc2Ugb2YgdGhlIG1haW4gbGlzdCBhbmQgY3JlYXRlIGEgbmV3LCBzaW5nbGUtc2VsZWN0aW9uIG9uZS4KLSAqLwotcHJvdGVjdGVkIExpc3Qgc2V0U2luZ2xlTGlzdCgpIHsKLQlsaXN0LmRpc3Bvc2UoKTsKLQlsaXN0ID0gbmV3IExpc3Qoc2hlbGwsIFNXVC5TSU5HTEUpOwotCXNldFdpZGdldChsaXN0KTsKLQlyZXR1cm4gbGlzdDsKLX0KLS8qKgotICogU2ltaWxhciB0byBkZXNlbGVjdElJX2hlbHBlciwgY2hlY2tzIGlmIHNlbGVjdCh1LCB2KSBpcyB0aGUgc2FtZSBhcwotICogZm9yIChpPXU7IGk8PXY7ICsraSkgc2VsZWN0KGkpCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNlbGVjdElJX2hlbHBlcigKLQlTdHJpbmdbXSBpdGVtcywKLQlpbnQgc3RhcnQsCi0JaW50IGVuZCwKLQlpbnRbXSBleHBlY3RlZEluZGljZXMpIHsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNlbGVjdChzdGFydCwgZW5kKTsKLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCJkZXNlbGVjdEFsbDoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgLy8gPD0gb24gcHVycG9zZQotCQlsaXN0LnNlbGVjdChpKTsKLQotCWFzc2VydFNhbWUoIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotfQotLyoqCi0gKiBTaW1pbGFyIHRvIGRlc2VsZWN0SUlfaGVscGVyLCBjaGVja3MgaWYgc2VsZWN0KGludCBbXWFycikgZ2l2ZXMgdGhlIHNhbWUKLSAqIHJlc3VsdCBhcyBzZXZlcmFsIGluZGl2aWR1YWwgc2VsZWN0KGludCkgY2FsbHMuIFRoZSBpbnRbXSB1c2VkIGZvciBzZWxlY3Rpb24KLSAqIHdpbGwgYmUgZmlsbGVkIGFsbCBpbnRlZ2VycyBmcm9tIHN0YXJ0IHRvIGVuZCBpbmNsdXNpdmUsIGluIG9yZGVyLgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZWxlY3QkSV9oZWxwZXIoCi0JU3RyaW5nW10gaXRlbXMsCi0JaW50IHN0YXJ0LAotCWludCBlbmQsCi0JaW50W10gZXhwZWN0ZWRJbmRpY2VzKSB7Ci0JaW50W10gc2VsZWN0aW9uID0gbmV3IGludFtlbmQgLSBzdGFydCArIDFdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgKytpKSB7Ci0JCXNlbGVjdGlvbltpXSA9IGkgKyBzdGFydDsKLQl9Ci0KLQlsaXN0LnNlbGVjdChzZWxlY3Rpb24pOwotCi0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiZGVzZWxlY3RBbGw6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIC8vIDw9IG9uIHB1cnBvc2UKLQkJbGlzdC5zZWxlY3QoaSk7Ci0KLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci19Ci0KLXByaXZhdGUgdm9pZCBhZGQoKSB7Ci0gICAgbGlzdC5hZGQoInRoaXMiKTsKLSAgICBsaXN0LmFkZCgiaXMiKTsKLSAgICBsaXN0LmFkZCgiU1dUIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgNSwgMzAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJlYzc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZmMxYTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQlzZXRXaWRnZXQobWVudSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OVUxMKTsKLQlNZW51IHRlc3RNZW51ID0gbmV3IE1lbnUoY29tcCk7Ci0JY29tcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJKCkgewotCU1lbnUgbmV3TWVudTsKLQlTaGVsbCBudWxsU2hlbGwgPSBudWxsOwotCXRyeSB7Ci0JCW5ld01lbnUgPSBuZXcgTWVudShudWxsU2hlbGwsIFNXVC5OVUxMKTsKLQkJbmV3TWVudS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpIHsKLQlNZW51IG5ld01lbnU7Ci0JbmV3TWVudSA9IG5ldyBNZW51KG1lbnUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCU1lbnUgbmV3TWVudTsKLQlNZW51SXRlbSBtSXRlbSA9IG51bGw7Ci0JdHJ5IHsKLQkJbmV3TWVudSA9IG5ldyBNZW51KG1JdGVtKTsKLQkJbmV3TWVudS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCW5ld01lbnUgPSBuZXcgTWVudShtSXRlbSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JSGVscExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEhlbHBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9OwotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudS5hZGRIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51LmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudS5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51LnJlbW92ZUhlbHBMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlSGVscExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgTWVudUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9OwotCX07Ci0KLQl0cnkgewotCQltZW51LmFkZE1lbnVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkTWVudUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnUuYWRkTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7Ci0JbWVudS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNob3csIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5IaWRlLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgbGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCW1lbnUucmVtb3ZlTWVudUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVNZW51TGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51LnJlbW92ZU1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5TaG93LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRJdGVtKCkgewotCS8vIHRlc3RlZCBpbiBzZXREZWZhdWx0SXRlbSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRFbmFibGVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JTWVudUl0ZW0gdGk7Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0SXRlbUNvdW50KCksIGkpOwotCSAgCXRpID0gbmV3IE1lbnVJdGVtKG1lbnUsIDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlNZW51SXRlbSBtSXRlbTAgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCU1lbnVJdGVtIG1JdGVtMSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0SXRlbSgwKSwgbUl0ZW0wKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRJdGVtKDEpLCBtSXRlbTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludCBudW1iZXIgPSA1OwotCU1lbnVJdGVtW10gaXRlbXMgPSBuZXcgTWVudUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IE1lbnVJdGVtKG1lbnUsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIGl0ZW1zLCBtZW51LmdldEl0ZW1zKCkpOwotCQotCW1lbnUuZ2V0SXRlbXMoKVswXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBuZXcgTWVudUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIG1lbnUuZ2V0SXRlbXMoKSk7Ci0KLQltZW51LmdldEl0ZW1zKClbM10uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmM6IiwgbmV3IE1lbnVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIG1lbnUuZ2V0SXRlbXMoKSk7Ci0KLQltZW51LmdldEl0ZW1zKClbMV0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmQ6IiwgbmV3IE1lbnVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzNdfSwgbWVudS5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0UGFyZW50KCksIHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlNZW51IG5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JYXNzZXJ0TnVsbChuZXdNZW51LmdldFBhcmVudEl0ZW0oKSk7Ci0JbUl0ZW0uc2V0TWVudShuZXdNZW51KTsKLQlhc3NlcnRFcXVhbHMobmV3TWVudS5nZXRQYXJlbnRJdGVtKCksIG1JdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRNZW51KCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlNZW51IG5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JYXNzZXJ0TnVsbChuZXdNZW51LmdldFBhcmVudE1lbnUoKSk7Ci0JbUl0ZW0uc2V0TWVudShuZXdNZW51KTsKLQlhc3NlcnRFcXVhbHMobmV3TWVudS5nZXRQYXJlbnRNZW51KCksIG1lbnUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxsKCkgewotCWFzc2VydEVxdWFscyhtZW51LmdldFNoZWxsKCksIHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiBzZXRWaXNpYmxlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCU1lbnVJdGVtW10gbWlzID0gbmV3IE1lbnVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAltaXNbaV0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRFcXVhbHMobWVudS5pbmRleE9mKG1pc1tpXSksIGkpOwotCQlpZiAoaT4xKQotCQkJYXNzZXJ0VHJ1ZShtZW51LmluZGV4T2YobWlzW2ktMV0pICE9IGkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEVuYWJsZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCS8vIFRoaXMgdGVzdCBjYW4gbm90IGJlIHJ1biBhcyBpdCBjdXJyZW50bHkgaXMgd3JpdHRlbi4gIE9uIFdpbmRvd3MsIGlmIGEgCi0JLy8gbWVudSBoYXMgbm8gbWVudSBpdGVtcywgaXQgd2lsbCBub3QgYmVjb21lIHZpc2libGUuCi0JLy8gSWYgd2UgYWRkIG1lbnUgaXRlbXMgdG8gdGhlIG1lbnUgdGhlbiBhIHNlY29uZCBwcm9ibGVtIGlzIGVuY291bnRlcmVkIAotCS8vIGJlY2F1c2UgbWVudS5zZXRWaXNpYmxlKCkgZW50ZXJzIGludG8gYSBtb2RhbCBsb29wIGFuZCBleGVjdXRpb24gb2YgCi0JLy8gdGhlIEpVbml0IHRlc3QgY2FzZSB3aWxsIG5vdCBjb250aW51ZSB1bnRpbCB0aGUgbWVudSBpcyBzZWxlY3RlZCBhbmQgY2xvc2VkLgotCWlmICh0cnVlKSByZXR1cm47Ci0JbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUobWVudS5pc1Zpc2libGUoKSk7Ci0KLQkvLyBhcGkgbm90IGltcGxlbWVudGVkIHlldAotCWlmIChmQ2hlY2tWaXNpYmlsaXR5KSB7Ci0JCW1lbnUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtZW51LmlzVmlzaWJsZSgpLCBmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSGVscExpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTWVudUxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCU1lbnVJdGVtIG1JdGVtMCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JTWVudUl0ZW0gbUl0ZW0xID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQltZW51LnNldERlZmF1bHRJdGVtKG1JdGVtMCk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0RGVmYXVsdEl0ZW0oKSwgbUl0ZW0wKTsKLQlhc3NlcnRUcnVlKCJBZnRlciBzZXREZWZhdWx0SXRlbShtSXRlbTApOiIsIG1lbnUuZ2V0RGVmYXVsdEl0ZW0oKSAhPSBtSXRlbTEpOwotCW1lbnUuc2V0RGVmYXVsdEl0ZW0obUl0ZW0xKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXREZWZhdWx0SXRlbSgpLCBtSXRlbTEpOwotCWFzc2VydFRydWUoIkFmdGVyIHNldERlZmF1bHRJdGVtKG1JdGVtMSk6IiwgbWVudS5nZXREZWZhdWx0SXRlbSgpICE9IG1JdGVtMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JbWVudS5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUobWVudS5nZXRFbmFibGVkKCkpOwotCW1lbnUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UobWVudS5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0JbWVudS5zZXRMb2NhdGlvbigwLDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQltZW51LnNldExvY2F0aW9uKG5ldyBQb2ludCgwLDApKTsKLQl0cnkgewotCQltZW51LnNldExvY2F0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JLy8gVGhpcyB0ZXN0IGNhbiBub3QgYmUgcnVuIGFzIGl0IGN1cnJlbnRseSBpcyB3cml0dGVuLiAgT24gV2luZG93cywgaWYgYSAKLQkvLyBtZW51IGhhcyBubyBtZW51IGl0ZW1zLCBpdCB3aWxsIG5vdCBiZWNvbWUgdmlzaWJsZS4KLQkvLyBJZiB3ZSBhZGQgbWVudSBpdGVtcyB0byB0aGUgbWVudSB0aGVuIGEgc2Vjb25kIHByb2JsZW0gaXMgZW5jb3VudGVyZWQgCi0JLy8gYmVjYXVzZSBtZW51LnNldFZpc2libGUoKSBlbnRlcnMgaW50byBhIG1vZGFsIGxvb3AgYW5kIGV4ZWN1dGlvbiBvZiAKLQkvLyB0aGUgSlVuaXQgdGVzdCBjYXNlIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsIHRoZSBtZW51IGlzIHNlbGVjdGVkIGFuZCBjbG9zZWQuCi0JaWYgKHRydWUpIHJldHVybjsKLQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmdldFZpc2libGUoKSk7Ci0JLy8gQVBJIG5vdCBpbXBsZW1lbnRlZCB5ZXQgCi0JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLQkJbWVudS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0VmlzaWJsZSgpLCBmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKSkgdGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRJdGVtIikpIHRlc3RfZ2V0RGVmYXVsdEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50SXRlbSIpKSB0ZXN0X2dldFBhcmVudEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudE1lbnUiKSkgdGVzdF9nZXRQYXJlbnRNZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbCIpKSB0ZXN0X2dldFNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25JSSIpKSB0ZXN0X3NldExvY2F0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lbnUgbWVudTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MGI1NmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCAwKTsKLQlzZXRXaWRnZXQobWVudUl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQkKLQl0cnkgewotCQluZXcgTWVudUl0ZW0obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5DSEVDSyk7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5DQVNDQURFKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlBVU0gpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5TRVBBUkFUT1IpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlJBRElPKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUlJKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMLCAwKTsgLy9jcmVhdGUgYSBtZW51IGl0ZW0gYXQgaW5kZXggMAotCWFzc2VydE5vdE51bGwobUl0ZW0pOwotCWFzc2VydFRydWUobWVudS5nZXRJdGVtKDApLmVxdWFscyhtSXRlbSkpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMLCAxKTsKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQlhc3NlcnRUcnVlKG1lbnUuZ2V0SXRlbSgxKS5lcXVhbHMobUl0ZW0pKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JQXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQXJtTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldEFybWVkKEFybUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfTsKLQl9OwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLmFkZEFybUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51SXRlbS5hZGRBcm1MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5Bcm0sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5yZW1vdmVBcm1MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlQXJtTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51SXRlbS5yZW1vdmVBcm1MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5Bcm0sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JSGVscExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEhlbHBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9OwotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0uYWRkSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudUl0ZW0uYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5yZW1vdmVIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnVJdGVtLnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9OwotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9OwotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZFNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUobGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnVJdGVtLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBY2NlbGVyYXRvcigpIHsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdYJyk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldEFjY2VsZXJhdG9yKCksIFNXVC5NT0QxICsgJ1gnKTsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMiArICdZJyk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldEFjY2VsZXJhdG9yKCksIFNXVC5NT0QyICsgJ1knKTsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMyArICdaJyk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldEFjY2VsZXJhdG9yKCksIFNXVC5NT0QzICsgJ1onKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEVuYWJsZWRaKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZW51KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0UGFyZW50KCksIG1lbnUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTZWxlY3Rpb25aKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmlzRW5hYmxlZCgpKTsKLQltZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uaXNFbmFibGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFjY2VsZXJhdG9ySSgpIHsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ1RSTCArICdaJyk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldEFjY2VsZXJhdG9yKCksIFNXVC5DVFJMICsgJ1onKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQltZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0RW5hYmxlZCgpKTsKLQltZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0RW5hYmxlZCgpLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwobWVudUl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JbWVudUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCBtZW51SXRlbS5nZXRJbWFnZSgpKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldEltYWdlKCkgIT0gaW1hZ2VzWzFdKTsKLQltZW51SXRlbS5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKG1lbnVJdGVtLmdldEltYWdlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpIHsKLQlhc3NlcnROdWxsKG1lbnVJdGVtLmdldE1lbnUoKSk7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCU1lbnUgbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQltSXRlbS5zZXRNZW51KG5ld01lbnUpOwotCWFzc2VydEVxdWFscyhtSXRlbS5nZXRNZW51KCksIG5ld01lbnUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvblooKSB7Ci0KLQlpbnRbXSBpdGVtU3R5bGVzID0ge1NXVC5DSEVDSywgU1dULlJBRElPfTsKLQlmb3IgKGludCBpPTA7IGk8aXRlbVN0eWxlcy5sZW5ndGg7IGkrKykKLQl7Ci0JCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIGl0ZW1TdHlsZXNbaV0pOwotCQltSXRlbS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobUl0ZW0uZ2V0U2VsZWN0aW9uKCksIGZhbHNlKTsKLQkJbUl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlhc3NlcnRUcnVlKG1JdGVtLmdldFNlbGVjdGlvbigpKTsKLQkJbUl0ZW0uZGlzcG9zZSgpOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCW1lbnVJdGVtLnNldFRleHQoIkFCQ0RFRkciKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldFRleHQoKS5lcXVhbHMoIkFCQ0RFRkciKSk7Ci0JdHJ5IHsKLQkJbWVudUl0ZW0uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkQXJtTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbWVudUl0ZW0uc2V0VGV4dCgiQUJDREVGRyIpOwotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0EnKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldFRleHQoKS5zdGFydHNXaXRoKCJBQkNERUZHIikpOwotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKDApOwotCW1lbnVJdGVtLnNldFRleHQoIkFCJkNERUZHIik7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRUZXh0KCkuZXF1YWxzKCJBQiZDREVGRyIpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFjY2VsZXJhdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFjY2VsZXJhdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25aIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyIikpIHRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWNjZWxlcmF0b3IiKSkgdGVzdF9nZXRBY2NlbGVyYXRvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lbnUiKSkgdGVzdF9nZXRNZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWNjZWxlcmF0b3JJIikpIHRlc3Rfc2V0QWNjZWxlcmF0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpKSB0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uWiIpKSB0ZXN0X3NldFNlbGVjdGlvblooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lbnUgbWVudTsKLU1lbnVJdGVtIG1lbnVJdGVtOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNzMwNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltZXNzYWdlQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2cobWVzc2FnZUJveCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLS8qKgotICogUG9zc2libGUgZXhjZXB0aW9uczoKLSAqIAotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFyZW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9TVUJDTEFTUyAtIGlmIHRoaXMgY2xhc3MgaXMgbm90IGFuIGFsbG93ZWQgc3ViY2xhc3M8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpewotCU1lc3NhZ2VCb3ggbWIgPSBuZXcgTWVzc2FnZUJveChzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IE1lc3NhZ2VCb3gobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1lc3NhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotLyoqCi0gKiBNYWtlcyB0aGUgZGlhbG9nIHZpc2libGUgYW5kIGJyaW5ncyBpdCB0byB0aGUgZnJvbnQKLSAqIG9mIHRoZSBkaXNwbGF5LgotICoKLSAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgc2VsZWN0ZWQgdG8gZGlzbWlzcyB0aGUKLSAqICAgICAgICAgbWVzc2FnZSBib3ggKGUuZy4gU1dULk9LLCBTV1QuQ0FOQ0VMLCBldGMuLi4pCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpewotCWlmIChmVGVzdERpYWxvZ09wZW4pCi0JCW1lc3NhZ2VCb3gub3BlbigpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGRpYWxvZydzIG1lc3NhZ2UsIHdoaWNoIGlzIGEgZGVzY3JpcHRpb24gb2YKLSAqIHRoZSBwdXJwb3NlIGZvciB3aGljaCBpdCB3YXMgb3BlbmVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBiZQotICogdmlzaWJsZSBvbiB0aGUgZGlhbG9nIHdoaWxlIGl0IGlzIG9wZW4uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSh0ZXN0U3RyKTsKLQlhc3NlcnRFcXVhbHMobWVzc2FnZUJveC5nZXRNZXNzYWdlKCksIHRlc3RTdHIpOwotCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSgiIik7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCAiIik7Ci0JdHJ5IHsKLQkJbWVzc2FnZUJveC5zZXRNZXNzYWdlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZXNzYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotTWVzc2FnZUJveCBtZXNzYWdlQm94OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODRhYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTW9uaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTW9uaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQltb25pdG9ycyA9IGRpc3BsYXkuZ2V0TW9uaXRvcnMoKTsKLQlwcmltYXJ5ID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvcigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHByaW1hcnkuZXF1YWxzKG1vbml0b3JzW2ldKSkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1vbml0b3JzLmxlbmd0aCkgZmFpbCgpOwotCWZvciAoaSA9IDA7IGkgIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJTW9uaXRvciB0ZXN0ID0gbW9uaXRvcnNbaV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgbW9uaXRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCWlmICh0ZXN0LmVxdWFscyhtb25pdG9yc1tqXSkpIHsKLQkJCQlpZiAoaSAhPSBqKSBmYWlsKCJNb25pdG9ycyAiK2krIiBhbmQgIitqKyIgc2hvdWxkIG5vdCBiZSBlcXVhbCIpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbWFyeS5nZXRCb3VuZHMoKTsKLQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlib3VuZHMgPSBtb25pdG9yc1tpXS5nZXRCb3VuZHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCVJlY3RhbmdsZSBib3VuZHMgPSBwcmltYXJ5LmdldENsaWVudEFyZWEoKTsKLQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlib3VuZHMgPSBtb25pdG9yc1tpXS5nZXRDbGllbnRBcmVhKCk7Ci0JCWFzc2VydE5vdE51bGwoYm91bmRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlpZiAocHJpbWFyeS5lcXVhbHMobW9uaXRvcnNbaV0pKSB7Ci0JCQlhc3NlcnRUcnVlKHByaW1hcnkuaGFzaENvZGUoKSA9PSBtb25pdG9yc1tpXS5oYXNoQ29kZSgpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci1Nb25pdG9yW10gbW9uaXRvcnMgPSBudWxsOwotTW9uaXRvciBwcmltYXJ5ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MGIzZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlByb2dyZXNzQmFyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Qcm9ncmVzc0JhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0JhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHByb2dyZXNzQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWF4aW11bSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvY3VzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb2N1cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXByb2dyZXNzQmFyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1heGltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXByb2dyZXNzQmFyLnNldE1pbmltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1pbmltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFNlbGVjdGlvblZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0U2VsZWN0aW9uIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0JhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWF4aW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb2N1cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVByb2dyZXNzQmFyIHByb2dyZXNzQmFyOwotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCkgewotCS8vIFVuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkvLyBzdG9wcGluZy4KLQkKLQkvL2lmIChwcm9ncmVzc0Jhci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgcHJvZ3Jlc3NCYXIuZ2V0TWluaW11bSgpKTsKLQkvL2lmIChwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgcHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpKTsKLQkvL2lmIChwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpKTsKLQotCWNoZWNrKG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMocHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpLCBtYXhFeHBlY3RlZCk7Ci0JYXNzZXJ0RXF1YWxzKHByb2dyZXNzQmFyLmdldE1pbmltdW0oKSwgbWluRXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDAsIDEwMCwgNTAsIH0sCi17MSwgMSwgMTAwLCA1MCwgfSwKLXsyLCAyLCAxMDAsIDUwLCB9LAotezMsIDMsIDEwMCwgNTAsIH0sCi17NCwgNCwgMTAwLCA1MCwgfSwKLXs1LCA1LCAxMDAsIDUwLCB9LAotezYsIDYsIDEwMCwgNTAsIH0sCi17NywgNywgMTAwLCA1MCwgfSwKLXs4LCA4LCAxMDAsIDUwLCB9LAotezksIDksIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMSwgMTAwLCA1MCwgfSwKLXsxMiwgMTIsIDEwMCwgNTAsIH0sCi17MTMsIDEzLCAxMDAsIDUwLCB9LAotezE0LCAxNCwgMTAwLCA1MCwgfSwKLXsxNSwgMTUsIDEwMCwgNTAsIH0sCi17MTYsIDE2LCAxMDAsIDUwLCB9LAotezE3LCAxNywgMTAwLCA1MCwgfSwKLXsxOCwgMTgsIDEwMCwgNTAsIH0sCi17MTksIDE5LCAxMDAsIDUwLCB9LAotezIwLCAyMCwgMTAwLCA1MCwgfSwKLXsyMSwgMjEsIDEwMCwgNTAsIH0sCi17MjIsIDIyLCAxMDAsIDUwLCB9LAotezIzLCAyMywgMTAwLCA1MCwgfSwKLXsyNCwgMjQsIDEwMCwgNTAsIH0sCi17MjUsIDI1LCAxMDAsIDUwLCB9LAotezI2LCAyNiwgMTAwLCA1MCwgfSwKLXsyNywgMjcsIDEwMCwgNTAsIH0sCi17MjgsIDI4LCAxMDAsIDUwLCB9LAotezI5LCAyOSwgMTAwLCA1MCwgfSwKLXszMCwgMzAsIDEwMCwgNTAsIH0sCi17MzEsIDMxLCAxMDAsIDUwLCB9LAotezMyLCAzMiwgMTAwLCA1MCwgfSwKLXszMywgMzMsIDEwMCwgNTAsIH0sCi17MzQsIDM0LCAxMDAsIDUwLCB9LAotezM1LCAzNSwgMTAwLCA1MCwgfSwKLXszNiwgMzYsIDEwMCwgNTAsIH0sCi17MzcsIDM3LCAxMDAsIDUwLCB9LAotezM4LCAzOCwgMTAwLCA1MCwgfSwKLXszOSwgMzksIDEwMCwgNTAsIH0sCi17NDAsIDQwLCAxMDAsIDUwLCB9LAotezQxLCA0MSwgMTAwLCA1MCwgfSwKLXs0MiwgNDIsIDEwMCwgNTAsIH0sCi17NDMsIDQzLCAxMDAsIDUwLCB9LAotezQ0LCA0NCwgMTAwLCA1MCwgfSwKLXs0NSwgNDUsIDEwMCwgNTAsIH0sCi17NDYsIDQ2LCAxMDAsIDUwLCB9LAotezQ3LCA0NywgMTAwLCA1MCwgfSwKLXs0OCwgNDgsIDEwMCwgNTAsIH0sCi17NDksIDQ5LCAxMDAsIDUwLCB9LAotezUwLCA1MCwgMTAwLCA1MCwgfSwKLXs1MSwgNTEsIDEwMCwgNTEsIH0sCi17NTIsIDUyLCAxMDAsIDUyLCB9LAotezUzLCA1MywgMTAwLCA1MywgfSwKLXs1NCwgNTQsIDEwMCwgNTQsIH0sCi17NTUsIDU1LCAxMDAsIDU1LCB9LAotezU2LCA1NiwgMTAwLCA1NiwgfSwKLXs1NywgNTcsIDEwMCwgNTcsIH0sCi17NTgsIDU4LCAxMDAsIDU4LCB9LAotezU5LCA1OSwgMTAwLCA1OSwgfSwKLXs2MCwgNjAsIDEwMCwgNjAsIH0sCi17NjEsIDYxLCAxMDAsIDYxLCB9LAotezYyLCA2MiwgMTAwLCA2MiwgfSwKLXs2MywgNjMsIDEwMCwgNjMsIH0sCi17NjQsIDY0LCAxMDAsIDY0LCB9LAotezY1LCA2NSwgMTAwLCA2NSwgfSwKLXs2NiwgNjYsIDEwMCwgNjYsIH0sCi17NjcsIDY3LCAxMDAsIDY3LCB9LAotezY4LCA2OCwgMTAwLCA2OCwgfSwKLXs2OSwgNjksIDEwMCwgNjksIH0sCi17NzAsIDcwLCAxMDAsIDcwLCB9LAotezcxLCA3MSwgMTAwLCA3MSwgfSwKLXs3MiwgNzIsIDEwMCwgNzIsIH0sCi17NzMsIDczLCAxMDAsIDczLCB9LAotezc0LCA3NCwgMTAwLCA3NCwgfSwKLXs3NSwgNzUsIDEwMCwgNzUsIH0sCi17NzYsIDc2LCAxMDAsIDc2LCB9LAotezc3LCA3NywgMTAwLCA3NywgfSwKLXs3OCwgNzgsIDEwMCwgNzgsIH0sCi17NzksIDc5LCAxMDAsIDc5LCB9LAotezgwLCA4MCwgMTAwLCA4MCwgfSwKLXs4MSwgODEsIDEwMCwgODEsIH0sCi17ODIsIDgyLCAxMDAsIDgyLCB9LAotezgzLCA4MywgMTAwLCA4MywgfSwKLXs4NCwgODQsIDEwMCwgODQsIH0sCi17ODUsIDg1LCAxMDAsIDg1LCB9LAotezg2LCA4NiwgMTAwLCA4NiwgfSwKLXs4NywgODcsIDEwMCwgODcsIH0sCi17ODgsIDg4LCAxMDAsIDg4LCB9LAotezg5LCA4OSwgMTAwLCA4OSwgfSwKLXs5MCwgOTAsIDEwMCwgOTAsIH0sCi17OTEsIDkxLCAxMDAsIDkxLCB9LAotezkyLCA5MiwgMTAwLCA5MiwgfSwKLXs5MywgOTMsIDEwMCwgOTMsIH0sCi17OTQsIDk0LCAxMDAsIDk0LCB9LAotezk1LCA5NSwgMTAwLCA5NSwgfSwKLXs5NiwgOTYsIDEwMCwgOTYsIH0sCi17OTcsIDk3LCAxMDAsIDk3LCB9LAotezk4LCA5OCwgMTAwLCA5OCwgfSwKLXs5OSwgOTksIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCB9LAotezEwMiwgMTAsIDEwMCwgNTAsIH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCB9LAotezEwNSwgMTAsIDEwMCwgNTAsIH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCB9LAotezEwOCwgMTAsIDEwMCwgNTAsIH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCB9LAotezExMSwgMTAsIDEwMCwgNTAsIH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCB9LAotezExNCwgMTAsIDEwMCwgNTAsIH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCB9LAotezExNywgMTAsIDEwMCwgNTAsIH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTksIDEwLCAxMDAsIDUwLCB9LAotezEyMCwgMTAsIDEwMCwgNTAsIH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCB9LAotezEyMywgMTAsIDEwMCwgNTAsIH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgfSwKLXstMTQsIDEwLCAxMDAsIDUwLCB9LAotey0xMywgMTAsIDEwMCwgNTAsIH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgfSwKLXstMTEsIDEwLCAxMDAsIDUwLCB9LAotey0xMCwgMTAsIDEwMCwgNTAsIH0sCi17LTksIDEwLCAxMDAsIDUwLCB9LAotey04LCAxMCwgMTAwLCA1MCwgfSwKLXstNywgMTAsIDEwMCwgNTAsIH0sCi17LTYsIDEwLCAxMDAsIDUwLCB9LAotey01LCAxMCwgMTAwLCA1MCwgfSwKLXstNCwgMTAsIDEwMCwgNTAsIH0sCi17LTMsIDEwLCAxMDAsIDUwLCB9LAotey0yLCAxMCwgMTAwLCA1MCwgfSwKLXstMSwgMTAsIDEwMCwgNTAsIH0sCi17MCwgMTAsIDEwMCwgNTAsIH0sCi17MSwgMTAsIDEwMCwgNTAsIH0sCi17MiwgMTAsIDEwMCwgNTAsIH0sCi17MywgMTAsIDEwMCwgNTAsIH0sCi17NCwgMTAsIDEwMCwgNTAsIH0sCi17NSwgMTAsIDEwMCwgNTAsIH0sCi17NiwgMTAsIDEwMCwgNTAsIH0sCi17NywgMTAsIDEwMCwgNTAsIH0sCi17OCwgMTAsIDEwMCwgNTAsIH0sCi17OSwgMTAsIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMCwgMTEsIDExLCB9LAotezEyLCAxMCwgMTIsIDEyLCB9LAotezEzLCAxMCwgMTMsIDEzLCB9LAotezE0LCAxMCwgMTQsIDE0LCB9LAotezE1LCAxMCwgMTUsIDE1LCB9LAotezE2LCAxMCwgMTYsIDE2LCB9LAotezE3LCAxMCwgMTcsIDE3LCB9LAotezE4LCAxMCwgMTgsIDE4LCB9LAotezE5LCAxMCwgMTksIDE5LCB9LAotezIwLCAxMCwgMjAsIDIwLCB9LAotezIxLCAxMCwgMjEsIDIxLCB9LAotezIyLCAxMCwgMjIsIDIyLCB9LAotezIzLCAxMCwgMjMsIDIzLCB9LAotezI0LCAxMCwgMjQsIDI0LCB9LAotezI1LCAxMCwgMjUsIDI1LCB9LAotezI2LCAxMCwgMjYsIDI2LCB9LAotezI3LCAxMCwgMjcsIDI3LCB9LAotezI4LCAxMCwgMjgsIDI4LCB9LAotezI5LCAxMCwgMjksIDI5LCB9LAotezMwLCAxMCwgMzAsIDMwLCB9LAotezMxLCAxMCwgMzEsIDMxLCB9LAotezMyLCAxMCwgMzIsIDMyLCB9LAotezMzLCAxMCwgMzMsIDMzLCB9LAotezM0LCAxMCwgMzQsIDM0LCB9LAotezM1LCAxMCwgMzUsIDM1LCB9LAotezM2LCAxMCwgMzYsIDM2LCB9LAotezM3LCAxMCwgMzcsIDM3LCB9LAotezM4LCAxMCwgMzgsIDM4LCB9LAotezM5LCAxMCwgMzksIDM5LCB9LAotezQwLCAxMCwgNDAsIDQwLCB9LAotezQxLCAxMCwgNDEsIDQxLCB9LAotezQyLCAxMCwgNDIsIDQyLCB9LAotezQzLCAxMCwgNDMsIDQzLCB9LAotezQ0LCAxMCwgNDQsIDQ0LCB9LAotezQ1LCAxMCwgNDUsIDQ1LCB9LAotezQ2LCAxMCwgNDYsIDQ2LCB9LAotezQ3LCAxMCwgNDcsIDQ3LCB9LAotezQ4LCAxMCwgNDgsIDQ4LCB9LAotezQ5LCAxMCwgNDksIDQ5LCB9LAotezUwLCAxMCwgNTAsIDUwLCB9LAotezUxLCAxMCwgNTEsIDUwLCB9LAotezUyLCAxMCwgNTIsIDUwLCB9LAotezUzLCAxMCwgNTMsIDUwLCB9LAotezU0LCAxMCwgNTQsIDUwLCB9LAotezU1LCAxMCwgNTUsIDUwLCB9LAotezU2LCAxMCwgNTYsIDUwLCB9LAotezU3LCAxMCwgNTcsIDUwLCB9LAotezU4LCAxMCwgNTgsIDUwLCB9LAotezU5LCAxMCwgNTksIDUwLCB9LAotezYwLCAxMCwgNjAsIDUwLCB9LAotezYxLCAxMCwgNjEsIDUwLCB9LAotezYyLCAxMCwgNjIsIDUwLCB9LAotezYzLCAxMCwgNjMsIDUwLCB9LAotezY0LCAxMCwgNjQsIDUwLCB9LAotezY1LCAxMCwgNjUsIDUwLCB9LAotezY2LCAxMCwgNjYsIDUwLCB9LAotezY3LCAxMCwgNjcsIDUwLCB9LAotezY4LCAxMCwgNjgsIDUwLCB9LAotezY5LCAxMCwgNjksIDUwLCB9LAotezcwLCAxMCwgNzAsIDUwLCB9LAotezcxLCAxMCwgNzEsIDUwLCB9LAotezcyLCAxMCwgNzIsIDUwLCB9LAotezczLCAxMCwgNzMsIDUwLCB9LAotezc0LCAxMCwgNzQsIDUwLCB9LAotezc1LCAxMCwgNzUsIDUwLCB9LAotezc2LCAxMCwgNzYsIDUwLCB9LAotezc3LCAxMCwgNzcsIDUwLCB9LAotezc4LCAxMCwgNzgsIDUwLCB9LAotezc5LCAxMCwgNzksIDUwLCB9LAotezgwLCAxMCwgODAsIDUwLCB9LAotezgxLCAxMCwgODEsIDUwLCB9LAotezgyLCAxMCwgODIsIDUwLCB9LAotezgzLCAxMCwgODMsIDUwLCB9LAotezg0LCAxMCwgODQsIDUwLCB9LAotezg1LCAxMCwgODUsIDUwLCB9LAotezg2LCAxMCwgODYsIDUwLCB9LAotezg3LCAxMCwgODcsIDUwLCB9LAotezg4LCAxMCwgODgsIDUwLCB9LAotezg5LCAxMCwgODksIDUwLCB9LAotezkwLCAxMCwgOTAsIDUwLCB9LAotezkxLCAxMCwgOTEsIDUwLCB9LAotezkyLCAxMCwgOTIsIDUwLCB9LAotezkzLCAxMCwgOTMsIDUwLCB9LAotezk0LCAxMCwgOTQsIDUwLCB9LAotezk1LCAxMCwgOTUsIDUwLCB9LAotezk2LCAxMCwgOTYsIDUwLCB9LAotezk3LCAxMCwgOTcsIDUwLCB9LAotezk4LCAxMCwgOTgsIDUwLCB9LAotezk5LCAxMCwgOTksIDUwLCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCB9LAotezEwMywgMTAsIDEwMywgNTAsIH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCB9LAotezEwNiwgMTAsIDEwNiwgNTAsIH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCB9LAotezEwOSwgMTAsIDEwOSwgNTAsIH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCB9LAotezExMiwgMTAsIDExMiwgNTAsIH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCB9LAotezExNSwgMTAsIDExNSwgNTAsIH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCB9LAotezExOCwgMTAsIDExOCwgNTAsIH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCB9LAotezEyMSwgMTAsIDEyMSwgNTAsIH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCB9LAotezEyNCwgMTAsIDEyNCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXByb2dyZXNzQmFyLnNldE1heGltdW0oMTAwKTsKLQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDEwKTsKLQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgfSwKLXstMTQsIDEwLCAxMDAsIDEwLCB9LAotey0xMywgMTAsIDEwMCwgMTAsIH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgfSwKLXstMTEsIDEwLCAxMDAsIDEwLCB9LAotey0xMCwgMTAsIDEwMCwgMTAsIH0sCi17LTksIDEwLCAxMDAsIDEwLCB9LAotey04LCAxMCwgMTAwLCAxMCwgfSwKLXstNywgMTAsIDEwMCwgMTAsIH0sCi17LTYsIDEwLCAxMDAsIDEwLCB9LAotey01LCAxMCwgMTAwLCAxMCwgfSwKLXstNCwgMTAsIDEwMCwgMTAsIH0sCi17LTMsIDEwLCAxMDAsIDEwLCB9LAotey0yLCAxMCwgMTAwLCAxMCwgfSwKLXstMSwgMTAsIDEwMCwgMTAsIH0sCi17MCwgMTAsIDEwMCwgMTAsIH0sCi17MSwgMTAsIDEwMCwgMTAsIH0sCi17MiwgMTAsIDEwMCwgMTAsIH0sCi17MywgMTAsIDEwMCwgMTAsIH0sCi17NCwgMTAsIDEwMCwgMTAsIH0sCi17NSwgMTAsIDEwMCwgMTAsIH0sCi17NiwgMTAsIDEwMCwgMTAsIH0sCi17NywgMTAsIDEwMCwgMTAsIH0sCi17OCwgMTAsIDEwMCwgMTAsIH0sCi17OSwgMTAsIDEwMCwgMTAsIH0sCi17MTAsIDEwLCAxMDAsIDEwLCB9LAotezExLCAxMCwgMTAwLCAxMSwgfSwKLXsxMiwgMTAsIDEwMCwgMTIsIH0sCi17MTMsIDEwLCAxMDAsIDEzLCB9LAotezE0LCAxMCwgMTAwLCAxNCwgfSwKLXsxNSwgMTAsIDEwMCwgMTUsIH0sCi17MTYsIDEwLCAxMDAsIDE2LCB9LAotezE3LCAxMCwgMTAwLCAxNywgfSwKLXsxOCwgMTAsIDEwMCwgMTgsIH0sCi17MTksIDEwLCAxMDAsIDE5LCB9LAotezIwLCAxMCwgMTAwLCAyMCwgfSwKLXsyMSwgMTAsIDEwMCwgMjEsIH0sCi17MjIsIDEwLCAxMDAsIDIyLCB9LAotezIzLCAxMCwgMTAwLCAyMywgfSwKLXsyNCwgMTAsIDEwMCwgMjQsIH0sCi17MjUsIDEwLCAxMDAsIDI1LCB9LAotezI2LCAxMCwgMTAwLCAyNiwgfSwKLXsyNywgMTAsIDEwMCwgMjcsIH0sCi17MjgsIDEwLCAxMDAsIDI4LCB9LAotezI5LCAxMCwgMTAwLCAyOSwgfSwKLXszMCwgMTAsIDEwMCwgMzAsIH0sCi17MzEsIDEwLCAxMDAsIDMxLCB9LAotezMyLCAxMCwgMTAwLCAzMiwgfSwKLXszMywgMTAsIDEwMCwgMzMsIH0sCi17MzQsIDEwLCAxMDAsIDM0LCB9LAotezM1LCAxMCwgMTAwLCAzNSwgfSwKLXszNiwgMTAsIDEwMCwgMzYsIH0sCi17MzcsIDEwLCAxMDAsIDM3LCB9LAotezM4LCAxMCwgMTAwLCAzOCwgfSwKLXszOSwgMTAsIDEwMCwgMzksIH0sCi17NDAsIDEwLCAxMDAsIDQwLCB9LAotezQxLCAxMCwgMTAwLCA0MSwgfSwKLXs0MiwgMTAsIDEwMCwgNDIsIH0sCi17NDMsIDEwLCAxMDAsIDQzLCB9LAotezQ0LCAxMCwgMTAwLCA0NCwgfSwKLXs0NSwgMTAsIDEwMCwgNDUsIH0sCi17NDYsIDEwLCAxMDAsIDQ2LCB9LAotezQ3LCAxMCwgMTAwLCA0NywgfSwKLXs0OCwgMTAsIDEwMCwgNDgsIH0sCi17NDksIDEwLCAxMDAsIDQ5LCB9LAotezUwLCAxMCwgMTAwLCA1MCwgfSwKLXs1MSwgMTAsIDEwMCwgNTEsIH0sCi17NTIsIDEwLCAxMDAsIDUyLCB9LAotezUzLCAxMCwgMTAwLCA1MywgfSwKLXs1NCwgMTAsIDEwMCwgNTQsIH0sCi17NTUsIDEwLCAxMDAsIDU1LCB9LAotezU2LCAxMCwgMTAwLCA1NiwgfSwKLXs1NywgMTAsIDEwMCwgNTcsIH0sCi17NTgsIDEwLCAxMDAsIDU4LCB9LAotezU5LCAxMCwgMTAwLCA1OSwgfSwKLXs2MCwgMTAsIDEwMCwgNjAsIH0sCi17NjEsIDEwLCAxMDAsIDYxLCB9LAotezYyLCAxMCwgMTAwLCA2MiwgfSwKLXs2MywgMTAsIDEwMCwgNjMsIH0sCi17NjQsIDEwLCAxMDAsIDY0LCB9LAotezY1LCAxMCwgMTAwLCA2NSwgfSwKLXs2NiwgMTAsIDEwMCwgNjYsIH0sCi17NjcsIDEwLCAxMDAsIDY3LCB9LAotezY4LCAxMCwgMTAwLCA2OCwgfSwKLXs2OSwgMTAsIDEwMCwgNjksIH0sCi17NzAsIDEwLCAxMDAsIDcwLCB9LAotezcxLCAxMCwgMTAwLCA3MSwgfSwKLXs3MiwgMTAsIDEwMCwgNzIsIH0sCi17NzMsIDEwLCAxMDAsIDczLCB9LAotezc0LCAxMCwgMTAwLCA3NCwgfSwKLXs3NSwgMTAsIDEwMCwgNzUsIH0sCi17NzYsIDEwLCAxMDAsIDc2LCB9LAotezc3LCAxMCwgMTAwLCA3NywgfSwKLXs3OCwgMTAsIDEwMCwgNzgsIH0sCi17NzksIDEwLCAxMDAsIDc5LCB9LAotezgwLCAxMCwgMTAwLCA4MCwgfSwKLXs4MSwgMTAsIDEwMCwgODEsIH0sCi17ODIsIDEwLCAxMDAsIDgyLCB9LAotezgzLCAxMCwgMTAwLCA4MywgfSwKLXs4NCwgMTAsIDEwMCwgODQsIH0sCi17ODUsIDEwLCAxMDAsIDg1LCB9LAotezg2LCAxMCwgMTAwLCA4NiwgfSwKLXs4NywgMTAsIDEwMCwgODcsIH0sCi17ODgsIDEwLCAxMDAsIDg4LCB9LAotezg5LCAxMCwgMTAwLCA4OSwgfSwKLXs5MCwgMTAsIDEwMCwgOTAsIH0sCi17OTEsIDEwLCAxMDAsIDkxLCB9LAotezkyLCAxMCwgMTAwLCA5MiwgfSwKLXs5MywgMTAsIDEwMCwgOTMsIH0sCi17OTQsIDEwLCAxMDAsIDk0LCB9LAotezk1LCAxMCwgMTAwLCA5NSwgfSwKLXs5NiwgMTAsIDEwMCwgOTYsIH0sCi17OTcsIDEwLCAxMDAsIDk3LCB9LAotezk4LCAxMCwgMTAwLCA5OCwgfSwKLXs5OSwgMTAsIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTA0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTEwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTExLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTE0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTIwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTI0LCAxMCwgMTAwLCAxMDAsIH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY1MWE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2gKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2gKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2goU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNhc2ggPSBuZXcgU2FzaChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHNhc2gpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2FzaCA9IG5ldyBTYXNoKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXNhc2ggPSBuZXcgU2FzaChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQkvLyBvdmVycmlkZGVuIGZyb20gQ29udHJvbCBiZWNhdXNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UKLQkvLyB0byBzZXQgdGhlIGZvbnQgb2YgYSBTYXNoLgotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2goKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVNhc2ggc2FzaDsKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVNhc2goKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIEJ1dHRvbiBiMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICBTYXNoIHNhc2ggPSBuZXcgU2FzaChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLSAgICBCdXR0b24gYjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgc2V0V2lkZ2V0KHNhc2gpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNyZWF0ZVNhc2goKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY3JlYXRlU2FzaCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgY3JlYXRlU2FzaCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0MTI0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2NhbGUgPSBuZXcgU2NhbGUoc2hlbGwsIDApOwotCXNldFdpZGdldChzY2FsZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlzY2FsZSA9IG5ldyBTY2FsZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIG9jY3VycmVkIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXNjYWxlID0gbmV3IFNjYWxlKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluY3JlbWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5jcmVtZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWF4aW11bSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYWdlSW5jcmVtZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5jcmVtZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW5jcmVtZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1heGltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCkgewotCi0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWluaW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2NhbGUuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0TWluaW11bSIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2NhbGUuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRTZWxlY3Rpb24iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JLy8gdG8gc2V0IHRoZSBmb250IG9mIGEgU2NhbGUuCi19Ci0KLVNjYWxlIHNjYWxlOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JIC8vVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCSAvL3N0b3BwaW5nLgotCQotCS8vaWYgKHRyYWNrQmFyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyB0cmFja0Jhci5nZXRNaW5pbXVtKCkpOwotCS8vaWYgKHRyYWNrQmFyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyB0cmFja0Jhci5nZXRNYXhpbXVtKCkpOwotCS8vaWYgKHRyYWNrQmFyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0U2VsZWN0aW9uKCkpOwotCWNoZWNrKG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMoc2NhbGUuZ2V0TWF4aW11bSgpLCBtYXhFeHBlY3RlZCk7Ci0JYXNzZXJ0RXF1YWxzKHNjYWxlLmdldE1pbmltdW0oKSwgbWluRXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhzY2FsZS5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDAsIDEwMCwgNTAsIH0sCi17MSwgMSwgMTAwLCA1MCwgfSwKLXsyLCAyLCAxMDAsIDUwLCB9LAotezMsIDMsIDEwMCwgNTAsIH0sCi17NCwgNCwgMTAwLCA1MCwgfSwKLXs1LCA1LCAxMDAsIDUwLCB9LAotezYsIDYsIDEwMCwgNTAsIH0sCi17NywgNywgMTAwLCA1MCwgfSwKLXs4LCA4LCAxMDAsIDUwLCB9LAotezksIDksIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMSwgMTAwLCA1MCwgfSwKLXsxMiwgMTIsIDEwMCwgNTAsIH0sCi17MTMsIDEzLCAxMDAsIDUwLCB9LAotezE0LCAxNCwgMTAwLCA1MCwgfSwKLXsxNSwgMTUsIDEwMCwgNTAsIH0sCi17MTYsIDE2LCAxMDAsIDUwLCB9LAotezE3LCAxNywgMTAwLCA1MCwgfSwKLXsxOCwgMTgsIDEwMCwgNTAsIH0sCi17MTksIDE5LCAxMDAsIDUwLCB9LAotezIwLCAyMCwgMTAwLCA1MCwgfSwKLXsyMSwgMjEsIDEwMCwgNTAsIH0sCi17MjIsIDIyLCAxMDAsIDUwLCB9LAotezIzLCAyMywgMTAwLCA1MCwgfSwKLXsyNCwgMjQsIDEwMCwgNTAsIH0sCi17MjUsIDI1LCAxMDAsIDUwLCB9LAotezI2LCAyNiwgMTAwLCA1MCwgfSwKLXsyNywgMjcsIDEwMCwgNTAsIH0sCi17MjgsIDI4LCAxMDAsIDUwLCB9LAotezI5LCAyOSwgMTAwLCA1MCwgfSwKLXszMCwgMzAsIDEwMCwgNTAsIH0sCi17MzEsIDMxLCAxMDAsIDUwLCB9LAotezMyLCAzMiwgMTAwLCA1MCwgfSwKLXszMywgMzMsIDEwMCwgNTAsIH0sCi17MzQsIDM0LCAxMDAsIDUwLCB9LAotezM1LCAzNSwgMTAwLCA1MCwgfSwKLXszNiwgMzYsIDEwMCwgNTAsIH0sCi17MzcsIDM3LCAxMDAsIDUwLCB9LAotezM4LCAzOCwgMTAwLCA1MCwgfSwKLXszOSwgMzksIDEwMCwgNTAsIH0sCi17NDAsIDQwLCAxMDAsIDUwLCB9LAotezQxLCA0MSwgMTAwLCA1MCwgfSwKLXs0MiwgNDIsIDEwMCwgNTAsIH0sCi17NDMsIDQzLCAxMDAsIDUwLCB9LAotezQ0LCA0NCwgMTAwLCA1MCwgfSwKLXs0NSwgNDUsIDEwMCwgNTAsIH0sCi17NDYsIDQ2LCAxMDAsIDUwLCB9LAotezQ3LCA0NywgMTAwLCA1MCwgfSwKLXs0OCwgNDgsIDEwMCwgNTAsIH0sCi17NDksIDQ5LCAxMDAsIDUwLCB9LAotezUwLCA1MCwgMTAwLCA1MCwgfSwKLXs1MSwgNTEsIDEwMCwgNTEsIH0sCi17NTIsIDUyLCAxMDAsIDUyLCB9LAotezUzLCA1MywgMTAwLCA1MywgfSwKLXs1NCwgNTQsIDEwMCwgNTQsIH0sCi17NTUsIDU1LCAxMDAsIDU1LCB9LAotezU2LCA1NiwgMTAwLCA1NiwgfSwKLXs1NywgNTcsIDEwMCwgNTcsIH0sCi17NTgsIDU4LCAxMDAsIDU4LCB9LAotezU5LCA1OSwgMTAwLCA1OSwgfSwKLXs2MCwgNjAsIDEwMCwgNjAsIH0sCi17NjEsIDYxLCAxMDAsIDYxLCB9LAotezYyLCA2MiwgMTAwLCA2MiwgfSwKLXs2MywgNjMsIDEwMCwgNjMsIH0sCi17NjQsIDY0LCAxMDAsIDY0LCB9LAotezY1LCA2NSwgMTAwLCA2NSwgfSwKLXs2NiwgNjYsIDEwMCwgNjYsIH0sCi17NjcsIDY3LCAxMDAsIDY3LCB9LAotezY4LCA2OCwgMTAwLCA2OCwgfSwKLXs2OSwgNjksIDEwMCwgNjksIH0sCi17NzAsIDcwLCAxMDAsIDcwLCB9LAotezcxLCA3MSwgMTAwLCA3MSwgfSwKLXs3MiwgNzIsIDEwMCwgNzIsIH0sCi17NzMsIDczLCAxMDAsIDczLCB9LAotezc0LCA3NCwgMTAwLCA3NCwgfSwKLXs3NSwgNzUsIDEwMCwgNzUsIH0sCi17NzYsIDc2LCAxMDAsIDc2LCB9LAotezc3LCA3NywgMTAwLCA3NywgfSwKLXs3OCwgNzgsIDEwMCwgNzgsIH0sCi17NzksIDc5LCAxMDAsIDc5LCB9LAotezgwLCA4MCwgMTAwLCA4MCwgfSwKLXs4MSwgODEsIDEwMCwgODEsIH0sCi17ODIsIDgyLCAxMDAsIDgyLCB9LAotezgzLCA4MywgMTAwLCA4MywgfSwKLXs4NCwgODQsIDEwMCwgODQsIH0sCi17ODUsIDg1LCAxMDAsIDg1LCB9LAotezg2LCA4NiwgMTAwLCA4NiwgfSwKLXs4NywgODcsIDEwMCwgODcsIH0sCi17ODgsIDg4LCAxMDAsIDg4LCB9LAotezg5LCA4OSwgMTAwLCA4OSwgfSwKLXs5MCwgOTAsIDEwMCwgOTAsIH0sCi17OTEsIDkxLCAxMDAsIDkxLCB9LAotezkyLCA5MiwgMTAwLCA5MiwgfSwKLXs5MywgOTMsIDEwMCwgOTMsIH0sCi17OTQsIDk0LCAxMDAsIDk0LCB9LAotezk1LCA5NSwgMTAwLCA5NSwgfSwKLXs5NiwgOTYsIDEwMCwgOTYsIH0sCi17OTcsIDk3LCAxMDAsIDk3LCB9LAotezk4LCA5OCwgMTAwLCA5OCwgfSwKLXs5OSwgOTksIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCB9LAotezEwMiwgMTAsIDEwMCwgNTAsIH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCB9LAotezEwNSwgMTAsIDEwMCwgNTAsIH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCB9LAotezEwOCwgMTAsIDEwMCwgNTAsIH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCB9LAotezExMSwgMTAsIDEwMCwgNTAsIH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCB9LAotezExNCwgMTAsIDEwMCwgNTAsIH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCB9LAotezExNywgMTAsIDEwMCwgNTAsIH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTksIDEwLCAxMDAsIDUwLCB9LAotezEyMCwgMTAsIDEwMCwgNTAsIH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCB9LAotezEyMywgMTAsIDEwMCwgNTAsIH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgfSwKLXstMTQsIDEwLCAxMDAsIDUwLCB9LAotey0xMywgMTAsIDEwMCwgNTAsIH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgfSwKLXstMTEsIDEwLCAxMDAsIDUwLCB9LAotey0xMCwgMTAsIDEwMCwgNTAsIH0sCi17LTksIDEwLCAxMDAsIDUwLCB9LAotey04LCAxMCwgMTAwLCA1MCwgfSwKLXstNywgMTAsIDEwMCwgNTAsIH0sCi17LTYsIDEwLCAxMDAsIDUwLCB9LAotey01LCAxMCwgMTAwLCA1MCwgfSwKLXstNCwgMTAsIDEwMCwgNTAsIH0sCi17LTMsIDEwLCAxMDAsIDUwLCB9LAotey0yLCAxMCwgMTAwLCA1MCwgfSwKLXstMSwgMTAsIDEwMCwgNTAsIH0sCi17MCwgMTAsIDEwMCwgNTAsIH0sCi17MSwgMTAsIDEwMCwgNTAsIH0sCi17MiwgMTAsIDEwMCwgNTAsIH0sCi17MywgMTAsIDEwMCwgNTAsIH0sCi17NCwgMTAsIDEwMCwgNTAsIH0sCi17NSwgMTAsIDEwMCwgNTAsIH0sCi17NiwgMTAsIDEwMCwgNTAsIH0sCi17NywgMTAsIDEwMCwgNTAsIH0sCi17OCwgMTAsIDEwMCwgNTAsIH0sCi17OSwgMTAsIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMCwgMTEsIDExLCB9LAotezEyLCAxMCwgMTIsIDEyLCB9LAotezEzLCAxMCwgMTMsIDEzLCB9LAotezE0LCAxMCwgMTQsIDE0LCB9LAotezE1LCAxMCwgMTUsIDE1LCB9LAotezE2LCAxMCwgMTYsIDE2LCB9LAotezE3LCAxMCwgMTcsIDE3LCB9LAotezE4LCAxMCwgMTgsIDE4LCB9LAotezE5LCAxMCwgMTksIDE5LCB9LAotezIwLCAxMCwgMjAsIDIwLCB9LAotezIxLCAxMCwgMjEsIDIxLCB9LAotezIyLCAxMCwgMjIsIDIyLCB9LAotezIzLCAxMCwgMjMsIDIzLCB9LAotezI0LCAxMCwgMjQsIDI0LCB9LAotezI1LCAxMCwgMjUsIDI1LCB9LAotezI2LCAxMCwgMjYsIDI2LCB9LAotezI3LCAxMCwgMjcsIDI3LCB9LAotezI4LCAxMCwgMjgsIDI4LCB9LAotezI5LCAxMCwgMjksIDI5LCB9LAotezMwLCAxMCwgMzAsIDMwLCB9LAotezMxLCAxMCwgMzEsIDMxLCB9LAotezMyLCAxMCwgMzIsIDMyLCB9LAotezMzLCAxMCwgMzMsIDMzLCB9LAotezM0LCAxMCwgMzQsIDM0LCB9LAotezM1LCAxMCwgMzUsIDM1LCB9LAotezM2LCAxMCwgMzYsIDM2LCB9LAotezM3LCAxMCwgMzcsIDM3LCB9LAotezM4LCAxMCwgMzgsIDM4LCB9LAotezM5LCAxMCwgMzksIDM5LCB9LAotezQwLCAxMCwgNDAsIDQwLCB9LAotezQxLCAxMCwgNDEsIDQxLCB9LAotezQyLCAxMCwgNDIsIDQyLCB9LAotezQzLCAxMCwgNDMsIDQzLCB9LAotezQ0LCAxMCwgNDQsIDQ0LCB9LAotezQ1LCAxMCwgNDUsIDQ1LCB9LAotezQ2LCAxMCwgNDYsIDQ2LCB9LAotezQ3LCAxMCwgNDcsIDQ3LCB9LAotezQ4LCAxMCwgNDgsIDQ4LCB9LAotezQ5LCAxMCwgNDksIDQ5LCB9LAotezUwLCAxMCwgNTAsIDUwLCB9LAotezUxLCAxMCwgNTEsIDUwLCB9LAotezUyLCAxMCwgNTIsIDUwLCB9LAotezUzLCAxMCwgNTMsIDUwLCB9LAotezU0LCAxMCwgNTQsIDUwLCB9LAotezU1LCAxMCwgNTUsIDUwLCB9LAotezU2LCAxMCwgNTYsIDUwLCB9LAotezU3LCAxMCwgNTcsIDUwLCB9LAotezU4LCAxMCwgNTgsIDUwLCB9LAotezU5LCAxMCwgNTksIDUwLCB9LAotezYwLCAxMCwgNjAsIDUwLCB9LAotezYxLCAxMCwgNjEsIDUwLCB9LAotezYyLCAxMCwgNjIsIDUwLCB9LAotezYzLCAxMCwgNjMsIDUwLCB9LAotezY0LCAxMCwgNjQsIDUwLCB9LAotezY1LCAxMCwgNjUsIDUwLCB9LAotezY2LCAxMCwgNjYsIDUwLCB9LAotezY3LCAxMCwgNjcsIDUwLCB9LAotezY4LCAxMCwgNjgsIDUwLCB9LAotezY5LCAxMCwgNjksIDUwLCB9LAotezcwLCAxMCwgNzAsIDUwLCB9LAotezcxLCAxMCwgNzEsIDUwLCB9LAotezcyLCAxMCwgNzIsIDUwLCB9LAotezczLCAxMCwgNzMsIDUwLCB9LAotezc0LCAxMCwgNzQsIDUwLCB9LAotezc1LCAxMCwgNzUsIDUwLCB9LAotezc2LCAxMCwgNzYsIDUwLCB9LAotezc3LCAxMCwgNzcsIDUwLCB9LAotezc4LCAxMCwgNzgsIDUwLCB9LAotezc5LCAxMCwgNzksIDUwLCB9LAotezgwLCAxMCwgODAsIDUwLCB9LAotezgxLCAxMCwgODEsIDUwLCB9LAotezgyLCAxMCwgODIsIDUwLCB9LAotezgzLCAxMCwgODMsIDUwLCB9LAotezg0LCAxMCwgODQsIDUwLCB9LAotezg1LCAxMCwgODUsIDUwLCB9LAotezg2LCAxMCwgODYsIDUwLCB9LAotezg3LCAxMCwgODcsIDUwLCB9LAotezg4LCAxMCwgODgsIDUwLCB9LAotezg5LCAxMCwgODksIDUwLCB9LAotezkwLCAxMCwgOTAsIDUwLCB9LAotezkxLCAxMCwgOTEsIDUwLCB9LAotezkyLCAxMCwgOTIsIDUwLCB9LAotezkzLCAxMCwgOTMsIDUwLCB9LAotezk0LCAxMCwgOTQsIDUwLCB9LAotezk1LCAxMCwgOTUsIDUwLCB9LAotezk2LCAxMCwgOTYsIDUwLCB9LAotezk3LCAxMCwgOTcsIDUwLCB9LAotezk4LCAxMCwgOTgsIDUwLCB9LAotezk5LCAxMCwgOTksIDUwLCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCB9LAotezEwMywgMTAsIDEwMywgNTAsIH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCB9LAotezEwNiwgMTAsIDEwNiwgNTAsIH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCB9LAotezEwOSwgMTAsIDEwOSwgNTAsIH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCB9LAotezExMiwgMTAsIDExMiwgNTAsIH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCB9LAotezExNSwgMTAsIDExNSwgNTAsIH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCB9LAotezExOCwgMTAsIDExOCwgNTAsIH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCB9LAotezEyMSwgMTAsIDEyMSwgNTAsIH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCB9LAotezEyNCwgMTAsIDEyNCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXNjYWxlLnNldE1heGltdW0oMTAwKTsKLQlzY2FsZS5zZXRNaW5pbXVtKDEwKTsKLQlzY2FsZS5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgfSwKLXstMTQsIDEwLCAxMDAsIDEwLCB9LAotey0xMywgMTAsIDEwMCwgMTAsIH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgfSwKLXstMTEsIDEwLCAxMDAsIDEwLCB9LAotey0xMCwgMTAsIDEwMCwgMTAsIH0sCi17LTksIDEwLCAxMDAsIDEwLCB9LAotey04LCAxMCwgMTAwLCAxMCwgfSwKLXstNywgMTAsIDEwMCwgMTAsIH0sCi17LTYsIDEwLCAxMDAsIDEwLCB9LAotey01LCAxMCwgMTAwLCAxMCwgfSwKLXstNCwgMTAsIDEwMCwgMTAsIH0sCi17LTMsIDEwLCAxMDAsIDEwLCB9LAotey0yLCAxMCwgMTAwLCAxMCwgfSwKLXstMSwgMTAsIDEwMCwgMTAsIH0sCi17MCwgMTAsIDEwMCwgMTAsIH0sCi17MSwgMTAsIDEwMCwgMTAsIH0sCi17MiwgMTAsIDEwMCwgMTAsIH0sCi17MywgMTAsIDEwMCwgMTAsIH0sCi17NCwgMTAsIDEwMCwgMTAsIH0sCi17NSwgMTAsIDEwMCwgMTAsIH0sCi17NiwgMTAsIDEwMCwgMTAsIH0sCi17NywgMTAsIDEwMCwgMTAsIH0sCi17OCwgMTAsIDEwMCwgMTAsIH0sCi17OSwgMTAsIDEwMCwgMTAsIH0sCi17MTAsIDEwLCAxMDAsIDEwLCB9LAotezExLCAxMCwgMTAwLCAxMSwgfSwKLXsxMiwgMTAsIDEwMCwgMTIsIH0sCi17MTMsIDEwLCAxMDAsIDEzLCB9LAotezE0LCAxMCwgMTAwLCAxNCwgfSwKLXsxNSwgMTAsIDEwMCwgMTUsIH0sCi17MTYsIDEwLCAxMDAsIDE2LCB9LAotezE3LCAxMCwgMTAwLCAxNywgfSwKLXsxOCwgMTAsIDEwMCwgMTgsIH0sCi17MTksIDEwLCAxMDAsIDE5LCB9LAotezIwLCAxMCwgMTAwLCAyMCwgfSwKLXsyMSwgMTAsIDEwMCwgMjEsIH0sCi17MjIsIDEwLCAxMDAsIDIyLCB9LAotezIzLCAxMCwgMTAwLCAyMywgfSwKLXsyNCwgMTAsIDEwMCwgMjQsIH0sCi17MjUsIDEwLCAxMDAsIDI1LCB9LAotezI2LCAxMCwgMTAwLCAyNiwgfSwKLXsyNywgMTAsIDEwMCwgMjcsIH0sCi17MjgsIDEwLCAxMDAsIDI4LCB9LAotezI5LCAxMCwgMTAwLCAyOSwgfSwKLXszMCwgMTAsIDEwMCwgMzAsIH0sCi17MzEsIDEwLCAxMDAsIDMxLCB9LAotezMyLCAxMCwgMTAwLCAzMiwgfSwKLXszMywgMTAsIDEwMCwgMzMsIH0sCi17MzQsIDEwLCAxMDAsIDM0LCB9LAotezM1LCAxMCwgMTAwLCAzNSwgfSwKLXszNiwgMTAsIDEwMCwgMzYsIH0sCi17MzcsIDEwLCAxMDAsIDM3LCB9LAotezM4LCAxMCwgMTAwLCAzOCwgfSwKLXszOSwgMTAsIDEwMCwgMzksIH0sCi17NDAsIDEwLCAxMDAsIDQwLCB9LAotezQxLCAxMCwgMTAwLCA0MSwgfSwKLXs0MiwgMTAsIDEwMCwgNDIsIH0sCi17NDMsIDEwLCAxMDAsIDQzLCB9LAotezQ0LCAxMCwgMTAwLCA0NCwgfSwKLXs0NSwgMTAsIDEwMCwgNDUsIH0sCi17NDYsIDEwLCAxMDAsIDQ2LCB9LAotezQ3LCAxMCwgMTAwLCA0NywgfSwKLXs0OCwgMTAsIDEwMCwgNDgsIH0sCi17NDksIDEwLCAxMDAsIDQ5LCB9LAotezUwLCAxMCwgMTAwLCA1MCwgfSwKLXs1MSwgMTAsIDEwMCwgNTEsIH0sCi17NTIsIDEwLCAxMDAsIDUyLCB9LAotezUzLCAxMCwgMTAwLCA1MywgfSwKLXs1NCwgMTAsIDEwMCwgNTQsIH0sCi17NTUsIDEwLCAxMDAsIDU1LCB9LAotezU2LCAxMCwgMTAwLCA1NiwgfSwKLXs1NywgMTAsIDEwMCwgNTcsIH0sCi17NTgsIDEwLCAxMDAsIDU4LCB9LAotezU5LCAxMCwgMTAwLCA1OSwgfSwKLXs2MCwgMTAsIDEwMCwgNjAsIH0sCi17NjEsIDEwLCAxMDAsIDYxLCB9LAotezYyLCAxMCwgMTAwLCA2MiwgfSwKLXs2MywgMTAsIDEwMCwgNjMsIH0sCi17NjQsIDEwLCAxMDAsIDY0LCB9LAotezY1LCAxMCwgMTAwLCA2NSwgfSwKLXs2NiwgMTAsIDEwMCwgNjYsIH0sCi17NjcsIDEwLCAxMDAsIDY3LCB9LAotezY4LCAxMCwgMTAwLCA2OCwgfSwKLXs2OSwgMTAsIDEwMCwgNjksIH0sCi17NzAsIDEwLCAxMDAsIDcwLCB9LAotezcxLCAxMCwgMTAwLCA3MSwgfSwKLXs3MiwgMTAsIDEwMCwgNzIsIH0sCi17NzMsIDEwLCAxMDAsIDczLCB9LAotezc0LCAxMCwgMTAwLCA3NCwgfSwKLXs3NSwgMTAsIDEwMCwgNzUsIH0sCi17NzYsIDEwLCAxMDAsIDc2LCB9LAotezc3LCAxMCwgMTAwLCA3NywgfSwKLXs3OCwgMTAsIDEwMCwgNzgsIH0sCi17NzksIDEwLCAxMDAsIDc5LCB9LAotezgwLCAxMCwgMTAwLCA4MCwgfSwKLXs4MSwgMTAsIDEwMCwgODEsIH0sCi17ODIsIDEwLCAxMDAsIDgyLCB9LAotezgzLCAxMCwgMTAwLCA4MywgfSwKLXs4NCwgMTAsIDEwMCwgODQsIH0sCi17ODUsIDEwLCAxMDAsIDg1LCB9LAotezg2LCAxMCwgMTAwLCA4NiwgfSwKLXs4NywgMTAsIDEwMCwgODcsIH0sCi17ODgsIDEwLCAxMDAsIDg4LCB9LAotezg5LCAxMCwgMTAwLCA4OSwgfSwKLXs5MCwgMTAsIDEwMCwgOTAsIH0sCi17OTEsIDEwLCAxMDAsIDkxLCB9LAotezkyLCAxMCwgMTAwLCA5MiwgfSwKLXs5MywgMTAsIDEwMCwgOTMsIH0sCi17OTQsIDEwLCAxMDAsIDk0LCB9LAotezk1LCAxMCwgMTAwLCA5NSwgfSwKLXs5NiwgMTAsIDEwMCwgOTYsIH0sCi17OTcsIDEwLCAxMDAsIDk3LCB9LAotezk4LCAxMCwgMTAwLCA5OCwgfSwKLXs5OSwgMTAsIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTA0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTEwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTExLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTE0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTIwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTI0LCAxMCwgMTAwLCAxMDAsIH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTA0NTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5IX1NDUk9MTCk7Ci0Jc2Nyb2xsQmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLQlzZXRXaWRnZXQoc2Nyb2xsQmFyKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotcHJvdGVjdGVkIFN0cmluZyB2YWx1ZVN0cmluZyhpbnRbXSBpbnRBcnJheSkgewotCXJldHVybiAiICgiK2ludEFycmF5WzFdKyIsIitpbnRBcnJheVsyXSsiLCIraW50QXJyYXlbM10rIiwiK2ludEFycmF5WzRdKyIpIjsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXNjcm9sbEJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCXNjcm9sbEJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc2Nyb2xsQmFyLnNldFNlbGVjdGlvbigxMDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlzY3JvbGxCYXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXNjcm9sbEJhci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlYXJEb3duCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRFbmFibGVkKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5jcmVtZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEluY3JlbWVudCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWF4aW11bSgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWluaW11bSgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UGFnZUluY3JlbWVudCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMoY2FudmFzLCBzY3JvbGxCYXIuZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTZWxlY3Rpb24oKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldFNpemUoKS54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuZ2V0U2l6ZSgpLnkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUaHVtYigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUaHVtYigpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VmlzaWJsZSgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQlzY3JvbGxCYXIuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5pc0VuYWJsZWQoKSk7Ci0KLQlzY3JvbGxCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmlzRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0Jc2Nyb2xsQmFyLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuaXNWaXNpYmxlKCkpOyAKLQlzY3JvbGxCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmlzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQlzY3JvbGxCYXIuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRFbmFibGVkKCkpOwotCi0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluY3JlbWVudEkoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JCXNjcm9sbEJhci5zZXRJbmNyZW1lbnQoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoY2FzZXNbaV0sIHNjcm9sbEJhci5nZXRJbmNyZW1lbnQoKSk7Ci0JfSAKLQotCXNjcm9sbEJhci5zZXRJbmNyZW1lbnQoMjUpOwotCXNjcm9sbEJhci5zZXRJbmNyZW1lbnQoMCk7IC8vIHNldHRpbmcgdG8gMCBmYWlscyBzaWxlbnRseQotCWFzc2VydEVxdWFscygyNSwgc2Nyb2xsQmFyLmdldEluY3JlbWVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0TWF4aW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNYXggIitpbnRBcnJheVswXSsgdmFsdWVTdHJpbmcsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCl7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjcm9sbEJhci5zZXRNaW5pbXVtKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldE1pbiAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpewotCWludFtdIGNhc2VzID0gezEsIDEwLCAxMDAwMH07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLQkJc2Nyb2xsQmFyLnNldFBhZ2VJbmNyZW1lbnQoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoc2Nyb2xsQmFyLmdldFBhZ2VJbmNyZW1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi0KLQlzY3JvbGxCYXIuc2V0UGFnZUluY3JlbWVudCgyNSk7Ci0Jc2Nyb2xsQmFyLnNldFBhZ2VJbmNyZW1lbnQoMCk7IC8vIHNldHRpbmcgdG8gMCBmYWlscyBzaWxlbnRseQotCWFzc2VydEVxdWFscygyNSwgc2Nyb2xsQmFyLmdldFBhZ2VJbmNyZW1lbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldFNlbCAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRodW1iSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRUaHVtYlZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjcm9sbEJhci5zZXRUaHVtYihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRUaG1iICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCkgewotCXNjcm9sbEJhci5zZXRWYWx1ZXMoMTAsIDEwLCA1MCwgMiwgNSwgMTApOwotCWFzc2VydFRydWUoIjphOiIsIHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2Nyb2xsQmFyLmdldE1pbmltdW0oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2Nyb2xsQmFyLmdldE1heGltdW0oKSA9PSA1MCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2Nyb2xsQmFyLmdldFRodW1iKCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc2Nyb2xsQmFyLmdldEluY3JlbWVudCgpID09IDUpOwotCWFzc2VydFRydWUoIjpmOiIsIHNjcm9sbEJhci5nZXRQYWdlSW5jcmVtZW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCXNjcm9sbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldFZpc2libGUoKSk7Ci0KLQlzY3JvbGxCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmdldFZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluY3JlbWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWF4aW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFnZUluY3JlbWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRodW1iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRodW1iSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluY3JlbWVudCIpKSB0ZXN0X2dldEluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYWdlSW5jcmVtZW50IikpIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUaHVtYiIpKSB0ZXN0X2dldFRodW1iKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Zpc2libGUiKSkgdGVzdF9pc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRodW1iSSIpKSB0ZXN0X3NldFRodW1iSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIikpIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotU2Nyb2xsQmFyIHNjcm9sbEJhcjsKLUNhbnZhcyBjYW52YXM7Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIGNhbGwsIGludCBzZXQsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQsIGludCB0aHVtYkV4cGVjdGVkKSB7Ci0JLy8gVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCS8vIHN0b3BwaW5nLgotLy8JaWYgKHNjcm9sbEJhci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0TWluaW11bSgpKTsKLS8vCX0KLS8vCWlmIChzY3JvbGxCYXIuZ2V0TWF4aW11bSgpICE9IG1heEV4cGVjdGVkKXsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0TWF4aW11bSgpKTsKLS8vCX0KLS8vCWlmIChzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkgIT0gc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSk7Ci0vLwl9Ci0vLwlpZiAoc2Nyb2xsQmFyLmdldFRodW1iKCkgIT0gdGh1bWJFeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFRodW1iIEV4cGVjdGVkOiAiICsgdGh1bWJFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNjcm9sbEJhci5nZXRUaHVtYigpKTsKLS8vCX0KLQljaGVjayhjYWxsLCBtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkLCB0aHVtYkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhTdHJpbmcgY2FsbCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1heCAiLCBtYXhFeHBlY3RlZCwgc2Nyb2xsQmFyLmdldE1heGltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBtaW4gIiwgbWluRXhwZWN0ZWQsIHNjcm9sbEJhci5nZXRNaW5pbXVtKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgc2VsICIsIHNlbGVjdGlvbkV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgdGhtYiAiLCB0aHVtYkV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0VGh1bWIoKSk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0VGh1bWJWYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MSwgMTAsIDEwMCwgNTAsIDF9LAotezIsIDEwLCAxMDAsIDUwLCAyfSwKLXszLCAxMCwgMTAwLCA1MCwgM30sCi17NCwgMTAsIDEwMCwgNTAsIDR9LAotezUsIDEwLCAxMDAsIDUwLCA1fSwKLXs2LCAxMCwgMTAwLCA1MCwgNn0sCi17NywgMTAsIDEwMCwgNTAsIDd9LAotezgsIDEwLCAxMDAsIDUwLCA4fSwKLXs5LCAxMCwgMTAwLCA1MCwgOX0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDEwLCAxMDAsIDUwLCAxMX0sCi17MTIsIDEwLCAxMDAsIDUwLCAxMn0sCi17MTMsIDEwLCAxMDAsIDUwLCAxM30sCi17MTQsIDEwLCAxMDAsIDUwLCAxNH0sCi17MTUsIDEwLCAxMDAsIDUwLCAxNX0sCi17MTYsIDEwLCAxMDAsIDUwLCAxNn0sCi17MTcsIDEwLCAxMDAsIDUwLCAxN30sCi17MTgsIDEwLCAxMDAsIDUwLCAxOH0sCi17MTksIDEwLCAxMDAsIDUwLCAxOX0sCi17MjAsIDEwLCAxMDAsIDUwLCAyMH0sCi17MjEsIDEwLCAxMDAsIDUwLCAyMX0sCi17MjIsIDEwLCAxMDAsIDUwLCAyMn0sCi17MjMsIDEwLCAxMDAsIDUwLCAyM30sCi17MjQsIDEwLCAxMDAsIDUwLCAyNH0sCi17MjUsIDEwLCAxMDAsIDUwLCAyNX0sCi17MjYsIDEwLCAxMDAsIDUwLCAyNn0sCi17MjcsIDEwLCAxMDAsIDUwLCAyN30sCi17MjgsIDEwLCAxMDAsIDUwLCAyOH0sCi17MjksIDEwLCAxMDAsIDUwLCAyOX0sCi17MzAsIDEwLCAxMDAsIDUwLCAzMH0sCi17MzEsIDEwLCAxMDAsIDUwLCAzMX0sCi17MzIsIDEwLCAxMDAsIDUwLCAzMn0sCi17MzMsIDEwLCAxMDAsIDUwLCAzM30sCi17MzQsIDEwLCAxMDAsIDUwLCAzNH0sCi17MzUsIDEwLCAxMDAsIDUwLCAzNX0sCi17MzYsIDEwLCAxMDAsIDUwLCAzNn0sCi17MzcsIDEwLCAxMDAsIDUwLCAzN30sCi17MzgsIDEwLCAxMDAsIDUwLCAzOH0sCi17MzksIDEwLCAxMDAsIDUwLCAzOX0sCi17NDAsIDEwLCAxMDAsIDUwLCA0MH0sCi17NDEsIDEwLCAxMDAsIDUwLCA0MX0sCi17NDIsIDEwLCAxMDAsIDUwLCA0Mn0sCi17NDMsIDEwLCAxMDAsIDUwLCA0M30sCi17NDQsIDEwLCAxMDAsIDUwLCA0NH0sCi17NDUsIDEwLCAxMDAsIDUwLCA0NX0sCi17NDYsIDEwLCAxMDAsIDUwLCA0Nn0sCi17NDcsIDEwLCAxMDAsIDUwLCA0N30sCi17NDgsIDEwLCAxMDAsIDUwLCA0OH0sCi17NDksIDEwLCAxMDAsIDUwLCA0OX0sCi17NTAsIDEwLCAxMDAsIDUwLCA1MH0sCi17NTEsIDEwLCAxMDAsIDQ5LCA1MX0sCi17NTIsIDEwLCAxMDAsIDQ4LCA1Mn0sCi17NTMsIDEwLCAxMDAsIDQ3LCA1M30sCi17NTQsIDEwLCAxMDAsIDQ2LCA1NH0sCi17NTUsIDEwLCAxMDAsIDQ1LCA1NX0sCi17NTYsIDEwLCAxMDAsIDQ0LCA1Nn0sCi17NTcsIDEwLCAxMDAsIDQzLCA1N30sCi17NTgsIDEwLCAxMDAsIDQyLCA1OH0sCi17NTksIDEwLCAxMDAsIDQxLCA1OX0sCi17NjAsIDEwLCAxMDAsIDQwLCA2MH0sCi17NjEsIDEwLCAxMDAsIDM5LCA2MX0sCi17NjIsIDEwLCAxMDAsIDM4LCA2Mn0sCi17NjMsIDEwLCAxMDAsIDM3LCA2M30sCi17NjQsIDEwLCAxMDAsIDM2LCA2NH0sCi17NjUsIDEwLCAxMDAsIDM1LCA2NX0sCi17NjYsIDEwLCAxMDAsIDM0LCA2Nn0sCi17NjcsIDEwLCAxMDAsIDMzLCA2N30sCi17NjgsIDEwLCAxMDAsIDMyLCA2OH0sCi17NjksIDEwLCAxMDAsIDMxLCA2OX0sCi17NzAsIDEwLCAxMDAsIDMwLCA3MH0sCi17NzEsIDEwLCAxMDAsIDI5LCA3MX0sCi17NzIsIDEwLCAxMDAsIDI4LCA3Mn0sCi17NzMsIDEwLCAxMDAsIDI3LCA3M30sCi17NzQsIDEwLCAxMDAsIDI2LCA3NH0sCi17NzUsIDEwLCAxMDAsIDI1LCA3NX0sCi17NzYsIDEwLCAxMDAsIDI0LCA3Nn0sCi17NzcsIDEwLCAxMDAsIDIzLCA3N30sCi17NzgsIDEwLCAxMDAsIDIyLCA3OH0sCi17NzksIDEwLCAxMDAsIDIxLCA3OX0sCi17ODAsIDEwLCAxMDAsIDIwLCA4MH0sCi17ODEsIDEwLCAxMDAsIDE5LCA4MX0sCi17ODIsIDEwLCAxMDAsIDE4LCA4Mn0sCi17ODMsIDEwLCAxMDAsIDE3LCA4M30sCi17ODQsIDEwLCAxMDAsIDE2LCA4NH0sCi17ODUsIDEwLCAxMDAsIDE1LCA4NX0sCi17ODYsIDEwLCAxMDAsIDE0LCA4Nn0sCi17ODcsIDEwLCAxMDAsIDEzLCA4N30sCi17ODgsIDEwLCAxMDAsIDEyLCA4OH0sCi17ODksIDEwLCAxMDAsIDExLCA4OX0sCi17OTAsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTEsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTMsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTQsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTYsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTcsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAwLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAzLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA2LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA5LCAxMCwgMTAwLCAxMCwgOTB9LAotezExMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEyLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTQsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE1LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTcsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE4LCAxMCwgMTAwLCAxMCwgOTB9LAotezExOSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTI0LCAxMCwgMTAwLCAxMCwgOTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAwLCAxMDAsIDUwLCAxMH0sCi17MSwgMSwgMTAwLCA1MCwgMTB9LAotezIsIDIsIDEwMCwgNTAsIDEwfSwKLXszLCAzLCAxMDAsIDUwLCAxMH0sCi17NCwgNCwgMTAwLCA1MCwgMTB9LAotezUsIDUsIDEwMCwgNTAsIDEwfSwKLXs2LCA2LCAxMDAsIDUwLCAxMH0sCi17NywgNywgMTAwLCA1MCwgMTB9LAotezgsIDgsIDEwMCwgNTAsIDEwfSwKLXs5LCA5LCAxMDAsIDUwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDExLCAxMDAsIDUwLCAxMH0sCi17MTIsIDEyLCAxMDAsIDUwLCAxMH0sCi17MTMsIDEzLCAxMDAsIDUwLCAxMH0sCi17MTQsIDE0LCAxMDAsIDUwLCAxMH0sCi17MTUsIDE1LCAxMDAsIDUwLCAxMH0sCi17MTYsIDE2LCAxMDAsIDUwLCAxMH0sCi17MTcsIDE3LCAxMDAsIDUwLCAxMH0sCi17MTgsIDE4LCAxMDAsIDUwLCAxMH0sCi17MTksIDE5LCAxMDAsIDUwLCAxMH0sCi17MjAsIDIwLCAxMDAsIDUwLCAxMH0sCi17MjEsIDIxLCAxMDAsIDUwLCAxMH0sCi17MjIsIDIyLCAxMDAsIDUwLCAxMH0sCi17MjMsIDIzLCAxMDAsIDUwLCAxMH0sCi17MjQsIDI0LCAxMDAsIDUwLCAxMH0sCi17MjUsIDI1LCAxMDAsIDUwLCAxMH0sCi17MjYsIDI2LCAxMDAsIDUwLCAxMH0sCi17MjcsIDI3LCAxMDAsIDUwLCAxMH0sCi17MjgsIDI4LCAxMDAsIDUwLCAxMH0sCi17MjksIDI5LCAxMDAsIDUwLCAxMH0sCi17MzAsIDMwLCAxMDAsIDUwLCAxMH0sCi17MzEsIDMxLCAxMDAsIDUwLCAxMH0sCi17MzIsIDMyLCAxMDAsIDUwLCAxMH0sCi17MzMsIDMzLCAxMDAsIDUwLCAxMH0sCi17MzQsIDM0LCAxMDAsIDUwLCAxMH0sCi17MzUsIDM1LCAxMDAsIDUwLCAxMH0sCi17MzYsIDM2LCAxMDAsIDUwLCAxMH0sCi17MzcsIDM3LCAxMDAsIDUwLCAxMH0sCi17MzgsIDM4LCAxMDAsIDUwLCAxMH0sCi17MzksIDM5LCAxMDAsIDUwLCAxMH0sCi17NDAsIDQwLCAxMDAsIDUwLCAxMH0sCi17NDEsIDQxLCAxMDAsIDUwLCAxMH0sCi17NDIsIDQyLCAxMDAsIDUwLCAxMH0sCi17NDMsIDQzLCAxMDAsIDUwLCAxMH0sCi17NDQsIDQ0LCAxMDAsIDUwLCAxMH0sCi17NDUsIDQ1LCAxMDAsIDUwLCAxMH0sCi17NDYsIDQ2LCAxMDAsIDUwLCAxMH0sCi17NDcsIDQ3LCAxMDAsIDUwLCAxMH0sCi17NDgsIDQ4LCAxMDAsIDUwLCAxMH0sCi17NDksIDQ5LCAxMDAsIDUwLCAxMH0sCi17NTAsIDUwLCAxMDAsIDUwLCAxMH0sCi17NTEsIDUxLCAxMDAsIDUxLCAxMH0sCi17NTIsIDUyLCAxMDAsIDUyLCAxMH0sCi17NTMsIDUzLCAxMDAsIDUzLCAxMH0sCi17NTQsIDU0LCAxMDAsIDU0LCAxMH0sCi17NTUsIDU1LCAxMDAsIDU1LCAxMH0sCi17NTYsIDU2LCAxMDAsIDU2LCAxMH0sCi17NTcsIDU3LCAxMDAsIDU3LCAxMH0sCi17NTgsIDU4LCAxMDAsIDU4LCAxMH0sCi17NTksIDU5LCAxMDAsIDU5LCAxMH0sCi17NjAsIDYwLCAxMDAsIDYwLCAxMH0sCi17NjEsIDYxLCAxMDAsIDYxLCAxMH0sCi17NjIsIDYyLCAxMDAsIDYyLCAxMH0sCi17NjMsIDYzLCAxMDAsIDYzLCAxMH0sCi17NjQsIDY0LCAxMDAsIDY0LCAxMH0sCi17NjUsIDY1LCAxMDAsIDY1LCAxMH0sCi17NjYsIDY2LCAxMDAsIDY2LCAxMH0sCi17NjcsIDY3LCAxMDAsIDY3LCAxMH0sCi17NjgsIDY4LCAxMDAsIDY4LCAxMH0sCi17NjksIDY5LCAxMDAsIDY5LCAxMH0sCi17NzAsIDcwLCAxMDAsIDcwLCAxMH0sCi17NzEsIDcxLCAxMDAsIDcxLCAxMH0sCi17NzIsIDcyLCAxMDAsIDcyLCAxMH0sCi17NzMsIDczLCAxMDAsIDczLCAxMH0sCi17NzQsIDc0LCAxMDAsIDc0LCAxMH0sCi17NzUsIDc1LCAxMDAsIDc1LCAxMH0sCi17NzYsIDc2LCAxMDAsIDc2LCAxMH0sCi17NzcsIDc3LCAxMDAsIDc3LCAxMH0sCi17NzgsIDc4LCAxMDAsIDc4LCAxMH0sCi17NzksIDc5LCAxMDAsIDc5LCAxMH0sCi17ODAsIDgwLCAxMDAsIDgwLCAxMH0sCi17ODEsIDgxLCAxMDAsIDgxLCAxMH0sCi17ODIsIDgyLCAxMDAsIDgyLCAxMH0sCi17ODMsIDgzLCAxMDAsIDgzLCAxMH0sCi17ODQsIDg0LCAxMDAsIDg0LCAxMH0sCi17ODUsIDg1LCAxMDAsIDg1LCAxMH0sCi17ODYsIDg2LCAxMDAsIDg2LCAxMH0sCi17ODcsIDg3LCAxMDAsIDg3LCAxMH0sCi17ODgsIDg4LCAxMDAsIDg4LCAxMH0sCi17ODksIDg5LCAxMDAsIDg5LCAxMH0sCi17OTAsIDkwLCAxMDAsIDkwLCAxMH0sCi17OTEsIDkxLCAxMDAsIDkxLCA5fSwKLXs5MiwgOTIsIDEwMCwgOTIsIDh9LAotezkzLCA5MywgMTAwLCA5MywgN30sCi17OTQsIDk0LCAxMDAsIDk0LCA2fSwKLXs5NSwgOTUsIDEwMCwgOTUsIDV9LAotezk2LCA5NiwgMTAwLCA5NiwgNH0sCi17OTcsIDk3LCAxMDAsIDk3LCAzfSwKLXs5OCwgOTgsIDEwMCwgOTgsIDJ9LAotezk5LCA5OSwgMTAwLCA5OSwgMX0sCi17MTAwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgMTB9LAotezExMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNYXhpbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MiwgMTAsIDEwMCwgNTAsIDEwfSwKLXszLCAxMCwgMTAwLCA1MCwgMTB9LAotezQsIDEwLCAxMDAsIDUwLCAxMH0sCi17NSwgMTAsIDEwMCwgNTAsIDEwfSwKLXs2LCAxMCwgMTAwLCA1MCwgMTB9LAotezcsIDEwLCAxMDAsIDUwLCAxMH0sCi17OCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTEsIDEwLCAxfSwKLXsxMiwgMTAsIDEyLCAxMCwgMn0sCi17MTMsIDEwLCAxMywgMTAsIDN9LAotezE0LCAxMCwgMTQsIDEwLCA0fSwKLXsxNSwgMTAsIDE1LCAxMCwgNX0sCi17MTYsIDEwLCAxNiwgMTAsIDZ9LAotezE3LCAxMCwgMTcsIDEwLCA3fSwKLXsxOCwgMTAsIDE4LCAxMCwgOH0sCi17MTksIDEwLCAxOSwgMTAsIDl9LAotezIwLCAxMCwgMjAsIDEwLCAxMH0sCi17MjEsIDEwLCAyMSwgMTEsIDEwfSwKLXsyMiwgMTAsIDIyLCAxMiwgMTB9LAotezIzLCAxMCwgMjMsIDEzLCAxMH0sCi17MjQsIDEwLCAyNCwgMTQsIDEwfSwKLXsyNSwgMTAsIDI1LCAxNSwgMTB9LAotezI2LCAxMCwgMjYsIDE2LCAxMH0sCi17MjcsIDEwLCAyNywgMTcsIDEwfSwKLXsyOCwgMTAsIDI4LCAxOCwgMTB9LAotezI5LCAxMCwgMjksIDE5LCAxMH0sCi17MzAsIDEwLCAzMCwgMjAsIDEwfSwKLXszMSwgMTAsIDMxLCAyMSwgMTB9LAotezMyLCAxMCwgMzIsIDIyLCAxMH0sCi17MzMsIDEwLCAzMywgMjMsIDEwfSwKLXszNCwgMTAsIDM0LCAyNCwgMTB9LAotezM1LCAxMCwgMzUsIDI1LCAxMH0sCi17MzYsIDEwLCAzNiwgMjYsIDEwfSwKLXszNywgMTAsIDM3LCAyNywgMTB9LAotezM4LCAxMCwgMzgsIDI4LCAxMH0sCi17MzksIDEwLCAzOSwgMjksIDEwfSwKLXs0MCwgMTAsIDQwLCAzMCwgMTB9LAotezQxLCAxMCwgNDEsIDMxLCAxMH0sCi17NDIsIDEwLCA0MiwgMzIsIDEwfSwKLXs0MywgMTAsIDQzLCAzMywgMTB9LAotezQ0LCAxMCwgNDQsIDM0LCAxMH0sCi17NDUsIDEwLCA0NSwgMzUsIDEwfSwKLXs0NiwgMTAsIDQ2LCAzNiwgMTB9LAotezQ3LCAxMCwgNDcsIDM3LCAxMH0sCi17NDgsIDEwLCA0OCwgMzgsIDEwfSwKLXs0OSwgMTAsIDQ5LCAzOSwgMTB9LAotezUwLCAxMCwgNTAsIDQwLCAxMH0sCi17NTEsIDEwLCA1MSwgNDEsIDEwfSwKLXs1MiwgMTAsIDUyLCA0MiwgMTB9LAotezUzLCAxMCwgNTMsIDQzLCAxMH0sCi17NTQsIDEwLCA1NCwgNDQsIDEwfSwKLXs1NSwgMTAsIDU1LCA0NSwgMTB9LAotezU2LCAxMCwgNTYsIDQ2LCAxMH0sCi17NTcsIDEwLCA1NywgNDcsIDEwfSwKLXs1OCwgMTAsIDU4LCA0OCwgMTB9LAotezU5LCAxMCwgNTksIDQ5LCAxMH0sCi17NjAsIDEwLCA2MCwgNTAsIDEwfSwKLXs2MSwgMTAsIDYxLCA1MCwgMTB9LAotezYyLCAxMCwgNjIsIDUwLCAxMH0sCi17NjMsIDEwLCA2MywgNTAsIDEwfSwKLXs2NCwgMTAsIDY0LCA1MCwgMTB9LAotezY1LCAxMCwgNjUsIDUwLCAxMH0sCi17NjYsIDEwLCA2NiwgNTAsIDEwfSwKLXs2NywgMTAsIDY3LCA1MCwgMTB9LAotezY4LCAxMCwgNjgsIDUwLCAxMH0sCi17NjksIDEwLCA2OSwgNTAsIDEwfSwKLXs3MCwgMTAsIDcwLCA1MCwgMTB9LAotezcxLCAxMCwgNzEsIDUwLCAxMH0sCi17NzIsIDEwLCA3MiwgNTAsIDEwfSwKLXs3MywgMTAsIDczLCA1MCwgMTB9LAotezc0LCAxMCwgNzQsIDUwLCAxMH0sCi17NzUsIDEwLCA3NSwgNTAsIDEwfSwKLXs3NiwgMTAsIDc2LCA1MCwgMTB9LAotezc3LCAxMCwgNzcsIDUwLCAxMH0sCi17NzgsIDEwLCA3OCwgNTAsIDEwfSwKLXs3OSwgMTAsIDc5LCA1MCwgMTB9LAotezgwLCAxMCwgODAsIDUwLCAxMH0sCi17ODEsIDEwLCA4MSwgNTAsIDEwfSwKLXs4MiwgMTAsIDgyLCA1MCwgMTB9LAotezgzLCAxMCwgODMsIDUwLCAxMH0sCi17ODQsIDEwLCA4NCwgNTAsIDEwfSwKLXs4NSwgMTAsIDg1LCA1MCwgMTB9LAotezg2LCAxMCwgODYsIDUwLCAxMH0sCi17ODcsIDEwLCA4NywgNTAsIDEwfSwKLXs4OCwgMTAsIDg4LCA1MCwgMTB9LAotezg5LCAxMCwgODksIDUwLCAxMH0sCi17OTAsIDEwLCA5MCwgNTAsIDEwfSwKLXs5MSwgMTAsIDkxLCA1MCwgMTB9LAotezkyLCAxMCwgOTIsIDUwLCAxMH0sCi17OTMsIDEwLCA5MywgNTAsIDEwfSwKLXs5NCwgMTAsIDk0LCA1MCwgMTB9LAotezk1LCAxMCwgOTUsIDUwLCAxMH0sCi17OTYsIDEwLCA5NiwgNTAsIDEwfSwKLXs5NywgMTAsIDk3LCA1MCwgMTB9LAotezk4LCAxMCwgOTgsIDUwLCAxMH0sCi17OTksIDEwLCA5OSwgNTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMiwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgMTB9LAotezEwNSwgMTAsIDEwNSwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgMTB9LAotezEwOCwgMTAsIDEwOCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDksIDUwLCAxMH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgMTB9LAotezExMSwgMTAsIDExMSwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgMTB9LAotezExNCwgMTAsIDExNCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgMTB9LAotezExNywgMTAsIDExNywgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgMTB9LAotezEyMCwgMTAsIDEyMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgMTB9LAotezEyMywgMTAsIDEyMywgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXNjcm9sbEJhci5zZXRNYXhpbXVtKDEwMCk7Ci0Jc2Nyb2xsQmFyLnNldE1pbmltdW0oMTApOwotCXNjcm9sbEJhci5zZXRUaHVtYigxMCk7Ci0Jc2Nyb2xsQmFyLnNldFNlbGVjdGlvbig1MCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMywgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTExLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNywgMTAsIDEwMCwgMTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMywgMTAsIDEwMCwgMTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXswLCAxMCwgMTAwLCAxMCwgMTB9LAotezEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MiwgMTAsIDEwMCwgMTAsIDEwfSwKLXszLCAxMCwgMTAwLCAxMCwgMTB9LAotezQsIDEwLCAxMDAsIDEwLCAxMH0sCi17NSwgMTAsIDEwMCwgMTAsIDEwfSwKLXs2LCAxMCwgMTAwLCAxMCwgMTB9LAotezcsIDEwLCAxMDAsIDEwLCAxMH0sCi17OCwgMTAsIDEwMCwgMTAsIDEwfSwKLXs5LCAxMCwgMTAwLCAxMCwgMTB9LAotezEwLCAxMCwgMTAwLCAxMCwgMTB9LAotezExLCAxMCwgMTAwLCAxMSwgMTB9LAotezEyLCAxMCwgMTAwLCAxMiwgMTB9LAotezEzLCAxMCwgMTAwLCAxMywgMTB9LAotezE0LCAxMCwgMTAwLCAxNCwgMTB9LAotezE1LCAxMCwgMTAwLCAxNSwgMTB9LAotezE2LCAxMCwgMTAwLCAxNiwgMTB9LAotezE3LCAxMCwgMTAwLCAxNywgMTB9LAotezE4LCAxMCwgMTAwLCAxOCwgMTB9LAotezE5LCAxMCwgMTAwLCAxOSwgMTB9LAotezIwLCAxMCwgMTAwLCAyMCwgMTB9LAotezIxLCAxMCwgMTAwLCAyMSwgMTB9LAotezIyLCAxMCwgMTAwLCAyMiwgMTB9LAotezIzLCAxMCwgMTAwLCAyMywgMTB9LAotezI0LCAxMCwgMTAwLCAyNCwgMTB9LAotezI1LCAxMCwgMTAwLCAyNSwgMTB9LAotezI2LCAxMCwgMTAwLCAyNiwgMTB9LAotezI3LCAxMCwgMTAwLCAyNywgMTB9LAotezI4LCAxMCwgMTAwLCAyOCwgMTB9LAotezI5LCAxMCwgMTAwLCAyOSwgMTB9LAotezMwLCAxMCwgMTAwLCAzMCwgMTB9LAotezMxLCAxMCwgMTAwLCAzMSwgMTB9LAotezMyLCAxMCwgMTAwLCAzMiwgMTB9LAotezMzLCAxMCwgMTAwLCAzMywgMTB9LAotezM0LCAxMCwgMTAwLCAzNCwgMTB9LAotezM1LCAxMCwgMTAwLCAzNSwgMTB9LAotezM2LCAxMCwgMTAwLCAzNiwgMTB9LAotezM3LCAxMCwgMTAwLCAzNywgMTB9LAotezM4LCAxMCwgMTAwLCAzOCwgMTB9LAotezM5LCAxMCwgMTAwLCAzOSwgMTB9LAotezQwLCAxMCwgMTAwLCA0MCwgMTB9LAotezQxLCAxMCwgMTAwLCA0MSwgMTB9LAotezQyLCAxMCwgMTAwLCA0MiwgMTB9LAotezQzLCAxMCwgMTAwLCA0MywgMTB9LAotezQ0LCAxMCwgMTAwLCA0NCwgMTB9LAotezQ1LCAxMCwgMTAwLCA0NSwgMTB9LAotezQ2LCAxMCwgMTAwLCA0NiwgMTB9LAotezQ3LCAxMCwgMTAwLCA0NywgMTB9LAotezQ4LCAxMCwgMTAwLCA0OCwgMTB9LAotezQ5LCAxMCwgMTAwLCA0OSwgMTB9LAotezUwLCAxMCwgMTAwLCA1MCwgMTB9LAotezUxLCAxMCwgMTAwLCA1MSwgMTB9LAotezUyLCAxMCwgMTAwLCA1MiwgMTB9LAotezUzLCAxMCwgMTAwLCA1MywgMTB9LAotezU0LCAxMCwgMTAwLCA1NCwgMTB9LAotezU1LCAxMCwgMTAwLCA1NSwgMTB9LAotezU2LCAxMCwgMTAwLCA1NiwgMTB9LAotezU3LCAxMCwgMTAwLCA1NywgMTB9LAotezU4LCAxMCwgMTAwLCA1OCwgMTB9LAotezU5LCAxMCwgMTAwLCA1OSwgMTB9LAotezYwLCAxMCwgMTAwLCA2MCwgMTB9LAotezYxLCAxMCwgMTAwLCA2MSwgMTB9LAotezYyLCAxMCwgMTAwLCA2MiwgMTB9LAotezYzLCAxMCwgMTAwLCA2MywgMTB9LAotezY0LCAxMCwgMTAwLCA2NCwgMTB9LAotezY1LCAxMCwgMTAwLCA2NSwgMTB9LAotezY2LCAxMCwgMTAwLCA2NiwgMTB9LAotezY3LCAxMCwgMTAwLCA2NywgMTB9LAotezY4LCAxMCwgMTAwLCA2OCwgMTB9LAotezY5LCAxMCwgMTAwLCA2OSwgMTB9LAotezcwLCAxMCwgMTAwLCA3MCwgMTB9LAotezcxLCAxMCwgMTAwLCA3MSwgMTB9LAotezcyLCAxMCwgMTAwLCA3MiwgMTB9LAotezczLCAxMCwgMTAwLCA3MywgMTB9LAotezc0LCAxMCwgMTAwLCA3NCwgMTB9LAotezc1LCAxMCwgMTAwLCA3NSwgMTB9LAotezc2LCAxMCwgMTAwLCA3NiwgMTB9LAotezc3LCAxMCwgMTAwLCA3NywgMTB9LAotezc4LCAxMCwgMTAwLCA3OCwgMTB9LAotezc5LCAxMCwgMTAwLCA3OSwgMTB9LAotezgwLCAxMCwgMTAwLCA4MCwgMTB9LAotezgxLCAxMCwgMTAwLCA4MSwgMTB9LAotezgyLCAxMCwgMTAwLCA4MiwgMTB9LAotezgzLCAxMCwgMTAwLCA4MywgMTB9LAotezg0LCAxMCwgMTAwLCA4NCwgMTB9LAotezg1LCAxMCwgMTAwLCA4NSwgMTB9LAotezg2LCAxMCwgMTAwLCA4NiwgMTB9LAotezg3LCAxMCwgMTAwLCA4NywgMTB9LAotezg4LCAxMCwgMTAwLCA4OCwgMTB9LAotezg5LCAxMCwgMTAwLCA4OSwgMTB9LAotezkwLCAxMCwgMTAwLCA5MCwgMTB9LAotezkxLCAxMCwgMTAwLCA5MCwgMTB9LAotezkyLCAxMCwgMTAwLCA5MCwgMTB9LAotezkzLCAxMCwgMTAwLCA5MCwgMTB9LAotezk0LCAxMCwgMTAwLCA5MCwgMTB9LAotezk1LCAxMCwgMTAwLCA5MCwgMTB9LAotezk2LCAxMCwgMTAwLCA5MCwgMTB9LAotezk3LCAxMCwgMTAwLCA5MCwgMTB9LAotezk4LCAxMCwgMTAwLCA5MCwgMTB9LAotezk5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDQsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA1LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDcsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA4LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTExLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE0LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE3LCAxMCwgMTAwLCA5MCwgMTB9LAotezExOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIwLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIzLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyNCwgMTAsIDEwMCwgOTAsIDEwfSwKLX07Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlYjJlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbGFibGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbGFibGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXNjcm9sbGFibGUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlzY3JvbGxhYmxlLmdldENsaWVudEFyZWEoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3Jpem9udGFsQmFyKCkgewotCVNjcm9sbEJhciBoYmFyID0gc2Nyb2xsYWJsZS5nZXRIb3Jpem9udGFsQmFyKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVydGljYWxCYXIoKSB7Ci0JU2Nyb2xsQmFyIHZiYXIgPSBzY3JvbGxhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG9yaXpvbnRhbEJhciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmVydGljYWxCYXIiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvcml6b250YWxCYXIiKSkgdGVzdF9nZXRIb3Jpem9udGFsQmFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWZXJ0aWNhbEJhciIpKSB0ZXN0X2dldFZlcnRpY2FsQmFyKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCVNjcm9sbGFibGUgc2Nyb2xsYWJsZTsKLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0Jc2Nyb2xsYWJsZSA9IChTY3JvbGxhYmxlKXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZGJkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdGVzdFNoZWxsID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHNoZWxsKTsKLQlhc3NlcnRUcnVlKHRlc3RTaGVsbC5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlhc3NlcnROb3ROdWxsKCJhOiAiLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JLyogdGhpcyBzaG91bGQgdGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBTVFlMRSBiaXRzLCBmb3Igbm93IGp1c3QgdGVzdCBpbmRpdmlkdWFsIGJpdHMgKi8KLQlpbnRbXSBjYXNlcyA9IHtTV1QuTk9fVFJJTSwgU1dULlJFU0laRSwgU1dULlRJVExFLCBTV1QuQ0xPU0UsIFNXVC5NRU5VLCBTV1QuTUlOLCBTV1QuQk9SREVSLCAKLQkJCQkgICBTV1QuQ0xJUF9DSElMRFJFTiwgU1dULkNMSVBfU0lCTElOR1MsIFNXVC5PTl9UT1AsIFNXVC5GTEFULCBTV1QuU01PT1RIfTsKLQlTaGVsbCBuZXdTaGVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ld1NoZWxsID0gbmV3IFNoZWxsKGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiYSAiICtpLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkgPT0gc2hlbGwuZ2V0RGlzcGxheSgpKTsKLQkJbmV3U2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlhc3NlcnRUcnVlKCJhOiAiLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkgPT0gZGlzcGxheSk7Ci0JbmV3U2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCkgewotCWludFtdIGNhc2VzID0ge1NXVC5OT19UUklNLCBTV1QuUkVTSVpFLCBTV1QuVElUTEUsIFNXVC5DTE9TRSwgU1dULk1FTlUsIFNXVC5NSU4sIFNXVC5CT1JERVIsIAotCQkJCSAgIFNXVC5DTElQX0NISUxEUkVOLCBTV1QuQ0xJUF9TSUJMSU5HUywgU1dULk9OX1RPUCwgU1dULkZMQVQsIFNXVC5TTU9PVEh9OwotCVNoZWxsIG5ld1NoZWxsOwotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ld1NoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiYSAiICtpLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkgPT0gc2hlbGwuZ2V0RGlzcGxheSgpKTsKLQkJbmV3U2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiYTogIiwgbmV3U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JLyogdGhpcyBzaG91bGQgdGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBTVFlMRSBiaXRzLCBmb3Igbm93IGp1c3QgdGVzdCBpbmRpdmlkdWFsIGJpdHMgKi8KLQlpbnRbXSBjYXNlcyA9IHtTV1QuTk9fVFJJTSwgU1dULlJFU0laRSwgU1dULlRJVExFLCBTV1QuQ0xPU0UsIFNXVC5NRU5VLCBTV1QuTUlOLCBTV1QuQk9SREVSLCAKLQkJCQkgICBTV1QuQ0xJUF9DSElMRFJFTiwgU1dULkNMSVBfU0lCTElOR1MsIFNXVC5PTl9UT1AsIFNXVC5GTEFULCBTV1QuU01PT1RIfTsKLQlTaGVsbCBuZXdTaGVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ld1NoZWxsID0gbmV3IFNoZWxsKHNoZWxsLCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImEgIiAraSwgbmV3U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotCQluZXdTaGVsbC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTaGVsbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNoZWxsTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsRGVhY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hlbGxEZWljb25pZmllZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbEljb25pZmllZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobGlzdGVuZXIpOwotCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0JLyogY2FuJ3QgYXNzdW1lIGxpc3RlbmVyIGlzIHN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gZm9yY2VBY3RpdmUgcmV0dXJuZWQgKi8KLQkvKiBhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSB0cnVlKTsgKi8KLQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXNoZWxsLnJlbW92ZVNoZWxsTGlzdGVuZXIobGlzdGVuZXIpOwotCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0JLyogY2FuJ3QgYXNzdW1lIGxpc3RlbmVyIGlzIHN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gZm9yY2VBY3RpdmUgcmV0dXJuZWQgKi8KLQkvKiBhc3NlcnRUcnVlKCI6YjoiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7ICovCi0JdHJ5IHsKLQkJc2hlbGwucmVtb3ZlU2hlbGxMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCi0JLy8gYm9ndXMgbGluZSB0aGF0ICdlbmFibGVkJyBncGZzCi0JLy8JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoKTsKLQl0ZXN0U2hlbGwuc2V0Qm91bmRzKDIwLDMwLDIwMCwgMjAwKTsKLQl0ZXN0U2hlbGwub3BlbigpOwotCXRlc3RTaGVsbC5jbG9zZSgpOwotCXNoZWxsLnNldEJvdW5kcygyMCwzMCwyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoKTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9yY2VBY3RpdmUoKSB7Ci0Jc2hlbGwuZm9yY2VBY3RpdmUoKTsKLQkvKiBjYW4ndCBhc3N1bWUgbGlzdGVuZXIgaXMgc3luY2hyb25vdXNseSBjYWxsZWQgd2hlbiBmb3JjZUFjdGl2ZSByZXR1cm5lZCAqLwotCS8qIGFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsgKi8KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Qm91bmRzSUlJSSBhbmQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmEwOiIsIHNoZWxsLmdldEVuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgIXNoZWxsLmdldEVuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltZUlucHV0TW9kZSgpIHsKLQlpbnQgbW9kZSA9IHNoZWxsLmdldEltZUlucHV0TW9kZSgpOwotCWFzc2VydFRydWUoIjphOiIsIG1vZGUgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0Jc2hlbGwuc2V0TG9jYXRpb24oMTAsMTUpOwotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldExvY2F0aW9uKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGwuZ2V0TG9jYXRpb24oKS55ID09IDE1KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZWdpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UmVnaW9uKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRTaGVsbCgpPT1zaGVsbCk7Ci0JU2hlbGwgc2hlbGxfMSA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGxfMS5nZXRTaGVsbCgpPT0gc2hlbGxfMSk7Ci0Jc2hlbGxfMS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGxzKCkgewotCWludCBudW0gPSBzaGVsbC5nZXRTaGVsbHMoKS5sZW5ndGg7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbnVtID09IDEpOwotCVNoZWxsIHNoZWxsXzEgPSBuZXcgU2hlbGwoc2hlbGwpOwotCW51bSA9IHNoZWxsLmdldFNoZWxscygpLmxlbmd0aDsKLQlhc3NlcnRUcnVlKCI6YToiLCBudW0gPT0gMik7Ci0Jc2hlbGxfMS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmlzRW5hYmxlZCgpKTsKLQlzaGVsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCAhc2hlbGwuaXNFbmFibGVkKCkpOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykKLQkJYXNzZXJ0VHJ1ZSgiOmIxOiIsICF0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2hlbGwuaXNFbmFibGVkKCkpOwotCWFzc2VydFRydWUoIjphOiIsIHRlc3RTaGVsbC5pc0VuYWJsZWQoKSk7Ci0JdGVzdFNoZWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsICF0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotCXRlc3RTaGVsbC5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpjOiIsIHRlc3RTaGVsbC5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gcmVtb3ZlU2hlbGxMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBY3RpdmUoKSB7Ci0JLyogQ3JlYXRlIHNoZWxsMiBhbmQgbWFrZSBpdCBhY3RpdmUuICovCi0JU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKCk7Ci0Jc2hlbGwyLm9wZW4oKTsKLQkKLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3IgdmlzaWJsZSBzaGVsbC4gKi8KLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCXNoZWxsLnNldEFjdGl2ZSgpOwotCWFzc2VydFRydWUoInZpc2libGUgc2hlbGwgd2FzIG5vdCBtYWRlIGFjdGl2ZSIsIHNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsKLQkKLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3IgdmlzaWJsZSBkaWFsb2cgc2hlbGwuICovCi0Jc2hlbGwyLnNldEFjdGl2ZSgpOwotCXRlc3RTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCXRlc3RTaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJ2aXNpYmxlIGRpYWxvZyBzaGVsbCB3YXMgbm90IG1hZGUgYWN0aXZlIiwgdGVzdFNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IHRlc3RTaGVsbCk7Ci0JCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIG5vbi12aXNpYmxlIHNoZWxsLiAqLwotCXNoZWxsMi5zZXRBY3RpdmUoKTsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlzaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJub24tdmlzaWJsZSBzaGVsbCB3YXMgbWFkZSBhY3RpdmUiLCBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSAhPSBzaGVsbCk7Ci0KLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3Igbm9uLXZpc2libGUgZGlhbG9nIHNoZWxsLiAqLwotCXNoZWxsMi5zZXRBY3RpdmUoKTsKLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JdGVzdFNoZWxsLnNldEFjdGl2ZSgpOwotCWFzc2VydFRydWUoIm5vbi12aXNpYmxlIGRpYWxvZyBzaGVsbCB3YXMgbWFkZSBhY3RpdmUiLCB0ZXN0U2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgIT0gdGVzdFNoZWxsKTsKLQkKLQlzaGVsbDIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCS8vIHRlc3RlZCBpbiBnZXRFbmFibGVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltZUlucHV0TW9kZUkoKSB7Ci0Jc2hlbGwuc2V0SW1lSW5wdXRNb2RlKFNXVC5OT05FKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRJbWVJbnB1dE1vZGUoKSA9PSBTV1QuTk9ORSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgIXNoZWxsLmlzVmlzaWJsZSgpKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmlzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQkvL3RoZXNlIG11c3QgYmUgcnVuIGJlZm9yZSB0aGUgc2hlbGwgdGVzdHMgYmVjYXVzZSBvZiBwciA3OTUwNAotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2xvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X09wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JCi0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb3JjZUFjdGl2ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWVJbnB1dE1vZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFjdGl2ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltZUlucHV0TW9kZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKSkgdGVzdF9hZGRTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2UiKSkgdGVzdF9jbG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvcmNlQWN0aXZlIikpIHRlc3RfZm9yY2VBY3RpdmUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltZUlucHV0TW9kZSIpKSB0ZXN0X2dldEltZUlucHV0TW9kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVnaW9uIikpIHRlc3RfZ2V0UmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbCIpKSB0ZXN0X2dldFNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbHMiKSkgdGVzdF9nZXRTaGVsbHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFjdGl2ZSIpKSB0ZXN0X3NldEFjdGl2ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1lSW5wdXRNb2RlSSIpKSB0ZXN0X3NldEltZUlucHV0TW9kZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSIpKSB0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlIikpIHRlc3RfY29uc2lzdGVuY3lfQ2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UiKSkgdGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9PcGVuIikpIHRlc3RfY29uc2lzdGVuY3lfT3BlbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50ICgpIHsKLQkvLyBvdmVycmlkaW5nIENvbnRyb2wudGVzdF9nZXRQYXJlbnQKLQlhc3NlcnRUcnVlKHNoZWxsLmdldFBhcmVudCgpPT1udWxsKTsKLQlhc3NlcnRUcnVlKHRlc3RTaGVsbC5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0JLy8gb3ZlcnJpZGluZyBXaWRnZXQudGVzdF9nZXRTdHlsZQotCWFzc2VydFRydWUoInRlc3RTaGVsbCBub3QgbW9kZWxlc3MiLCAodGVzdFNoZWxsLmdldFN0eWxlICgpICYgU1dULk1PREVMRVNTKSA9PSBTV1QuTU9ERUxFU1MpOwotCWludFtdIGNhc2VzID0ge1NXVC5NT0RFTEVTUywgU1dULlBSSU1BUllfTU9EQUwsIFNXVC5BUFBMSUNBVElPTl9NT0RBTCwgU1dULlNZU1RFTV9NT0RBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlTaGVsbCB0ZXN0U2hlbGwyID0gbmV3IFNoZWxsKHNoZWxsLCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoInNoZWxsICIgKyBpLCAodGVzdFNoZWxsMi5nZXRTdHlsZSAoKSAmIGNhc2VzW2ldKSA9PSBjYXNlc1tpXSk7Ci0JCXRlc3RTaGVsbDIuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JLy8gb3ZlcnJpZGluZyBDb250cm9sLnRlc3RfaXNWaXNpYmxlCi0JdGVzdFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0ZXN0U2hlbGwuaXNWaXNpYmxlKCkpOwotCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5pc1Zpc2libGUoKSk7Ci0KLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoInNoZWxsLmlzVmlzaWJsZSgpIGE6Iiwgc2hlbGwuaXNWaXNpYmxlKCkpOwotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoInNoZWxsLmlzVmlzaWJsZSgpIGI6IiwgIXNoZWxsLmlzVmlzaWJsZSgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpCi0JCWFzc2VydFRydWUoInRlc3RTaGVsbC5pc1Zpc2libGUoKSBjOiIsICF0ZXN0U2hlbGwuaXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0lJSUkoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBTaGVsbHMgaGF2ZSBhIG1pbmltdW0gc2l6ZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgU2hlbGxzIGhhdmUgYSBtaW5pbXVtIHNpemUKLS8vCS8qIHdpbmRvd3MgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0vLwlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0vLwkJUG9pbnQgcDEgPSBuZXcgUG9pbnQoMTEyLCAyNyk7Ci0vLwkJUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgyMCwgMzAsIHAxLngsIHAxLnkpOwotLy8JCVJlY3RhbmdsZSByMjsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKLS8vCQkJdGVzdFNoZWxsLnNldEJvdW5kcyhyMSk7Ci0vLwkJCXIyID0gdGVzdFNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoImNoaWxkIHNoZWxsIGl0ZXJhdGlvbiAiICsgaSArICIgc2V0PSIgKyByMSArICIgZ2V0PSIgKyByMiwgcjEuZXF1YWxzKHIyKSk7Ci0vLwkJCXIxLndpZHRoICs9IDEwMDsKLS8vCQkJcjEuaGVpZ2h0ICs9IDEwMDsKLS8vCQl9Ci0vLwkJcjEgPSBuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgcDEueCwgcDEueSk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0vLwkJCXNoZWxsLnNldEJvdW5kcyhyMSk7Ci0vLwkJCXIyID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0vLwkJCWFzc2VydCgicGFyZW50IHNoZWxsIGl0ZXJhdGlvbiAiICsgaSArICIgc2V0PSIgKyByMSArICIgZ2V0PSIgKyByMiwgcjEuZXF1YWxzKHIyKSk7Ci0vLwkJCXIxLndpZHRoICs9IDEwMDsKLS8vCQkJcjEuaGVpZ2h0ICs9IDEwMDsKLS8vCQl9Ci0vLwl9Ci0vLwkvKiBtb3RpZiAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCAxMTIgb3IgcDEueSA8IDI3ICovCi0vLwkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLS8vCWlmIChTd3RKdW5pdC5pc01vdGlmKSB7Ci0vLwkJUG9pbnQgcDEgPSBuZXcgUG9pbnQoMTUsMzUpOwotLy8JCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMjAsIDMwLCBwMS54LCBwMS55KTsKLS8vCQlSZWN0YW5nbGUgcjI7Ci0vLwkJCi0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0vLwkJCXRlc3RTaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHRlc3RTaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJjaGlsZCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JCXIxID0gbmV3IFJlY3RhbmdsZSg1MCwgNTAsIHAxLngsIHAxLnkpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgewotLy8JCQlzaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoInBhcmVudCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JfQotfQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWdpb24oKSB7Ci0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlyZWdpb24uYWRkKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAxMDAsIDIwMCkpOwotCS8vIHRlc3Qgc2hlbGwgd2l0aG91dCBzdHlsZSBTV1QuTk9fVFJJTQotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldFJlZ2lvbigpID09IG51bGwpOwotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmdldFJlZ2lvbigpID09IG51bGwpOwotCXNoZWxsLnNldFJlZ2lvbihudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzaGVsbC5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQkvLyB0ZXN0IHNoZWxsIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzaGVsbDIuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci0Jc2hlbGwyLnNldFJlZ2lvbihyZWdpb24pOwotCWFzc2VydFRydWUoIjplOiIsIHNoZWxsMi5nZXRSZWdpb24oKS5oYW5kbGUgPT0gcmVnaW9uLmhhbmRsZSk7Ci0JcmVnaW9uLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzaGVsbDIuZ2V0UmVnaW9uKCkuaXNEaXNwb3NlZCgpKTsKLQlzaGVsbDIuc2V0UmVnaW9uKG51bGwpOwotCWFzc2VydFRydWUoIjpnOiIsIHNoZWxsMi5nZXRSZWdpb24oKSA9PSBudWxsKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUlJKCkgewotCS8qIHdpbmRvd3MgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCVBvaW50IG5ld1NpemUgPSBuZXcgUG9pbnQoMTEyLCAyNyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54ICs9IDEwMDsKLQkJCW5ld1NpemUueSArPSAxMDA7Ci0JCX0KLQkJbmV3U2l6ZSA9IG5ldyBQb2ludCgxMjkyLCAxMDM2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplLngsIG5ld1NpemUueSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLQkKLQkvKiBtb3RpZiAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgPz8gb3IgcDEueSA8ID8/ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiA/PyBvciBwMS55ID4gPz8gKi8KLQlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDIsIDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTYwMCwgMTYwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JLyogd2luZG93cyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gMTI5MiBvciBwMS55ID4gMTAzNiAqLwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgxMTIsIDI3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTI5MiwgMTAzNik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLQkKLQkvKiBtb3RpZiAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgPz8gb3IgcDEueSA8ID8/ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiA/PyBvciBwMS55ID4gPz8gKi8KLQlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDIsIDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54ICs9IDEwMDsKLQkJCW5ld1NpemUueSArPSAxMDA7Ci0JCX0KLQkJbmV3U2l6ZSA9IG5ldyBQb2ludCgxNjAwLCAxNjAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCAtPSAxMDA7Ci0JCQluZXdTaXplLnkgLT0gMTAwOwotCQl9Ci0JfQotfQotCi1TaGVsbCB0ZXN0U2hlbGw7Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVTaGVsbCgpIHsKLSAgICB0ZWFyRG93bigpOwotICAgIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0gICAgdGVzdFNoZWxsID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuTUlOKTsKLQl0ZXN0U2hlbGwuc2V0U2l6ZSgxMDAsMzAwKTsKLQl0ZXN0U2hlbGwuc2V0VGV4dCgiU2hlbGwiKTsKLSAgICB0ZXN0U2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIHNldFdpZGdldCh0ZXN0U2hlbGwpOwotICAgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfT3BlbigpIHsKLQlpZiAoZlRlc3RDb25zaXN0ZW5jeSkgewotCSAgICBjcmVhdGVTaGVsbCgpOwotCSAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIFN0cmluZ1tdIHRlbXAgPSBob29rRXhwZWN0ZWRFdmVudHModGVzdFNoZWxsLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCSAgICBzaGVsbC5wYWNrKCk7Ci0JICAgIHNoZWxsLm9wZW4oKTsKLQkgICAgdGVzdFNoZWxsLnBhY2soKTsKLQkgICAgdGVzdFNoZWxsLm9wZW4oKTsKLQkgICAgbmV3IFRocmVhZCgpIHsKLQkgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgVGhyZWFkKCkgewotCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJICAgIH0KLQkJCQl9KTsKLQkgICAgfX0uc3RhcnQoKTsKLQkKLQkgICAgd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCSAgICAgICAgaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkgICAgfQotCSAgICBzZXRVcCgpOyAgICAgICAgCi0JICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2V2ZW50cy5zaXplKCldOwotCSAgICBldmVudHMuY29weUludG8ocmVzdWx0cyk7Ci0JICAgIGFzc2VydEVxdWFscyhnZXRUZXN0TmFtZSgpICsgIiBldmVudCBvcmRlcmluZyIsIHRlbXAsIHJlc3VsdHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9JY29uaWZ5KCkgewotICAgIGNyZWF0ZVNoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxLCAwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuU0hFTExfSUNPTklGWSwgbnVsbCwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlKCkgewotICAgIGNyZWF0ZVNoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBpZighU3d0SnVuaXQuaXNDYXJib24pCi0gICAgICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFMVCwgMCwgU1dULkY0LCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUyk7Ci0gICAgZWxzZQotICAgICAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICBjcmVhdGVTaGVsbCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UoKSB7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLQotICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHRlc3RTaGVsbCwgU1dULlBVU0gpOwotICAgIGJ1dHRvbi5zZXRUZXh0KCJkaXNwb3NlIik7Ci0gICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLSAgICAgICAgICAgIGJ1dHRvbi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB0ZXN0U2hlbGwuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCh0ZXN0U2hlbGwpOwotICAgIFBvaW50IHB0ID0gYnV0dG9uLmdldExvY2F0aW9uKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwdC54LCBwdC55LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1ZmE2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2xpZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TbGlkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzbGlkZXIgPSBuZXcgU2xpZGVyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoc2xpZGVyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXByb3RlY3RlZCBTdHJpbmcgdmFsdWVTdHJpbmcoaW50W10gaW50QXJyYXkpIHsKLQlyZXR1cm4gIiAoIitpbnRBcnJheVsxXSsiLCIraW50QXJyYXlbMl0rIiwiK2ludEFycmF5WzNdKyIsIitpbnRBcnJheVs0XSsiKSI7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlzbGlkZXIgPSBuZXcgU2xpZGVyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlzbGlkZXIgPSBuZXcgU2xpZGVyKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXNsaWRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCXNsaWRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc2xpZGVyLnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0Jc2xpZGVyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0cnkgewotCQlzbGlkZXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyBtZXRob2Qgc3VmZmljaWVudCB0ZXN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmNyZW1lbnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCSAgc2xpZGVyLnNldEluY3JlbWVudChjYXNlc1tpXSk7Ci0JICBhc3NlcnRUcnVlKCJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIHNsaWRlci5nZXRJbmNyZW1lbnQoKT09Y2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQlzbGlkZXIuc2V0TWF4aW11bSgyMDAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwMDApOwotCXNsaWRlci5zZXRNYXhpbXVtKDIwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWF4aW11bSgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jc2xpZGVyLnNldE1pbmltdW0oNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSA1KTsKLQlzbGlkZXIuc2V0TWluaW11bSgyMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNaW5pbXVtKDApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oMTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCSAgc2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoY2FzZXNbaV0pOwotCSAgYXNzZXJ0VHJ1ZSgiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpPT1jYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0Jc2xpZGVyLnNldFNlbGVjdGlvbigxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldFNlbGVjdGlvbigpPT0gMTApOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRodW1iKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRodW1iKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0Jc2xpZGVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzbGlkZXIuZ2V0RW5hYmxlZCgpKTsKLQlzbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKHNsaWRlci5nZXRFbmFibGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbmNyZW1lbnRJKCkgewotCS8vIHRlc3RlZCBpbiBnZXRJbmNyZW1lbnQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWF4aW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWF4ICIraW50QXJyYXlbMF0rIHZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzbGlkZXIuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNaW4gIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKSB7Ci0JIHNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDMpOwotCSBhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpPT0gMyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRTZWwgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUaHVtYkkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0VGh1bWJWYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNsaWRlci5zZXRUaHVtYihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRUaG1iICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCkgewotCXNsaWRlci5zZXRWYWx1ZXMoMTAsIDEwLCA1MCwgMiwgNSwgMTApOwotCWFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRTZWxlY3Rpb24oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSA1MCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldFRodW1iKCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc2xpZGVyLmdldEluY3JlbWVudCgpID09IDUpOwotCWFzc2VydFRydWUoIjpmOiIsIHNsaWRlci5nZXRQYWdlSW5jcmVtZW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYWdlSW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRodW1iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGh1bWJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWYWx1ZXNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRodW1iIikpIHRlc3RfZ2V0VGh1bWIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRodW1iSSIpKSB0ZXN0X3NldFRodW1iSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIikpIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9BcnJvd1NlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQotCS8vIHRvIHNldCB0aGUgZm9udCBvZiBhIFNsaWRlci4KLX0KLQotU2xpZGVyIHNsaWRlcjsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQkvLyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgYW5kIGNvbW1lbnQgb3V0IGNhbGwgdG8gY2hlY2soKSBpZiB5b3Ugd2FudCB0aGUgdGVzdCB0byByZXBvcnQgYWxsIGVycm9ycyB3aXRob3V0Ci0JLy8gc3RvcHBpbmcuCi0vLwlpZiAoc2xpZGVyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1pbmltdW0gRXhwZWN0ZWQ6ICIgKyBtaW5FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRNaW5pbXVtKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1heGltdW0gRXhwZWN0ZWQ6ICIgKyBtYXhFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRNYXhpbXVtKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldFNlbGVjdGlvbigpKTsKLS8vCX0KLS8vCWlmIChzbGlkZXIuZ2V0VGh1bWIoKSAhPSB0aHVtYkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogVGh1bWIgRXhwZWN0ZWQ6ICIgKyB0aHVtYkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldFRodW1iKCkpOwotLy8JfQotCWNoZWNrKGNhbGwsIG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQsIHRodW1iRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKFN0cmluZyBjYWxsLCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCWFzc2VydEVxdWFscyhjYWxsKyIgbWF4ICIsIG1heEV4cGVjdGVkLCBzbGlkZXIuZ2V0TWF4aW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1pbiAiLCBtaW5FeHBlY3RlZCwgc2xpZGVyLmdldE1pbmltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBzZWwgIiwgc2VsZWN0aW9uRXhwZWN0ZWQsIHNsaWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiB0aG1iICIsIHRodW1iRXhwZWN0ZWQsIHNsaWRlci5nZXRUaHVtYigpKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRUaHVtYlZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMX0sCi17MiwgMTAsIDEwMCwgNTAsIDJ9LAotezMsIDEwLCAxMDAsIDUwLCAzfSwKLXs0LCAxMCwgMTAwLCA1MCwgNH0sCi17NSwgMTAsIDEwMCwgNTAsIDV9LAotezYsIDEwLCAxMDAsIDUwLCA2fSwKLXs3LCAxMCwgMTAwLCA1MCwgN30sCi17OCwgMTAsIDEwMCwgNTAsIDh9LAotezksIDEwLCAxMDAsIDUwLCA5fSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgNTAsIDExfSwKLXsxMiwgMTAsIDEwMCwgNTAsIDEyfSwKLXsxMywgMTAsIDEwMCwgNTAsIDEzfSwKLXsxNCwgMTAsIDEwMCwgNTAsIDE0fSwKLXsxNSwgMTAsIDEwMCwgNTAsIDE1fSwKLXsxNiwgMTAsIDEwMCwgNTAsIDE2fSwKLXsxNywgMTAsIDEwMCwgNTAsIDE3fSwKLXsxOCwgMTAsIDEwMCwgNTAsIDE4fSwKLXsxOSwgMTAsIDEwMCwgNTAsIDE5fSwKLXsyMCwgMTAsIDEwMCwgNTAsIDIwfSwKLXsyMSwgMTAsIDEwMCwgNTAsIDIxfSwKLXsyMiwgMTAsIDEwMCwgNTAsIDIyfSwKLXsyMywgMTAsIDEwMCwgNTAsIDIzfSwKLXsyNCwgMTAsIDEwMCwgNTAsIDI0fSwKLXsyNSwgMTAsIDEwMCwgNTAsIDI1fSwKLXsyNiwgMTAsIDEwMCwgNTAsIDI2fSwKLXsyNywgMTAsIDEwMCwgNTAsIDI3fSwKLXsyOCwgMTAsIDEwMCwgNTAsIDI4fSwKLXsyOSwgMTAsIDEwMCwgNTAsIDI5fSwKLXszMCwgMTAsIDEwMCwgNTAsIDMwfSwKLXszMSwgMTAsIDEwMCwgNTAsIDMxfSwKLXszMiwgMTAsIDEwMCwgNTAsIDMyfSwKLXszMywgMTAsIDEwMCwgNTAsIDMzfSwKLXszNCwgMTAsIDEwMCwgNTAsIDM0fSwKLXszNSwgMTAsIDEwMCwgNTAsIDM1fSwKLXszNiwgMTAsIDEwMCwgNTAsIDM2fSwKLXszNywgMTAsIDEwMCwgNTAsIDM3fSwKLXszOCwgMTAsIDEwMCwgNTAsIDM4fSwKLXszOSwgMTAsIDEwMCwgNTAsIDM5fSwKLXs0MCwgMTAsIDEwMCwgNTAsIDQwfSwKLXs0MSwgMTAsIDEwMCwgNTAsIDQxfSwKLXs0MiwgMTAsIDEwMCwgNTAsIDQyfSwKLXs0MywgMTAsIDEwMCwgNTAsIDQzfSwKLXs0NCwgMTAsIDEwMCwgNTAsIDQ0fSwKLXs0NSwgMTAsIDEwMCwgNTAsIDQ1fSwKLXs0NiwgMTAsIDEwMCwgNTAsIDQ2fSwKLXs0NywgMTAsIDEwMCwgNTAsIDQ3fSwKLXs0OCwgMTAsIDEwMCwgNTAsIDQ4fSwKLXs0OSwgMTAsIDEwMCwgNTAsIDQ5fSwKLXs1MCwgMTAsIDEwMCwgNTAsIDUwfSwKLXs1MSwgMTAsIDEwMCwgNDksIDUxfSwKLXs1MiwgMTAsIDEwMCwgNDgsIDUyfSwKLXs1MywgMTAsIDEwMCwgNDcsIDUzfSwKLXs1NCwgMTAsIDEwMCwgNDYsIDU0fSwKLXs1NSwgMTAsIDEwMCwgNDUsIDU1fSwKLXs1NiwgMTAsIDEwMCwgNDQsIDU2fSwKLXs1NywgMTAsIDEwMCwgNDMsIDU3fSwKLXs1OCwgMTAsIDEwMCwgNDIsIDU4fSwKLXs1OSwgMTAsIDEwMCwgNDEsIDU5fSwKLXs2MCwgMTAsIDEwMCwgNDAsIDYwfSwKLXs2MSwgMTAsIDEwMCwgMzksIDYxfSwKLXs2MiwgMTAsIDEwMCwgMzgsIDYyfSwKLXs2MywgMTAsIDEwMCwgMzcsIDYzfSwKLXs2NCwgMTAsIDEwMCwgMzYsIDY0fSwKLXs2NSwgMTAsIDEwMCwgMzUsIDY1fSwKLXs2NiwgMTAsIDEwMCwgMzQsIDY2fSwKLXs2NywgMTAsIDEwMCwgMzMsIDY3fSwKLXs2OCwgMTAsIDEwMCwgMzIsIDY4fSwKLXs2OSwgMTAsIDEwMCwgMzEsIDY5fSwKLXs3MCwgMTAsIDEwMCwgMzAsIDcwfSwKLXs3MSwgMTAsIDEwMCwgMjksIDcxfSwKLXs3MiwgMTAsIDEwMCwgMjgsIDcyfSwKLXs3MywgMTAsIDEwMCwgMjcsIDczfSwKLXs3NCwgMTAsIDEwMCwgMjYsIDc0fSwKLXs3NSwgMTAsIDEwMCwgMjUsIDc1fSwKLXs3NiwgMTAsIDEwMCwgMjQsIDc2fSwKLXs3NywgMTAsIDEwMCwgMjMsIDc3fSwKLXs3OCwgMTAsIDEwMCwgMjIsIDc4fSwKLXs3OSwgMTAsIDEwMCwgMjEsIDc5fSwKLXs4MCwgMTAsIDEwMCwgMjAsIDgwfSwKLXs4MSwgMTAsIDEwMCwgMTksIDgxfSwKLXs4MiwgMTAsIDEwMCwgMTgsIDgyfSwKLXs4MywgMTAsIDEwMCwgMTcsIDgzfSwKLXs4NCwgMTAsIDEwMCwgMTYsIDg0fSwKLXs4NSwgMTAsIDEwMCwgMTUsIDg1fSwKLXs4NiwgMTAsIDEwMCwgMTQsIDg2fSwKLXs4NywgMTAsIDEwMCwgMTMsIDg3fSwKLXs4OCwgMTAsIDEwMCwgMTIsIDg4fSwKLXs4OSwgMTAsIDEwMCwgMTEsIDg5fSwKLXs5MCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA0LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA3LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEwLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEzLCAxMCwgMTAwLCAxMCwgOTB9LAotezExNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE2LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjQsIDEwLCAxMDAsIDEwLCA5MH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxLCAxMDAsIDUwLCAxMH0sCi17MiwgMiwgMTAwLCA1MCwgMTB9LAotezMsIDMsIDEwMCwgNTAsIDEwfSwKLXs0LCA0LCAxMDAsIDUwLCAxMH0sCi17NSwgNSwgMTAwLCA1MCwgMTB9LAotezYsIDYsIDEwMCwgNTAsIDEwfSwKLXs3LCA3LCAxMDAsIDUwLCAxMH0sCi17OCwgOCwgMTAwLCA1MCwgMTB9LAotezksIDksIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTEsIDEwMCwgNTAsIDEwfSwKLXsxMiwgMTIsIDEwMCwgNTAsIDEwfSwKLXsxMywgMTMsIDEwMCwgNTAsIDEwfSwKLXsxNCwgMTQsIDEwMCwgNTAsIDEwfSwKLXsxNSwgMTUsIDEwMCwgNTAsIDEwfSwKLXsxNiwgMTYsIDEwMCwgNTAsIDEwfSwKLXsxNywgMTcsIDEwMCwgNTAsIDEwfSwKLXsxOCwgMTgsIDEwMCwgNTAsIDEwfSwKLXsxOSwgMTksIDEwMCwgNTAsIDEwfSwKLXsyMCwgMjAsIDEwMCwgNTAsIDEwfSwKLXsyMSwgMjEsIDEwMCwgNTAsIDEwfSwKLXsyMiwgMjIsIDEwMCwgNTAsIDEwfSwKLXsyMywgMjMsIDEwMCwgNTAsIDEwfSwKLXsyNCwgMjQsIDEwMCwgNTAsIDEwfSwKLXsyNSwgMjUsIDEwMCwgNTAsIDEwfSwKLXsyNiwgMjYsIDEwMCwgNTAsIDEwfSwKLXsyNywgMjcsIDEwMCwgNTAsIDEwfSwKLXsyOCwgMjgsIDEwMCwgNTAsIDEwfSwKLXsyOSwgMjksIDEwMCwgNTAsIDEwfSwKLXszMCwgMzAsIDEwMCwgNTAsIDEwfSwKLXszMSwgMzEsIDEwMCwgNTAsIDEwfSwKLXszMiwgMzIsIDEwMCwgNTAsIDEwfSwKLXszMywgMzMsIDEwMCwgNTAsIDEwfSwKLXszNCwgMzQsIDEwMCwgNTAsIDEwfSwKLXszNSwgMzUsIDEwMCwgNTAsIDEwfSwKLXszNiwgMzYsIDEwMCwgNTAsIDEwfSwKLXszNywgMzcsIDEwMCwgNTAsIDEwfSwKLXszOCwgMzgsIDEwMCwgNTAsIDEwfSwKLXszOSwgMzksIDEwMCwgNTAsIDEwfSwKLXs0MCwgNDAsIDEwMCwgNTAsIDEwfSwKLXs0MSwgNDEsIDEwMCwgNTAsIDEwfSwKLXs0MiwgNDIsIDEwMCwgNTAsIDEwfSwKLXs0MywgNDMsIDEwMCwgNTAsIDEwfSwKLXs0NCwgNDQsIDEwMCwgNTAsIDEwfSwKLXs0NSwgNDUsIDEwMCwgNTAsIDEwfSwKLXs0NiwgNDYsIDEwMCwgNTAsIDEwfSwKLXs0NywgNDcsIDEwMCwgNTAsIDEwfSwKLXs0OCwgNDgsIDEwMCwgNTAsIDEwfSwKLXs0OSwgNDksIDEwMCwgNTAsIDEwfSwKLXs1MCwgNTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgNTEsIDEwMCwgNTEsIDEwfSwKLXs1MiwgNTIsIDEwMCwgNTIsIDEwfSwKLXs1MywgNTMsIDEwMCwgNTMsIDEwfSwKLXs1NCwgNTQsIDEwMCwgNTQsIDEwfSwKLXs1NSwgNTUsIDEwMCwgNTUsIDEwfSwKLXs1NiwgNTYsIDEwMCwgNTYsIDEwfSwKLXs1NywgNTcsIDEwMCwgNTcsIDEwfSwKLXs1OCwgNTgsIDEwMCwgNTgsIDEwfSwKLXs1OSwgNTksIDEwMCwgNTksIDEwfSwKLXs2MCwgNjAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgNjEsIDEwMCwgNjEsIDEwfSwKLXs2MiwgNjIsIDEwMCwgNjIsIDEwfSwKLXs2MywgNjMsIDEwMCwgNjMsIDEwfSwKLXs2NCwgNjQsIDEwMCwgNjQsIDEwfSwKLXs2NSwgNjUsIDEwMCwgNjUsIDEwfSwKLXs2NiwgNjYsIDEwMCwgNjYsIDEwfSwKLXs2NywgNjcsIDEwMCwgNjcsIDEwfSwKLXs2OCwgNjgsIDEwMCwgNjgsIDEwfSwKLXs2OSwgNjksIDEwMCwgNjksIDEwfSwKLXs3MCwgNzAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgNzEsIDEwMCwgNzEsIDEwfSwKLXs3MiwgNzIsIDEwMCwgNzIsIDEwfSwKLXs3MywgNzMsIDEwMCwgNzMsIDEwfSwKLXs3NCwgNzQsIDEwMCwgNzQsIDEwfSwKLXs3NSwgNzUsIDEwMCwgNzUsIDEwfSwKLXs3NiwgNzYsIDEwMCwgNzYsIDEwfSwKLXs3NywgNzcsIDEwMCwgNzcsIDEwfSwKLXs3OCwgNzgsIDEwMCwgNzgsIDEwfSwKLXs3OSwgNzksIDEwMCwgNzksIDEwfSwKLXs4MCwgODAsIDEwMCwgODAsIDEwfSwKLXs4MSwgODEsIDEwMCwgODEsIDEwfSwKLXs4MiwgODIsIDEwMCwgODIsIDEwfSwKLXs4MywgODMsIDEwMCwgODMsIDEwfSwKLXs4NCwgODQsIDEwMCwgODQsIDEwfSwKLXs4NSwgODUsIDEwMCwgODUsIDEwfSwKLXs4NiwgODYsIDEwMCwgODYsIDEwfSwKLXs4NywgODcsIDEwMCwgODcsIDEwfSwKLXs4OCwgODgsIDEwMCwgODgsIDEwfSwKLXs4OSwgODksIDEwMCwgODksIDEwfSwKLXs5MCwgOTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgOTEsIDEwMCwgOTEsIDl9LAotezkyLCA5MiwgMTAwLCA5MiwgOH0sCi17OTMsIDkzLCAxMDAsIDkzLCA3fSwKLXs5NCwgOTQsIDEwMCwgOTQsIDZ9LAotezk1LCA5NSwgMTAwLCA5NSwgNX0sCi17OTYsIDk2LCAxMDAsIDk2LCA0fSwKLXs5NywgOTcsIDEwMCwgOTcsIDN9LAotezk4LCA5OCwgMTAwLCA5OCwgMn0sCi17OTksIDk5LCAxMDAsIDk5LCAxfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sIAotezEwMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgMTB9LAotezExMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNYXhpbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MiwgMTAsIDEwMCwgNTAsIDEwfSwKLXszLCAxMCwgMTAwLCA1MCwgMTB9LAotezQsIDEwLCAxMDAsIDUwLCAxMH0sCi17NSwgMTAsIDEwMCwgNTAsIDEwfSwKLXs2LCAxMCwgMTAwLCA1MCwgMTB9LAotezcsIDEwLCAxMDAsIDUwLCAxMH0sCi17OCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTEsIDEwLCAxfSwKLXsxMiwgMTAsIDEyLCAxMCwgMn0sCi17MTMsIDEwLCAxMywgMTAsIDN9LAotezE0LCAxMCwgMTQsIDEwLCA0fSwKLXsxNSwgMTAsIDE1LCAxMCwgNX0sCi17MTYsIDEwLCAxNiwgMTAsIDZ9LAotezE3LCAxMCwgMTcsIDEwLCA3fSwKLXsxOCwgMTAsIDE4LCAxMCwgOH0sCi17MTksIDEwLCAxOSwgMTAsIDl9LAotezIwLCAxMCwgMjAsIDEwLCAxMH0sCi17MjEsIDEwLCAyMSwgMTEsIDEwfSwKLXsyMiwgMTAsIDIyLCAxMiwgMTB9LAotezIzLCAxMCwgMjMsIDEzLCAxMH0sCi17MjQsIDEwLCAyNCwgMTQsIDEwfSwKLXsyNSwgMTAsIDI1LCAxNSwgMTB9LAotezI2LCAxMCwgMjYsIDE2LCAxMH0sCi17MjcsIDEwLCAyNywgMTcsIDEwfSwKLXsyOCwgMTAsIDI4LCAxOCwgMTB9LAotezI5LCAxMCwgMjksIDE5LCAxMH0sCi17MzAsIDEwLCAzMCwgMjAsIDEwfSwKLXszMSwgMTAsIDMxLCAyMSwgMTB9LAotezMyLCAxMCwgMzIsIDIyLCAxMH0sCi17MzMsIDEwLCAzMywgMjMsIDEwfSwKLXszNCwgMTAsIDM0LCAyNCwgMTB9LAotezM1LCAxMCwgMzUsIDI1LCAxMH0sCi17MzYsIDEwLCAzNiwgMjYsIDEwfSwKLXszNywgMTAsIDM3LCAyNywgMTB9LAotezM4LCAxMCwgMzgsIDI4LCAxMH0sCi17MzksIDEwLCAzOSwgMjksIDEwfSwKLXs0MCwgMTAsIDQwLCAzMCwgMTB9LAotezQxLCAxMCwgNDEsIDMxLCAxMH0sCi17NDIsIDEwLCA0MiwgMzIsIDEwfSwKLXs0MywgMTAsIDQzLCAzMywgMTB9LAotezQ0LCAxMCwgNDQsIDM0LCAxMH0sCi17NDUsIDEwLCA0NSwgMzUsIDEwfSwKLXs0NiwgMTAsIDQ2LCAzNiwgMTB9LAotezQ3LCAxMCwgNDcsIDM3LCAxMH0sCi17NDgsIDEwLCA0OCwgMzgsIDEwfSwKLXs0OSwgMTAsIDQ5LCAzOSwgMTB9LAotezUwLCAxMCwgNTAsIDQwLCAxMH0sCi17NTEsIDEwLCA1MSwgNDEsIDEwfSwKLXs1MiwgMTAsIDUyLCA0MiwgMTB9LAotezUzLCAxMCwgNTMsIDQzLCAxMH0sCi17NTQsIDEwLCA1NCwgNDQsIDEwfSwKLXs1NSwgMTAsIDU1LCA0NSwgMTB9LAotezU2LCAxMCwgNTYsIDQ2LCAxMH0sCi17NTcsIDEwLCA1NywgNDcsIDEwfSwKLXs1OCwgMTAsIDU4LCA0OCwgMTB9LAotezU5LCAxMCwgNTksIDQ5LCAxMH0sCi17NjAsIDEwLCA2MCwgNTAsIDEwfSwKLXs2MSwgMTAsIDYxLCA1MCwgMTB9LAotezYyLCAxMCwgNjIsIDUwLCAxMH0sCi17NjMsIDEwLCA2MywgNTAsIDEwfSwKLXs2NCwgMTAsIDY0LCA1MCwgMTB9LAotezY1LCAxMCwgNjUsIDUwLCAxMH0sCi17NjYsIDEwLCA2NiwgNTAsIDEwfSwKLXs2NywgMTAsIDY3LCA1MCwgMTB9LAotezY4LCAxMCwgNjgsIDUwLCAxMH0sCi17NjksIDEwLCA2OSwgNTAsIDEwfSwKLXs3MCwgMTAsIDcwLCA1MCwgMTB9LAotezcxLCAxMCwgNzEsIDUwLCAxMH0sCi17NzIsIDEwLCA3MiwgNTAsIDEwfSwKLXs3MywgMTAsIDczLCA1MCwgMTB9LAotezc0LCAxMCwgNzQsIDUwLCAxMH0sCi17NzUsIDEwLCA3NSwgNTAsIDEwfSwKLXs3NiwgMTAsIDc2LCA1MCwgMTB9LAotezc3LCAxMCwgNzcsIDUwLCAxMH0sCi17NzgsIDEwLCA3OCwgNTAsIDEwfSwKLXs3OSwgMTAsIDc5LCA1MCwgMTB9LAotezgwLCAxMCwgODAsIDUwLCAxMH0sCi17ODEsIDEwLCA4MSwgNTAsIDEwfSwKLXs4MiwgMTAsIDgyLCA1MCwgMTB9LAotezgzLCAxMCwgODMsIDUwLCAxMH0sCi17ODQsIDEwLCA4NCwgNTAsIDEwfSwKLXs4NSwgMTAsIDg1LCA1MCwgMTB9LAotezg2LCAxMCwgODYsIDUwLCAxMH0sCi17ODcsIDEwLCA4NywgNTAsIDEwfSwKLXs4OCwgMTAsIDg4LCA1MCwgMTB9LAotezg5LCAxMCwgODksIDUwLCAxMH0sCi17OTAsIDEwLCA5MCwgNTAsIDEwfSwKLXs5MSwgMTAsIDkxLCA1MCwgMTB9LAotezkyLCAxMCwgOTIsIDUwLCAxMH0sCi17OTMsIDEwLCA5MywgNTAsIDEwfSwKLXs5NCwgMTAsIDk0LCA1MCwgMTB9LAotezk1LCAxMCwgOTUsIDUwLCAxMH0sCi17OTYsIDEwLCA5NiwgNTAsIDEwfSwKLXs5NywgMTAsIDk3LCA1MCwgMTB9LAotezk4LCAxMCwgOTgsIDUwLCAxMH0sCi17OTksIDEwLCA5OSwgNTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMiwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgMTB9LAotezEwNSwgMTAsIDEwNSwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgMTB9LAotezEwOCwgMTAsIDEwOCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDksIDUwLCAxMH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgMTB9LAotezExMSwgMTAsIDExMSwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgMTB9LAotezExNCwgMTAsIDExNCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgMTB9LAotezExNywgMTAsIDExNywgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgMTB9LAotezEyMCwgMTAsIDEyMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgMTB9LAotezEyMywgMTAsIDEyMywgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCi0Jc2xpZGVyLnNldE1heGltdW0oMTAwKTsKLQlzbGlkZXIuc2V0TWluaW11bSgxMCk7Ci0Jc2xpZGVyLnNldFRodW1iKDEwKTsKLQlzbGlkZXIuc2V0U2VsZWN0aW9uKDUwKTsKLQotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTksIDEwLCAxMDAsIDEwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxLCAxMCwgMTAwLCAxMCwgMTB9LAotezIsIDEwLCAxMDAsIDEwLCAxMH0sCi17MywgMTAsIDEwMCwgMTAsIDEwfSwKLXs0LCAxMCwgMTAwLCAxMCwgMTB9LAotezUsIDEwLCAxMDAsIDEwLCAxMH0sCi17NiwgMTAsIDEwMCwgMTAsIDEwfSwKLXs3LCAxMCwgMTAwLCAxMCwgMTB9LAotezgsIDEwLCAxMDAsIDEwLCAxMH0sCi17OSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgMTEsIDEwfSwKLXsxMiwgMTAsIDEwMCwgMTIsIDEwfSwKLXsxMywgMTAsIDEwMCwgMTMsIDEwfSwKLXsxNCwgMTAsIDEwMCwgMTQsIDEwfSwKLXsxNSwgMTAsIDEwMCwgMTUsIDEwfSwKLXsxNiwgMTAsIDEwMCwgMTYsIDEwfSwKLXsxNywgMTAsIDEwMCwgMTcsIDEwfSwKLXsxOCwgMTAsIDEwMCwgMTgsIDEwfSwKLXsxOSwgMTAsIDEwMCwgMTksIDEwfSwKLXsyMCwgMTAsIDEwMCwgMjAsIDEwfSwKLXsyMSwgMTAsIDEwMCwgMjEsIDEwfSwKLXsyMiwgMTAsIDEwMCwgMjIsIDEwfSwKLXsyMywgMTAsIDEwMCwgMjMsIDEwfSwKLXsyNCwgMTAsIDEwMCwgMjQsIDEwfSwKLXsyNSwgMTAsIDEwMCwgMjUsIDEwfSwKLXsyNiwgMTAsIDEwMCwgMjYsIDEwfSwKLXsyNywgMTAsIDEwMCwgMjcsIDEwfSwKLXsyOCwgMTAsIDEwMCwgMjgsIDEwfSwKLXsyOSwgMTAsIDEwMCwgMjksIDEwfSwKLXszMCwgMTAsIDEwMCwgMzAsIDEwfSwKLXszMSwgMTAsIDEwMCwgMzEsIDEwfSwKLXszMiwgMTAsIDEwMCwgMzIsIDEwfSwKLXszMywgMTAsIDEwMCwgMzMsIDEwfSwKLXszNCwgMTAsIDEwMCwgMzQsIDEwfSwKLXszNSwgMTAsIDEwMCwgMzUsIDEwfSwKLXszNiwgMTAsIDEwMCwgMzYsIDEwfSwKLXszNywgMTAsIDEwMCwgMzcsIDEwfSwKLXszOCwgMTAsIDEwMCwgMzgsIDEwfSwKLXszOSwgMTAsIDEwMCwgMzksIDEwfSwKLXs0MCwgMTAsIDEwMCwgNDAsIDEwfSwKLXs0MSwgMTAsIDEwMCwgNDEsIDEwfSwKLXs0MiwgMTAsIDEwMCwgNDIsIDEwfSwKLXs0MywgMTAsIDEwMCwgNDMsIDEwfSwKLXs0NCwgMTAsIDEwMCwgNDQsIDEwfSwKLXs0NSwgMTAsIDEwMCwgNDUsIDEwfSwKLXs0NiwgMTAsIDEwMCwgNDYsIDEwfSwKLXs0NywgMTAsIDEwMCwgNDcsIDEwfSwKLXs0OCwgMTAsIDEwMCwgNDgsIDEwfSwKLXs0OSwgMTAsIDEwMCwgNDksIDEwfSwKLXs1MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgMTAsIDEwMCwgNTEsIDEwfSwKLXs1MiwgMTAsIDEwMCwgNTIsIDEwfSwKLXs1MywgMTAsIDEwMCwgNTMsIDEwfSwKLXs1NCwgMTAsIDEwMCwgNTQsIDEwfSwKLXs1NSwgMTAsIDEwMCwgNTUsIDEwfSwKLXs1NiwgMTAsIDEwMCwgNTYsIDEwfSwKLXs1NywgMTAsIDEwMCwgNTcsIDEwfSwKLXs1OCwgMTAsIDEwMCwgNTgsIDEwfSwKLXs1OSwgMTAsIDEwMCwgNTksIDEwfSwKLXs2MCwgMTAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgMTAsIDEwMCwgNjEsIDEwfSwKLXs2MiwgMTAsIDEwMCwgNjIsIDEwfSwKLXs2MywgMTAsIDEwMCwgNjMsIDEwfSwKLXs2NCwgMTAsIDEwMCwgNjQsIDEwfSwKLXs2NSwgMTAsIDEwMCwgNjUsIDEwfSwKLXs2NiwgMTAsIDEwMCwgNjYsIDEwfSwKLXs2NywgMTAsIDEwMCwgNjcsIDEwfSwKLXs2OCwgMTAsIDEwMCwgNjgsIDEwfSwKLXs2OSwgMTAsIDEwMCwgNjksIDEwfSwKLXs3MCwgMTAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgMTAsIDEwMCwgNzEsIDEwfSwKLXs3MiwgMTAsIDEwMCwgNzIsIDEwfSwKLXs3MywgMTAsIDEwMCwgNzMsIDEwfSwKLXs3NCwgMTAsIDEwMCwgNzQsIDEwfSwKLXs3NSwgMTAsIDEwMCwgNzUsIDEwfSwKLXs3NiwgMTAsIDEwMCwgNzYsIDEwfSwKLXs3NywgMTAsIDEwMCwgNzcsIDEwfSwKLXs3OCwgMTAsIDEwMCwgNzgsIDEwfSwKLXs3OSwgMTAsIDEwMCwgNzksIDEwfSwKLXs4MCwgMTAsIDEwMCwgODAsIDEwfSwKLXs4MSwgMTAsIDEwMCwgODEsIDEwfSwKLXs4MiwgMTAsIDEwMCwgODIsIDEwfSwKLXs4MywgMTAsIDEwMCwgODMsIDEwfSwKLXs4NCwgMTAsIDEwMCwgODQsIDEwfSwKLXs4NSwgMTAsIDEwMCwgODUsIDEwfSwKLXs4NiwgMTAsIDEwMCwgODYsIDEwfSwKLXs4NywgMTAsIDEwMCwgODcsIDEwfSwKLXs4OCwgMTAsIDEwMCwgODgsIDEwfSwKLXs4OSwgMTAsIDEwMCwgODksIDEwfSwKLXs5MCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA5MCwgMTB9LAotezExNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDkwLCAxMH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uKCkgewotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChzbGlkZXIuZ2V0U2l6ZSgpLngtMTAsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19SSUdIVCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjUsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg0NSwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjliZjQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TeW5jaHJvbml6ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlN5bmNocm9uaXplcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCkgewotCS8vIHRlc3RlZCBpbiBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkudGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyCi19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxMWEwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCVRhYkZvbGRlciBuZXdUYWJGb2xkZXI7Ci0JdHJ5IHsKLQkJbmV3VGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRhYkl0ZW0gdGk7Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKT09aSk7Ci0JICAJdGkgPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgK1N0cmluZy52YWx1ZU9mKGkpLCB0YWJGb2xkZXIuZ2V0SXRlbShpKS5lcXVhbHMoaXRlbXNbaV0pKTsKLQl9Ci0JdHJ5IHsKLQkJdGFiRm9sZGVyLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQl0YWJGb2xkZXIuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJdGFiRm9sZGVyLmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA9PSAtMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQotCWFzc2VydEVxdWFscygwLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKS5sZW5ndGgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYkZvbGRlci5nZXRJdGVtcygpKTsKLQkKLQl0YWJGb2xkZXIuZ2V0SXRlbXMoKVswXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci0KLQl0YWJGb2xkZXIuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRJdGVtcygpKTsKLQotCXRhYkZvbGRlci5nZXRJdGVtcygpWzFdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbM119LCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUYWJJdGVtW10gdGlzID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWFzc2VydFRydWUoIjphOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKVswXSA9PSB0aXNbMF0pOwkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGkpOwotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpWzBdPT10aXNbaV0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JCQotCWFzc2VydFRydWUoIjphOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpPT0wKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKT09Mik7Ci0JCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk9PTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JVGFiSXRlbVtdIHRpcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgdGFiRm9sZGVyLmluZGV4T2YodGlzW2ldKT09aSk7Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdHJ5IHsKLQkJCXRhYkZvbGRlci5pbmRleE9mKG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFiSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7CQotCW51bWJlciA9IDIwOwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JLy9hbm90aGVyIHRhYkZvbGRlcgotCVRhYkZvbGRlciB0YWJGb2xkZXJfMiA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCVRhYkl0ZW1bXSBpdGVtc18yID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zXzJbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXJfMiwgMCk7Ci0JCWl0ZW1zXzJbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YToiICsgU3RyaW5nLnZhbHVlT2YoaSksIHRhYkZvbGRlci5pbmRleE9mKGl0ZW1zXzJbaV0pPT0tMSk7Ci0JfQotCi0JLy8KLQlUYWJGb2xkZXIgdGFiRm9sZGVyMiA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQlUYWJJdGVtIHRhYkl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIyLCBTV1QuTlVMTCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFiRm9sZGVyLmluZGV4T2YodGFiSXRlbSkgPT0gLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRhYkl0ZW0gdGk7Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaSk7Ci0JCWFzc2VydEVxdWFscyhpLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGkgPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCSAgCWFzc2VydEVxdWFscygiaT0iICsgaSwgMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQludW1iZXIgPSA1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXRyeSB7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oKFRhYkl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzRdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMl19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihudW1iZXIgKyAxKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0vLwl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKC0xKTsKLS8vCWFzc2VydEVxdWFscygwLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsJCi0JCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLS8vCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oLTIpOwotLy8JYXNzZXJ0RXF1YWxzKDAsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5sZW5ndGgpOwkKLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117fSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzRdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbMl19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbMV19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JdHJ5IHsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbiggbmV3IFRhYkl0ZW1bXXtpdGVtc1swXSwgbnVsbH0pOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKCBuZXcgVGFiSXRlbVtde251bGx9KTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0YWJGb2xkZXIpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFiRm9sZGVyKFZlY3RvciBldmVudHMpIHsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIlRhYkl0ZW0gJiIgKyBpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQodGFiRm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJaXRlbVRleHQuc2V0VGV4dCgiXG5UZXh0IGZvciBUYWJJdGVtICIgKyBpICsgIlxuXG5cbiIpOwotCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0JCi0vLwl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge3RhYkZvbGRlci5nZXRJdGVtKDApfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHRhYkZvbGRlci5nZXRTaXplKCkueC8yLCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQ1RSTCwgMCwgU1dULlBBR0VfRE9XTiwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5DVFJMLCAwLCBTV1QuUEFHRV9VUCwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDEpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDUsIDcwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiYWQ3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCXRhYkl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXNldFdpZGdldCh0YWJJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJKCkgewotCVRhYkl0ZW0gdEl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAwKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVswXSA9PSB0SXRlbSk7Ci0JCi0JdEl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwotCQkJCQotCXRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIC0xKTsJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXSA9PSB0SXRlbSk7CQkJCi0JfQotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKSArIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0VHJ1ZSgiOmU6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwotCX0KLQl0cnkgewotCQluZXcgVGFiSXRlbShudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0UGFyZW50KCkgPT0gdGFiRm9sZGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9vbFRpcFRleHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29udHJvbCBjb250cm9sID0gbmV3IFRhYmxlKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IG51bGwpOwkKLQotCXRhYkl0ZW0uc2V0Q29udHJvbChjb250cm9sKTsKLQlhc3NlcnRUcnVlKCI6YjogIiwgdGFiSXRlbS5nZXRDb250cm9sKCkgPT0gY29udHJvbCk7Ci0KLQl0YWJJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdGFiSXRlbS5nZXRUb29sVGlwVGV4dCgpLmVxdWFscygiZnJlZCIpKTsKLQl0YWJJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKSk7Ci0JdGFiSXRlbS5zZXRUb29sVGlwVGV4dChudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzogIiwgdGFiSXRlbS5nZXRUb29sVGlwVGV4dCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9vbFRpcFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGFiRm9sZGVyIHRhYkZvbGRlcjsKLVRhYkl0ZW0gdGFiSXRlbTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZTQ4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsgLy8gYnkgZGVmYXVsdCwgdXNlIG11bHRpLXNlbGVjdCB0YWJsZS4JCi19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3QkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsxLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsxLCAzLCA1fSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHs5LCAzLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cnl7Ci0JCXRhYmxlLmRlc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHstMSwgMTAwLCAtMTAwMH0pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsyLCAtMSwgMSwgMTAwLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0yLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10gezIsIC0xLCAxLCAxMDAsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MiwgLTEsIDMsIDEwMCwgMn0pOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezIsIDQsIDUsIDEwfSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDQsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KDApOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzLCA2fSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDMpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgxMDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdElJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzLCA2fSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoNywgMTApOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDYsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgxLCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMCwgMTApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgtMTAsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgtMTAsIDIwMDApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KDIwMDAsIC0xMCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JCi0JdGFibGUuZGVzZWxlY3QoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscyhudW1iZXItMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChudW1iZXItMSwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhudW1iZXItMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JdGFibGUuZGVzZWxlY3QoLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5Db3VudCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uSSgpIHsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgdGFibGUuZ2V0Q29sdW1uKDApKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIHRhYmxlLmdldENvbHVtbigxKSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbHVtbjAuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5zKCkgewotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlJJR0hULCAxKTsKLQljb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygyLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzFdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQljb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5PcmRlcigpIHsKLQkvL2luIHRlc3Rfc2V0QUNvbHVtbk9yZGVyJEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmlkTGluZVdpZHRoKCkgewotCS8vIGV4ZWN1dGUgbWV0aG9kIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgdGhlIHZhbHVlIHNpbmNlIGl0IG1heSBiZSBhbnl0aGluZyBpbmNsdWRpbmcgMAotCXRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkgPiAwKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlYWRlclZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iKyBqLCBjYXNlc1tqXSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7CQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IisgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IEl0ZW0gaGVpZ2h0IDw9IDAiLCB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjogSXRlbSBoZWlnaHQgPD0gMCIsIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdGFibGUuZ2V0SXRlbShpKSk7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIGl0ZW1zW2ldLCB0YWJsZS5nZXRJdGVtKGkpKTsKLQl9Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iICsgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkJdGkuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImo9IiArIGogKyAiLCBpPSIgKyBpLCBTdHJpbmcudmFsdWVPZihpKSwgaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLQkJfQotCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0JCi0JLy8gbm90ZSBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iICsgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCXRpLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJqPSIgKyBqICsgIiwgaT0iICsgaSwgU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVzVmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRMaW5lc1Zpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShpdGVtcywgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzEwXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMTAsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDEwLCBudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7IC8vIDEwIDwgbnVtYmVyCi0KLQlpbnRbXSBhbGwgPSBuZXcgaW50W251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyOyBpKyspCi0JCWFsbFtpXT1pOwotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShhbGwsIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtde251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BJbmRleCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMjA7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYmxlLmluZGV4T2YoaXRlbXNbaV0pKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0YWJsZS5pbmRleE9mKChUYWJsZUl0ZW0pbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0YWJsZUl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLy8gYW5vdGhlciB0YWJsZQotCVRhYmxlIHRhYmxlXzIgPSBuZXcgVGFibGUoc2hlbGwsIDApOwotCVRhYmxlSXRlbVtdIGl0ZW1zXzIgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc18yW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZV8yLCAwKTsKLQkJaXRlbXNfMltpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgLTEsIHRhYmxlLmluZGV4T2YoaXRlbXNfMltpXSkpOwotCX0KLQkKLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JbnVtYmVyID0gMjA7Ci0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYmxlLmluZGV4T2YoaXRlbXNbaV0pKTsKLQl9Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0cnkgewotCQkJdGFibGUuaW5kZXhPZigoVGFibGVJdGVtKW51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFibGVJdGVtID09IG51bGwiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JLy8gYW5vdGhlciB0YWJsZQotCXRhYmxlXzIgPSBuZXcgVGFibGUoc2hlbGwsIDApOwotCWl0ZW1zXzIgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc18yW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZV8yLCAwKTsKLQkJaXRlbXNfMltpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgLTEsIHRhYmxlLmluZGV4T2YoaXRlbXNfMltpXSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1NlbGVjdGVkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaWYgKGkgPT0gMiB8fCBpID09IG51bWJlci0xIHx8IGkgPT0gMTApCi0JCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjpiOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6ZDoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzEwXX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaWYgKGkgPT0gMTApCi0JCQlhc3NlcnRUcnVlKCI6ZToiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjplOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjpmOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSRJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFibGVJdGVtcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIC0xMDAsIDUsIDUsIDIsIDEsIDAsIDAsIDB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudHMiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIG51bWJlciwgNSwgNSwgMiwgMSwgMCwgMCwgMH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50cyIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7fSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCAhaXRlbXNbMl0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgaXRlbXNbMl0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCWFzc2VydFRydWUoIjpjOiIsICFpdGVtc1tudW1iZXItMV0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHtudW1iZXItMn0pOwotCWFzc2VydFRydWUoIjpkOiIsIGl0ZW1zW251bWJlci0xXS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydEVxdWFscyhudW1iZXItMiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgIWl0ZW1zWzNdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFRydWUoIjpmOiIsIGl0ZW1zWzNdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0zLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlhc3NlcnRUcnVlKCI6ZzoiLCAhaXRlbXNbMF0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgaXRlbXNbMF0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTQsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmVBbGwoKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZUFsbCgpOwotCXRhYmxlLnJlbW92ZUFsbCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgtbnVtYmVyLCBudW1iZXIgKyAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMiwgMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoMiwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoMiwgbnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDAsIDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKC0yMCwgLTEwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIwLCA0MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyMDAsIDQwKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoLTEwLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCXRhYmxlLnJlbW92ZSgxMCwgMik7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0JdGFibGUucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXIgLSAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDEsIDIwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlKDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKG51bWJlciwgbnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKG51bWJlciwgbnVtYmVyICsgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQludW1iZXIgPSAxNTsKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7MiwgMSwgMCwgNSwgNX0pOwotCWFzc2VydEVxdWFscyhudW1iZXItNCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3QkSSgpIHsKLQl0cnkgewotCQl0YWJsZS5zZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MiwgMTAsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMCwgMiwgMTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MiwgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10ge251bWJlciwgMCwgbnVtYmVyLTF9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgbnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7bnVtYmVyLCAwLCAtMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgMTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgMiwgMTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7NCwgNCwgNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgCi0JCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRyeSB7Ci0JCXRhYmxlLnNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7NCwgNCwgNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KDcpOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMiwgNywgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUJCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDEwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdElJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdCg3KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgMTApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgMTQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgNyk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg5LCA1KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZWxlY3QoLTEwMCwgMTAwMCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0KDAsIDEwMDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg0LCA0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxMCwgMTApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdChudW1iZXItMSwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KC0xLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgNSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg1LCA0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb2x1bW5PcmRlciRJKCkgewotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50WzBdKTsKLQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFsxXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JCi0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbXXswLCAxLCAyfSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFswXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLCAxLCAyLCAzfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsIDAsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MywgMCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXsyLCAxLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbXSB7MiwgMSwgMH0pOwotCWNvbHVtbjIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W10gezEsIDB9KTsKLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MCwgMSwgMn0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W117MH0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50WzBdKTsKLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzFdKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUodGFibGUuZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlMi5nZXRDb2x1bW5PcmRlcigpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUyLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMF0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlYWRlclZpc2libGVaKCkgewotCWFzc2VydEZhbHNlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodGFibGUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbikgewotCQkvKiBvbmx5IGNhcmJvbiB2ZXJzaW9ucyA+PSAxMC40IHN1cHBvcnQgVGFibGUgbGluZXMgKi8KLQkJYXNzZXJ0RmFsc2UodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydEZhbHNlKHRhYmxlLmdldExpbmVzVmlzaWJsZSgpKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVkcmF3WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRJKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXswLCAzLCAyfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMiwgM30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXszLCAyLCAxfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MSwgMiwgM30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezEsIDQsIDB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezAsIDQsIDB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezIsIDMsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117NCwgNCwgNCwgNCwgNCwgNCwgNH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiByYW5nZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7NH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7bnVtYmVyLTF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MCwgMywgMn0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MywgMiwgMX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7NCwgNCwgNCwgNCwgNCwgNCwgNH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5zZXRTZWxlY3Rpb24oKFRhYmxlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uIHJhbmdlID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1sxXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbM10sIGl0ZW1zWzJdLCBpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCQkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXszfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0JdGFibGUuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXszfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigxKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigzLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXszLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oNSwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDEsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIHRhYmxlCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDEpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10gezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigyLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oNSwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDEsIDQpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10gezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigwLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcEluZGV4SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JdGFibGUuc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uT3JkZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyaWRMaW5lV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU2VsZWN0ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmUkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbk9yZGVyJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lc1Zpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdCRJIikpIHRlc3RfZGVzZWxlY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdElJIikpIHRlc3RfZGVzZWxlY3RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uQ291bnQiKSkgdGVzdF9nZXRDb2x1bW5Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uSSIpKSB0ZXN0X2dldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbk9yZGVyIikpIHRlc3RfZ2V0Q29sdW1uT3JkZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbnMiKSkgdGVzdF9nZXRDb2x1bW5zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmlkTGluZVdpZHRoIikpIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVySGVpZ2h0IikpIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJWaXNpYmxlIikpIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZXNWaXNpYmxlIikpIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTZWxlY3RlZEkiKSkgdGVzdF9pc1NlbGVjdGVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlJEkiKSkgdGVzdF9yZW1vdmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJIikpIHRlc3RfcmVtb3ZlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSUkiKSkgdGVzdF9yZW1vdmVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdCRJIikpIHRlc3Rfc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdElJIikpIHRlc3Rfc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbk9yZGVyJEkiKSkgdGVzdF9zZXRDb2x1bW5PcmRlciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoiKSkgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpKSB0ZXN0X3NldExpbmVzVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kSSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIikpIHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICh0YWJsZSAhPSBudWxsKSB0YWJsZS5kaXNwb3NlKCk7Ci0JdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIHNpbmdsZT9TV1QuU0lOR0xFOlNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlKTsJCi19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZShWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sICIgKyBjb2wpOwotCQljb2x1bW4uc2V0V2lkdGgoNTApOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29sdW1uLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlmb3IgKGludCByb3cgPSAwOyByb3cgPCAzOyByb3crKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDMFIiICsgcm93LCAiQzFSIiArIHJvdywgIkMyUiIgKyByb3d9KTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSArIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSoyLCAKLSAgICAgICAgICAgIAkJIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkrIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSArIDUsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIDI1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFjMjliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuU0lOR0xFKTsJCQotCXRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7CQotCXNldFdpZGdldCh0YWJsZUNvbHVtbik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbihudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbihudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl0YWJsZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QWxpZ25tZW50SQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1vdmVhYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1vdmVhYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzaXphYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJlc2l6ZWFibGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2lkdGgoKSB7Ci0JaW50IHRlc3RXaWR0aCA9IDQyOwotCQotLy8JdHJ5IHsKLS8vCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgtMSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIGZhbHNlKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotLy8JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgdGhyb3duOiAiICsgZSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJBcmd1bWVudCBub3QgdmFsaWQiKSk7Ci0vLwl9Ci0KLQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKCI6YTogd2lkdGg9IiArIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgMCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSAwKTsKLQotCXRhYmxlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotCi0JdGFibGVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yzogd2lkdGg9IiArIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgdGVzdFdpZHRoLCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpID09IHRlc3RXaWR0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFjayBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fX07Ci0KLQl0YWJsZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRhYmxlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCQotCXRhYmxlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJ5IHsKLQkJdGFibGVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRhYmxlQ29sdW1uLnNldEFsaWdubWVudCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIjpjOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2V0IGFsaWdubWVudCBvZiB0aGUgZmlyc3QgY29sdW1uIiwgCi0JCXRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCWNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULlJJR0hUKTsKLQkKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5DRU5URVIpOwkKLQotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNb3ZlYWJsZVooKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0YWJsZUNvbHVtbi5nZXRNb3ZlYWJsZSgpID09IHRydWUpOwotCi0JdGFibGVDb2x1bW4uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJsZUNvbHVtbi5nZXRNb3ZlYWJsZSgpID09IGZhbHNlKTsKLQkKLQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGVDb2x1bW4uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQl0YWJsZUNvbHVtbjIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uMi5nZXRNb3ZlYWJsZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGVDb2x1bW4yLnNldE1vdmVhYmxlKHRydWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVzaXphYmxlWigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJsZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0YWJsZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgdGFibGVDb2x1bW4uZ2V0VGV4dCgpLCAiIik7Ci0KLQl0YWJsZUNvbHVtbi5zZXRUZXh0KCJ0ZXh0Iik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB0YWJsZUNvbHVtbi5nZXRUZXh0KCksICJ0ZXh0Iik7Ci0KLQl0cnkgewotCQl0YWJsZUNvbHVtbi5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2x1bW4gaGVhZGVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TW92ZWFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVzaXphYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbGlnbm1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1vdmVhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVzaXphYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb3ZlYWJsZSIpKSB0ZXN0X2dldE1vdmVhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlc2l6YWJsZSIpKSB0ZXN0X2dldFJlc2l6YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2lkdGgiKSkgdGVzdF9nZXRXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFjayIpKSB0ZXN0X3BhY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1vdmVhYmxlWiIpKSB0ZXN0X3NldE1vdmVhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVzaXphYmxlWiIpKSB0ZXN0X3NldFJlc2l6YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uOwotcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWIyZWNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsJCi0JfQotCWFzc2VydEVxdWFscygxMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCA1KTsJCi0JYXNzZXJ0RXF1YWxzKDEyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JLy8gbm8gY29sdW1ucwotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoxYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwKTsKLQl0YWJsZUl0ZW0uc2V0VGV4dCgiIik7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQkvL2Fzc2VydFRydWUoIjoxZjoiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsgLy8gVE9ETyBkb2Vzbid0IHNocmluaz8KLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdGFibGVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtLnNldEltYWdlKChJbWFnZSludWxsKTsKLQlib3VuZHMyID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotLy8JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOyAvLyBUT0RPIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLSAJCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JdGFibGVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMyID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoxazoiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsKLQkKLQkvLyBubyBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCVRhYmxlIHRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUYWJsZUl0ZW0gdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTk9ORSk7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoyYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoyYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQoImhlbGxvIik7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwKTsKLQl0YWJsZUl0ZW0yLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCS8vYXNzZXJ0VHJ1ZSgiOjJmOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOyAvLyBUT0RPIGRvZXNuJ3Qgc2hyaW5rPwotCQotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCQotCXRhYmxlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtMi5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyaDoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JLy9hc3NlcnRUcnVlKCI6Mmk6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7ICAvLyBUT0RPIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLQkKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQoImhlbGxvIik7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JdGFibGVJdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyajoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJrOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCS8vIHdpdGggY29sdW1ucwotCQotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIC8qYm91bmRzLnggPiAwICYmKi8gYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOyAvLyBUT0RPIGJvdW5kcy54ID09IDAgSXMgdGhpcyByaWdodD8KLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDIpOwotCWFzc2VydFRydWUoIjozZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozZjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozaToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdGFibGVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozazoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNsOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M206IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozbzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNwOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImhlbGxvIiwgIndvcmxkIn0pOwotCXRhYmxlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7bnVsbCwgbnVsbH0pOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNxOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3I6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQoImhlbGxvIik7Ci0JVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuUklHSFQpOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNzOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDApOwotCQotCS8vIHdpdGggY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgLypib3VuZHMueCA+IDAgJiYqLyBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7IC8vIFRPRE8gYm91bmRzLnggPT0gMCBJcyB0aGlzIHJpZ2h0PwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAyMDApOwotCQotCXRhYmxlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGo6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQl0YWJsZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGs6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGw6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdGFibGVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRtOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRuOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0gCXRhYmxlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NG86IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHA6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdGFibGVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImhlbGxvIiwgIndvcmxkIn0pOwotCXRhYmxlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHI6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCQotCXRhYmxlSXRlbTIuc2V0VGV4dCgiaGVsbG8iKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuUklHSFQpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0czoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGVja2VkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldENoZWNrZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JheWVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEdyYXllZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUJvdW5kc0koKSB7Ci0vKioKLSAqIFRlc3Qgd2l0aG91dCBpdGVtIGltYWdlCi0gKi8KLQlSZWN0YW5nbGUgYm91bmRzOwotCVRhYmxlIHRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUYWJsZUl0ZW0gdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTlVMTCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjplOiIsIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7Ci0gCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsJCi0JaW50IGltYWdlV2lkdGggPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQlpbnQgaW1hZ2VIZWlnaHQ7Ci0JCi0JdGFibGVJdGVtLnNldEltYWdlKDAsIGltYWdlKTsKLQlpbWFnZUhlaWdodCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKSAtIHRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtLmdldEltYWdlQm91bmRzKDApOwotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA9PSBpbWFnZVdpZHRoICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwkKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsJCi0JCi0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdGFibGVJdGVtMi5kaXNwb3NlKCk7Ci0JdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTlVMTCk7Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2VXaWR0aCA9IGltYWdlQm91bmRzLndpZHRoOyAJdGFibGVJdGVtMi5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0JaW1hZ2VIZWlnaHQgPSB0YWJsZTIuZ2V0SXRlbUhlaWdodCgpIC0gdGFibGUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIHRoZXkgYXJlIHdpZGVyIHRoYW4gaW1hZ2UKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwotLy8gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIuZGlzcG9zZSgpOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5VTEwpOwotCWltYWdlID0gaW1hZ2VzWzFdOwotCWltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2VXaWR0aCA9IGltYWdlQm91bmRzLndpZHRoOwotIAl0YWJsZUl0ZW0yLnNldEltYWdlKDAsIGltYWdlKTsKLQlpbWFnZUhlaWdodCA9IHRhYmxlMi5nZXRJdGVtSGVpZ2h0KCkgLSB0YWJsZTIuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0gCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIGNoZWNrIGJveCBpcyB3aWRlciB0aGFuIGltYWdlCi0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLSAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VJbmRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlSW5kZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyh0YWJsZSwgdGFibGVJdGVtLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0SUxKYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEJhY2tncm91bmQoKSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRCYWNrZ3JvdW5kKCksdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMCwgYmx1ZSk7Ci0JdGFibGVJdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlhc3NlcnRFcXVhbHMoYmx1ZSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cnkgeyAKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcih0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRCYWNrZ3JvdW5kKCksdGFibGVJdGVtLmdldEJhY2tncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDaGVja2VkWigpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotCQotCXRhYmxlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gCVRhYmxlIHQgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbSh0LCBTV1QuTlVMTCk7Ci0JdGkuc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRpLmdldENoZWNrZWQoKSk7Ci0JCi0JdGkuc2V0Q2hlY2tlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aS5nZXRDaGVja2VkKCkpOwotCXQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdGFibGVJdGVtLmdldERpc3BsYXkoKTsKLQlGb250IGZvbnQgPSB0YWJsZUl0ZW0uZ2V0Rm9udCgpOwotCXRhYmxlSXRlbS5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoKSkpOwotCQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKCB0YWJsZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0KLQl0YWJsZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoKSkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRGb250KGZvbnQpOwotCQl0YWJsZUl0ZW0uc2V0Rm9udChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydFRydWUodGFibGUuZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCWFzc2VydFRydWUodGFibGVJdGVtLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgxMCkpKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodGFibGVJdGVtLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCXRhYmxlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUodGFibGUuZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuTk9STUFMKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQl0YWJsZUl0ZW0uc2V0Rm9udChmb250Mik7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCXRhYmxlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUoZm9udDIuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIGJsdWUpOwotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodGFibGVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0JVGFibGUgbmV3VGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRJdGVtID0gbmV3IFRhYmxlSXRlbShuZXdUYWJsZSwwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQluZXdUYWJsZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKHRhYmxlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UoLTEsIG51bGwpOwkJCi0JYXNzZXJ0TnVsbCh0YWJsZUl0ZW0uZ2V0SW1hZ2UoLTEpKTsJCi0JCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7CQotIAlTdHJpbmcgdGV4dHNbXSA9IG5ldyBTdHJpbmdbaW1hZ2VzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQl0ZXh0c1tpXSA9IFN0cmluZy52YWx1ZU9mKGkpOwotCX0KLQkKLQkvL3RhYmxlLnNldFRleHQodGV4dHMpOwkJCQkvLyBjcmVhdGUgZW5vdWdoIGNvbHVtbnMgZm9yIFRhYmxlSXRlbS5zZXRJbWFnZShJbWFnZVtdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCB0ZXh0cy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KHRleHRzW2ldKTsKLQl9Ci0JdGFibGVJdGVtLnNldEltYWdlKDEsIGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdGFibGVJdGVtLmdldEltYWdlKDEpKTsJCi0gCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpbWFnZXNbaV0sIHRhYmxlSXRlbS5nZXRJbWFnZShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRJbWFnZSgoSW1hZ2UgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbWFnZXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQkJLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRhYmxlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRhYmxlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JdGFibGVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMV0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEltYWdlKGltYWdlc1sxXSk7Ci0JdGFibGVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQkKLQlpbWFnZXNbMF0uZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUluZGVudEkoKSB7Ci0JaWYgKFN3dEp1bml0LmlzQ2FyYm9uIHx8IFN3dEp1bml0LmlzR1RLKSB7Ci0JCS8vc2V0SW1hZ2VJbmRlbnQgbm90IGltcGxlbWVudGVkIG9uIENhcmJvbgotCQl0YWJsZUl0ZW0uc2V0SW1hZ2VJbmRlbnQoMSk7Ci0JCXJldHVybjsgCi0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VJbmRlbnQoKSk7Ci0gCXRhYmxlSXRlbS5zZXRJbWFnZUluZGVudCgxKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGVJdGVtLmdldEltYWdlSW5kZW50KCkpOwotIAl0YWJsZUl0ZW0uc2V0SW1hZ2VJbmRlbnQoLTEpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VJbmRlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZyA9ICJ0ZXN0IjsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZ3NbXSA9IG5ldyBTdHJpbmdbXSB7VGVzdFN0cmluZywgVGVzdFN0cmluZyArICIxIiwgVGVzdFN0cmluZyArICIyIn07Ci0JCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldFRleHQoKFN0cmluZyBbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZ3MgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQoVGVzdFN0cmluZ3MpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nc1swXSwgdGFibGVJdGVtLmdldFRleHQoMCkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KGkpLmxlbmd0aCgpKTsKLQl9Ci0JCi0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0gCQkKLQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotIAl0YWJsZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0gCXRhYmxlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCS8vdGFibGUuc2V0VGV4dChUZXN0U3RyaW5ncyk7CQkJCS8vIGNyZWF0ZSBhbm91Z2ggY29sdW1ucyBmb3IgVGFibGVJdGVtLnNldFRleHQoU3RyaW5nW10pIHRvIHdvcmsKLQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotCi0KLQl0YWJsZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdGFibGVJdGVtLmdldFRleHQoMSkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0KLQotCXRhYmxlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0KLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0VGV4dCgtMSwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRUZXh0KDAsIG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0KLQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGVja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyYXllZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSW5kZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDaGVja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEdyYXllZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSW5kZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmRJIikpIHRlc3RfZ2V0QmFja2dyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kc0kiKSkgdGVzdF9nZXRCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGVja2VkIikpIHRlc3RfZ2V0Q2hlY2tlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRJIikpIHRlc3RfZ2V0Rm9udEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kSSIpKSB0ZXN0X2dldEZvcmVncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmF5ZWQiKSkgdGVzdF9nZXRHcmF5ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpKSB0ZXN0X2dldEltYWdlQm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VJIikpIHRlc3RfZ2V0SW1hZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUluZGVudCIpKSB0ZXN0X2dldEltYWdlSW5kZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJIikpIHRlc3RfZ2V0VGV4dEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2hlY2tlZFoiKSkgdGVzdF9zZXRDaGVja2VkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0R3JheWVkWiIpKSB0ZXN0X3NldEdyYXllZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJbmRlbnRJIikpIHRlc3Rfc2V0SW1hZ2VJbmRlbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGFibGUgdGFibGU7Ci1UYWJsZUl0ZW0gdGFibGVJdGVtOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoKSB7Ci0JaWYgKCB0YWJsZUl0ZW0gIT0gbnVsbCApIHRhYmxlSXRlbS5kaXNwb3NlKCk7Ci0JaWYgKCB0YWJsZSAhPSBudWxsICkgdGFibGUuZGlzcG9zZSgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCAwKTsKLQl0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlzZXRXaWRnZXQodGFibGVJdGVtKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODNjMzA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsgLy8gdXNlIG11bHRpLWxpbmUgYnkgZGVmYXVsdAotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXRleHQgPSBuZXcgVGV4dChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULlNJTkdMRSwgU1dULk1VTFRJLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMLCAKLQkJCQkJU1dULldSQVB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQl0cnkgewotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIG1ldGhvZHMgc2VuZCBhIE1vZGlmeSBldmVudAkKLQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuc2V0VGV4dCgibmV3IHRleHQiKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dCgibGluZSIpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl0cnkgewotCQl0ZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQ1Iik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSwzKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JdGV4dC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJdGV4dC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWZpbmFsIFN0cmluZyBuZXdMaW5lID0gIk5ld0xpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JCi0JLy8gdGVzdCBudWxsIGxpc3RlbmVyIGNhc2UKLQl0cnkgewotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3QgYXBwZW5kIGNhc2UKLQlWZXJpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwkKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuYXBwZW5kKGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJhcHBlbmQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCS8vIHRlc3QgaW5zZXJ0IGNhc2UKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgOCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgOCwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwkKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJpbnNlcnQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUgKyBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkvLyB0ZXN0IHNldFRleHQgY2FzZQotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAxNiwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwkKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3QgcmVtb3ZlIGNhc2UKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCXRleHQuYXBwZW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JdGV4dC5hcHBlbmQoIjIzIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuYXBwZW5kKCI0NSIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1IiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQuYXBwZW5kKCI2NyIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1NjciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JdGV4dC5hcHBlbmQoIjIzIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuYXBwZW5kKCI0IiArIGRlbGltaXRlclN0cmluZysgIjUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZyArIjUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0cnkgewotCQl0ZXh0LmFwcGVuZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBvbiBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JdGV4dC5hcHBlbmQoIjIzIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuYXBwZW5kKCI0NSIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1IiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQuYXBwZW5kKCI2NyIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1NjciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JdGV4dC5hcHBlbmQoIjIzIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuYXBwZW5kKCI0IiArIGRlbGltaXRlclN0cmluZysiNSIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1IiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQuYXBwZW5kKCI2NyIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1NjciLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xlYXJTZWxlY3Rpb24oKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weSgpIHsKLQl0ZXh0LmNvcHkoKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMDAwMDAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuY29weSgpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDAwMDAiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMDAwMCIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jdXQoKSB7Ci0JdGV4dC5jdXQoKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNSk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIjAxNTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LmN1dCgpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDUpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldExpbmVOdW1iZXIoKSB7Ci0JdGV4dC5zZXRCb3VuZHMoMCwgMCwgNTAwLCA1MDApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQotCXRleHQuYXBwZW5kKCJMaW5lMSIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMSk7Ci0JU3RyaW5nIG5ld1RleHQgPSAiTGluZS0xXHJcbiI7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCwwKTsKLQl0ZXh0Lmluc2VydChuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDEpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDApOwotCXRleHQuc2V0U2VsZWN0aW9uKDgsOCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldExvY2F0aW9uKCkgewotCS8vIGFjY291bnQgZm9yIGluc2V0cyB3aGVuIGFzc2VydGluZwotCXRleHQuc2V0U2l6ZSgyMDAsNTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDAsMCk7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnggPj0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueSA+PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUxXHJcbkxpbmUyIik7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnggPj0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueSA+PSAwKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxLDEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnggPiAwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS55ID49IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0UG9zaXRpb24oKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldFBvc2l0aW9uKCkgPT0gMCk7Ci0JdGV4dC5hcHBlbmQoIjEyMyIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpID09IDcpOwotCXRleHQuc2V0U2VsZWN0aW9uKDEsMyk7Ci0JdGV4dC5pbnNlcnQoIjEyMyIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpID09IDQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoYXJDb3VudCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NSIgKyBkZWxpbWl0ZXJTdHJpbmcrIjY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExICArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7IC8vbWlnaHQgYmUgYm9ndXMgb24gVU5JWAotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNFx0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDEyLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQotCS8vCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NSIgKyBkZWxpbWl0ZXJTdHJpbmcrIjY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExICArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7IC8vbWlnaHQgYmUgYm9ndXMgb24gVU5JWAotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNFx0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDEyLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQl0ZXh0LnNldFRleHQoIjAxMjM0NSIrIGRlbGltaXRlclN0cmluZyArICI2Nzg5MCIpOwotCQlhc3NlcnRFcXVhbHMoMTEgICsgZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldENoYXJDb3VudCgpKTsgLy9taWdodCBiZSBib2d1cyBvbiBVTklYCi0JfQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCWlmICghU3d0SnVuaXQuaXNBSVgpIHsJCi0JCXRleHQuc2V0VGV4dCgiMDEyMzRcdDU2Nzg5MCIpOwotCQlhc3NlcnRFcXVhbHMoMTIsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQoKSB7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLQkKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFY2hvQ2hhcigpIHsKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRFY2hvQ2hhcignYScpOwotCWFzc2VydEVxdWFscygnYScsIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWRpdGFibGUoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQ291bnQoKSB7Ci0JdGV4dC5zZXRCb3VuZHMoMCwgMCwgNTAwLCA1MDApOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuYXBwZW5kKCJkZGFzZGFzZGFzZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygzLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuYXBwZW5kKCJkZGRhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkYXNkYXNkYXNkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JU3RyaW5nIGRlbGltaXRlciA9IHRleHQuZ2V0TGluZURlbGltaXRlcigpOwotCWlmIChwbGF0Zm9ybS5lcXVhbHMoIndpbjMyIikpIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVsaW1pdGVyLmVxdWFscygiXHJcbiIpKTsKLQl9IGVsc2UgaWYgKHBsYXRmb3JtLmVxdWFscygibW90aWYiKSkgewotCQlhc3NlcnRUcnVlKCI6YToiLCBkZWxpbWl0ZXIuZXF1YWxzKCJcbiIpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUhlaWdodCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVIZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWVudGF0aW9uKCkgewotCS8vIHRlc3RlZCBpbiBzZXRPcmllbnRhdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDIpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMikpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMykpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAzKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAxMSkpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgzLCAxMSkpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDQsIDQpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgxMSwgMTEpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDIpKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09OSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzXG40NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEyKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25UZXh0KCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCA3KTsKLQlhc3NlcnRFcXVhbHMoIjM0NTYiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFicygpIHsKLQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7Ci0JCS8vIEFQSSBub3Qgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMgKGUuZy4sIE1vdGlmKQotCQl0ZXh0LnNldFRhYnMoMSk7Ci0JCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGFicygpID09IDEpOwotCQl0ZXh0LnNldFRhYnMoOCk7Ci0JCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGFicygpID09IDgpOwotCQl0ZXh0LnNldFRleHQoIkxpbmVcdDFcclxuIik7Ci0JCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGFicygpID09IDgpOwotCQl0ZXh0LnNldFRhYnMoNyk7Ci0JCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGFicygpID09IDcpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JU3RyaW5nIHN0cmluZyA9ICIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nICsgIjY3ODkwIjsKLQl0ZXh0LnNldFRleHQoc3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoc3RyaW5nLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dElJKCkgewotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCQotCXRleHQuc2V0VGV4dCgiYSIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjM0NSIsIHRleHQuZ2V0VGV4dCgzLCA1KSk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFRleHQoLTEsIDIpKTsKLQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDUsIDMpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0RWNob0NoYXIoJyonKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQkKLQl0ZXh0LnNldFRleHQoImEiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIzNDUiLCB0ZXh0LmdldFRleHQoMywgNSkpOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRUZXh0KC0xLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCg1LCAzKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRMaW1pdCgpIHsKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0JdGV4dC5zZXRTaXplKDUwLHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl0ZXh0LmFwcGVuZChkZWxpbWl0ZXJTdHJpbmcgKyIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDE3KTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BQaXhlbCgpIHsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUwYVxyXG4iKTsKLQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0yKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpKTsKLQl0ZXh0LnNldFNpemUoMTAsIHRleHQuZ2V0TGluZUhlaWdodCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdGV4dC5zZXRCb3VuZHMoMCwgMCwgNTAwLCA1MDApOwotCXRyeSB7Ci0JCXRleHQuaW5zZXJ0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydEVxdWFscygiZnJoZWxtdXRlZCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5pbnNlcnQoZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0Lmluc2VydCgiZnJlZCIpOwotCWFzc2VydEVxdWFscygiZnJlZCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQl0ZXh0Lmluc2VydCgiaGVsbXV0Iik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmhlbG11dGVkIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5pbnNlcnQoVGV4dC5ERUxJTUlURVIpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0cnkgewotCQl0ZXh0Lmluc2VydChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBvbiBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCS8vIG92ZXJyaWRpbmcgdGVzdF9pc1Zpc2libGUoKSBmcm9tIENvbnRyb2wKLQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmlzVmlzaWJsZSgpKTsgIAotCi0JY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQotCWlmICghU3d0SnVuaXQuaXNBSVgpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIGJlIHZpc2libGUiLCBjb250cm9sLmlzVmlzaWJsZSgpKTsKLQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgbm90IGJlIHZpc2libGUiLCAhY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bhc3RlKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjIzMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMyk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMjMwMjMxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwIiArIGRlbGltaXRlclN0cmluZyArICIxIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwIiArIGRlbGltaXRlclN0cmluZyArICIxIiArICIwIiArIGRlbGltaXRlclN0cmluZyArICIxIiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjIzMDIzMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQucGFzdGUoKTsKLQotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscygiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIgKyAiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRNb2RpZnlMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRWZXJpZnlMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQkJCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0VGV4dCgiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQkJdGV4dC5jdXQoKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFooKSB7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFY2hvQ2hhckMoKSB7Ci0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKyl7Ci0JCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIGkpOwotCQlhc3NlcnRFcXVhbHMoKGNoYXIpaSwgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQl9Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RWNob0NoYXIoJ2EnKTsKLQlhc3NlcnRFcXVhbHMoJ2EnLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCi0JdGV4dC5zZXRFY2hvQ2hhcigoY2hhcikgMCk7Ci0JYXNzZXJ0RXF1YWxzKChjaGFyKTAsIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0KLQl0ZXh0LnNldEVjaG9DaGFyKCdcbicpOwotCWFzc2VydEVxdWFscygnXG4nLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCi0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKXsKLQkJdGV4dC5zZXRFY2hvQ2hhcigoY2hhcikgaSk7Ci0JCWFzc2VydEVxdWFscygoY2hhcilpLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0YWJsZVooKSB7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRm9udERhdGEgZm9udERhdGEgPSB0ZXh0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCWludCBsaW5lSGVpZ2h0OwotCUZvbnQgZm9udDsKLQkKLQlmb250ID0gbmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgOCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQl0ZXh0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDEyLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgPiBsaW5lSGVpZ2h0ICYmIGZvbnQuZXF1YWxzKHRleHQuZ2V0Rm9udCgpKSk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQl0ZXh0LnNldE9yaWVudGF0aW9uKFNXVC5SSUdIVF9UT19MRUZUKTsKLQlpZiAoKHRleHQuZ2V0U3R5bGUoKSAmIFNXVC5NSVJST1JFRCkgIT0gMCkgewotCQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldE9yaWVudGF0aW9uKCk9PVNXVC5SSUdIVF9UT19MRUZUKTsKLQl9Ci0JdGV4dC5zZXRPcmllbnRhdGlvbihTV1QuTEVGVF9UT19SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRPcmllbnRhdGlvbigpPT1TV1QuTEVGVF9UT19SSUdIVCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQl0ZXh0LnNldFJlZHJhdyhmYWxzZSk7Ci0JdGV4dC5zZXRSZWRyYXcodHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgNyk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2IiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDApOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbklJKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMDApOwotCWFzc2VydEVxdWFscyg5LCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzIiArIGRlbGltaXRlclN0cmluZyArIjQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMDApOwotCWFzc2VydEVxdWFscyg5ICsgZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjMiKyBkZWxpbWl0ZXJTdHJpbmcrIjQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKDkgK2RlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl0ZXh0LnNldFRleHQoImRzZHNkYXNkc2xhYXNkYXMiKTsKLQl0cnkgewotCQl0ZXh0LnNldFNlbGVjdGlvbigoUG9pbnQpIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDIpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIsIDIpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAzKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgzLCAxMSksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoNCwgNCksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24oMTAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDExLCAxMSksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoImRzZHNkYXNkc2xhYXNkYXMiKTsKLQl0cnkgewotCQl0ZXh0LnNldFNlbGVjdGlvbigoUG9pbnQpIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDIpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIsIDIpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAzKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgzLCAxMSksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDQsIDQpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxMSwgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUYWJzSSgpIHsKLQlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0JCQl0ZXh0LnNldFRhYnMoaSk7Ci0JCQlhc3NlcnRFcXVhbHMoOCwgdGV4dC5nZXRUYWJzKCkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQkJdGV4dC5zZXRUYWJzKGkpOwotCQkJYXNzZXJ0RXF1YWxzKGksIHRleHQuZ2V0VGFicygpKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotCi0JdGV4dC5zZXRUZXh0TGltaXQoVGV4dC5MSU1JVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSBUZXh0LkxJTUlUKTsKLQotCXRyeSB7Ci0JCXRleHQuc2V0VGV4dExpbWl0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQl0ZXh0LnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0VGV4dCgiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZysgIjY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZyArIjY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjM0NSIsIHRleHQuZ2V0VGV4dCgzLCA1KSk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFRleHQoLTEsIDIpKTsKLQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDUsIDMpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwgMTApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgxLCAwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCkgewotCWludCBudW1iZXIgPSAxMDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LmFwcGVuZCgiMDEyMzRcbiIpOwotCX0KLQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscyhpLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCX0KLQkKLQl0ZXh0LnNldFRvcEluZGV4KG51bWJlcis1KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5hcHBlbmQoVGV4dC5ERUxJTUlURVIgKyIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDE3KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQotCXRleHQuc2V0VGV4dCgiIik7CQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdGV4dC5hcHBlbmQoIjAxMjM0IiArIFRleHQuREVMSU1JVEVSKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LnNldFRvcEluZGV4KGkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JCi0JLy8gdGhpcyBtZXRob2QgdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0TGluZU51bWJlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRQb3NpdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hhckNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVjaG9DaGFyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lRGVsaW1pdGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFicyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcEluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BQaXhlbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVjaG9DaGFyQyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdGFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmllbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlZHJhd1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NsZWFyU2VsZWN0aW9uIikpIHRlc3RfY2xlYXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0TGluZU51bWJlciIpKSB0ZXN0X2dldENhcmV0TGluZU51bWJlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRMb2NhdGlvbiIpKSB0ZXN0X2dldENhcmV0TG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0UG9zaXRpb24iKSkgdGVzdF9nZXRDYXJldFBvc2l0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGFyQ291bnQiKSkgdGVzdF9nZXRDaGFyQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpKSB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWNob0NoYXIiKSkgdGVzdF9nZXRFY2hvQ2hhcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdGFibGUiKSkgdGVzdF9nZXRFZGl0YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUNvdW50IikpIHRlc3RfZ2V0TGluZUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lRGVsaW1pdGVyIikpIHRlc3RfZ2V0TGluZURlbGltaXRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUhlaWdodCIpKSB0ZXN0X2dldExpbmVIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uVGV4dCIpKSB0ZXN0X2dldFNlbGVjdGlvblRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYnMiKSkgdGVzdF9nZXRUYWJzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dElJIikpIHRlc3RfZ2V0VGV4dElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0TGltaXQiKSkgdGVzdF9nZXRUZXh0TGltaXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcEluZGV4IikpIHRlc3RfZ2V0VG9wSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcFBpeGVsIikpIHRlc3RfZ2V0VG9wUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Bhc3RlIikpIHRlc3RfcGFzdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWiIpKSB0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVjaG9DaGFyQyIpKSB0ZXN0X3NldEVjaG9DaGFyQygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdGFibGVaIikpIHRlc3Rfc2V0RWRpdGFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUYWJzSSIpKSB0ZXN0X3NldFRhYnNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGltaXRJIikpIHRlc3Rfc2V0VGV4dExpbWl0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJbmRleEkiKSkgdGVzdF9zZXRUb3BJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRleHQgdGV4dDsKLVN0cmluZyBkZWxpbWl0ZXJTdHJpbmc7Ci0KLS8qKgotICogQ2xlYW4gdXAgdGhlIGVudmlyb25tZW50IGZvciBhIG5ldyB0ZXN0LgotICogCi0gKiBAcGFyYW0gc2luZ2xlIHRydWUgaWYgdGhlIG5ldyB0ZXh0IHdpZGdldCBzaG91bGQgYmUgc2luZ2xlLWxpbmUuCi0gKi8KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICggdGV4dCAhPSBudWxsICkgdGV4dC5kaXNwb3NlKCk7Ci0KLQlpZiAoIHNpbmdsZSA9PSB0cnVlICkKLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuU0lOR0xFKTsJCi0JZWxzZQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCWRlbGltaXRlclN0cmluZyA9IFRleHQuREVMSU1JVEVSOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JdGV4dCA9IChUZXh0KXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5KCkgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJ2EnLCAwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCA1MCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyNjI2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0b29sQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCW5ldyBUb29sQmFyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRvb2xJdGVtIHRpOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0b29sQmFyLmdldEl0ZW1Db3VudCgpPT1pKTsKLQkgIAl0aSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVG9vbEl0ZW1bXSBpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIsIHRvb2xCYXIuZ2V0SXRlbShpKT09aXRlbXNbaV0pOwotCX0KLQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgMCk7Ci0JbnVtYmVyID0gNTsKLQlpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCXRyeSB7Ci0JCXRvb2xCYXIuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUb29sSXRlbVtdIGl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0b29sQmFyLmdldEl0ZW1zKCkpOwotCQotCXRvb2xCYXIuZ2V0SXRlbXMoKVswXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUb29sSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdG9vbEJhci5nZXRJdGVtcygpKTsKLQotCXRvb2xCYXIuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUb29sSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0b29sQmFyLmdldEl0ZW1zKCkpOwotCi0JdG9vbEJhci5nZXRJdGVtcygpWzFdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRvb2xJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzNdfSwgdG9vbEJhci5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb3dDb3VudCgpIHsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5XUkFQKTsKLQlpbnQgbnVtYmVyID0gNTsKLQlUb29sSXRlbVtdIGl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiArIHRvb2xCYXIuZ2V0Um93Q291bnQoKSwgdG9vbEJhci5nZXRSb3dDb3VudCgpPT1udW1iZXIpOyAgLy8/Pz8/ICBiZWNhdXNlIG9mIFNpemUoMCwgMCkKLQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgMCk7Ci0JbnVtYmVyID0gNTsKLQlpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWFzc2VydFRydWUoIjphOiIsIHRvb2xCYXIuZ2V0Um93Q291bnQoKT09MSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JVG9vbEl0ZW1bXSB0aXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRvb2xCYXIuaW5kZXhPZih0aXNbaV0pPT1pKTsKLQl9Ci0KLQludW1iZXIgPSAxMDsKLQl0aXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdHJ5IHsKLQkJCXRvb2xCYXIuaW5kZXhPZihudWxsKTsJCQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdG9vbEl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb3dDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um93Q291bnQiKSkgdGVzdF9nZXRSb3dDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUb29sQmFyIHRvb2xCYXI7Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUb29sQmFyKFZlY3RvciBldmVudHMpIHsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIlRvb2xCYXIiICsgaSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRvb2xJdGVtIFRvb2xUaXAiICsgaSk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlzZXRXaWRnZXQodG9vbEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAxNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMjAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzI0YjAxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCXRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOyAKLQlzZXRXaWRnZXQodG9vbEl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJKCkgewotCXRyeSB7Ci0JCW5ldyBUb29sSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREaXNhYmxlZEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREaXNhYmxlZEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RW5hYmxlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvdEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIb3RJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtLmdldFNlbGVjdGlvbigpCi0Jd2FyblVuaW1wbCggIlRlc3QgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS50ZXN0XzVfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0JdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdG9vbEl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdG9vbEl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2lkdGgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdpZHRoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtLmlzRW5hYmxlZCgpCi0Jd2FyblVuaW1wbCggIlRlc3QgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS50ZXN0XzdfaXNFbmFibGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0uc2V0RW5hYmxlZChib29sZWFuKQotCXdhcm5VbmltcGwoICJUZXN0IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0udGVzdF84X3NldEVuYWJsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNhYmxlZEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3RJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKSkgdGVzdF9nZXREaXNhYmxlZEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG90SW1hZ2UiKSkgdGVzdF9nZXRIb3RJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdpZHRoIikpIHRlc3RfZ2V0V2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbloiKSkgdGVzdF9zZXRTZWxlY3Rpb25aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXaWR0aEkiKSkgdGVzdF9zZXRXaWR0aEkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Ub29sQmFyIHRvb2xCYXI7Ci1Ub29sSXRlbSB0b29sSXRlbTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJkMTdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyYWNrZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyYWNrZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyYWNrZXIgPSBuZXcgVHJhY2tlcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHRyYWNrZXIpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlY3RhbmdsZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJlY3RhbmdsZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGlwcGxlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RpcHBsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3RpcHBsZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTdGlwcGxlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZWN0YW5nbGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGlwcGxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3RpcHBsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2UiKSkgdGVzdF9jbG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVjdGFuZ2xlcyIpKSB0ZXN0X2dldFJlY3RhbmdsZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0aXBwbGVkIikpIHRlc3RfZ2V0U3RpcHBsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIikpIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTdGlwcGxlZFoiKSkgdGVzdF9zZXRTdGlwcGxlZFooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi0JVHJhY2tlciB0cmFja2VyOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTI1YzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0cmVlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXRyZWUgPSBuZXcgVHJlZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkJPUkRFUn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBjYXNlc1tpXSk7Ci0KLQljYXNlcyA9IG5ldyBpbnRbXXswLCAxMCwgMTAwfTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGNhc2VzW2pdLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQkJdHJlZS5yZW1vdmVBbGwoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s1XSwgaXRlbXNbMTBdfSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbkNvdW50KCkgewotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygzLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygyLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbkkoKSB7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhjb2x1bW4wLCB0cmVlLmdldENvbHVtbigwKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCB0cmVlLmdldENvbHVtbigxKSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1ucygpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCwgMSk7Ci0JY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygyLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzFdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQljb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbHVtbnMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgY29sdW1uc1swXSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpIHsKLQl0cmVlLmdldEdyaWRMaW5lV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SGVhZGVySGVpZ2h0KCkpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0SGVhZGVySGVpZ2h0KCkgPiAwKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEhlYWRlckhlaWdodCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEhlYWRlclZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiBJdGVtIGhlaWdodCBpcyAwIiwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLQluZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IEl0ZW0gaGVpZ2h0IGlzIDAiLCB0cmVlLmdldEl0ZW1IZWlnaHQoKSA+IDApOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnRbXSBjYXNlcyA9IHswLCAxMCwgMTAwfTsKLQlUcmVlSXRlbSBbXVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtIFtjYXNlcy5sZW5ndGhdW107Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlpdGVtcyBbal0gPSBuZXcgVHJlZUl0ZW0gW2Nhc2VzIFtqXV07Ci0JfQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQkJCWl0ZW1zIFtqXVtpXSA9IHRpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpdGVtc1tqXSwgdHJlZS5nZXRJdGVtcygpKTsKLQkJdHJlZS5yZW1vdmVBbGwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCQl0aS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJfQotCQlUcmVlSXRlbVtdIGl0ZW1zMiA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtczIubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKSwgaXRlbXMyW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdHJlZS5yZW1vdmVBbGwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lc1Zpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCWFzc2VydE51bGwodHJlZS5nZXRQYXJlbnRJdGVtKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyBUZXN0ZWQgaW4gc2V0U2VsZWN0aW9uLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygxNSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOyAvLyB1c2Ugc2luZ2xlLXNlbGVjdGlvbiB0cmVlLgotCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSXRlbSgpIHsKLS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JdHJlZS5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlpbnQgbnVtYmVyID0gMjA7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCWludCBudW1iZXIgPSA1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRyZWUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOyAvLyBzaW5nbGUtc2VsZWN0aW9uIHRyZWUKLQkJCi0JaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRyZWUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVooKSB7Ci0JYXNzZXJ0RmFsc2UodHJlZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKHRyZWUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbikgewotCQkvLyBjYXJib24gZG9lcyBub3Qgc3VwcG9ydCBsaW5lcwotCQl0cmVlLmdldExpbmVzVmlzaWJsZSgpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydEZhbHNlKHRyZWUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodHJlZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKHRyZWUuZ2V0TGluZXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlZHJhd1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCWludCBudW1iZXIgPSAyMDsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1sxNl0sIGl0ZW1zWzE5XX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1sxNl0sIGl0ZW1zWzE5XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoaXRlbXMsIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKHRyZWUuZ2V0SXRlbXMoKSk7Ci0JYXNzZXJ0U2FtZSh0cmVlLmdldEl0ZW1zKCksIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyeSB7Ci0JCXRyZWUuc2V0U2VsZWN0aW9uKChUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117bnVsbH0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxMF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1syXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1sxMF0sIGl0ZW1zW251bWJlciAtIDFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117aXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnJlbW92ZUFsbCgpOwotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7IC8vIHNpbmdsZS1zZWxlY3Rpb24gdHJlZQotCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1sxNl0sIGl0ZW1zWzE5XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbih0cmVlLmdldEl0ZW1zKCkpOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge30pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJ5IHsKLQkJdHJlZS5zZXRTZWxlY3Rpb24oKFRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyA9PSBudWxsIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzEwXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbbnVtYmVyLTFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbM10sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnJlbW92ZUFsbCgpOwotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0JdHJlZS5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsJCi0JfQotCVRyZWVJdGVtIHRvcCA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsJCi0JfQotCXRyZWUuc2V0U2l6ZSg1MCw1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXRyZWUuc2V0VG9wSXRlbSh0b3ApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwkKLQl9Ci0JVHJlZUl0ZW0gdG9wMiA9IHRyZWUuZ2V0VG9wSXRlbSgpOwotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydEVxdWFscyh0b3AsIHRvcDIpOwotCXRyeSB7Ci0JCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0VG9wSXRlbShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlzaGVsbC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0JdHJ5IHsKLQkJdHJlZS5zaG93SXRlbShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnQgbnVtYmVyID0gMjA7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCWZvcihpbnQgaT0wOyBpPG51bWJlcjsgaSsrKQotCQl0cmVlLnNob3dJdGVtKGl0ZW1zW2ldKTsKLQotCXRyZWUucmVtb3ZlQWxsKCk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JLy9zaG93aW5nIHNvbWVib2R5IGVsc2UncyBpdGVtcwotCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl9Ci0KLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIDApOwotCVRyZWVJdGVtW10gaXRlbXMyID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtczJbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZTIsIDApOwotCX07Ci0KLQlmb3IoaW50IGk9MDsgaTxudW1iZXI7IGkrKykKLQkJdHJlZS5zaG93SXRlbShpdGVtczJbaV0pOwotCi0JdHJlZS5yZW1vdmVBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCVRyZWVJdGVtIGl0ZW07Ci0JCi0JdHJlZS5zaG93U2VsZWN0aW9uKCk7Ci0JaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtfSk7Ci0JdHJlZS5zaG93U2VsZWN0aW9uKCk7CQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmlkTGluZVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlclZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIikpIHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5Db3VudCIpKSB0ZXN0X2dldENvbHVtbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5JIikpIHRlc3RfZ2V0Q29sdW1uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1ucyIpKSB0ZXN0X2dldENvbHVtbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyaWRMaW5lV2lkdGgiKSkgdGVzdF9nZXRHcmlkTGluZVdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJIZWlnaHQiKSkgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlYWRlclZpc2libGUiKSkgdGVzdF9nZXRIZWFkZXJWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lc1Zpc2libGUiKSkgdGVzdF9nZXRMaW5lc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcEl0ZW0iKSkgdGVzdF9nZXRUb3BJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIikpIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aIikpIHRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVzVmlzaWJsZVoiKSkgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4iKSkgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKSkgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFRyZWUgdHJlZTsKLQotLyoqCi0gKiBDbGVhbiB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIGEgbmV3IHRlc3QuCi0gKiAKLSAqIEBwYXJhbSBzaW5nbGUgdHJ1ZSBpZiB0aGUgbmV3IHRyZWUgc2hvdWxkIGJlIGEgc2luZ2xlLXNlbGVjdGlvbiBvbmUsCi0gKiBvdGhlcndpc2UgdXNlIG11bHRpLXNlbGVjdGlvbi4KLSAqLwotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KGJvb2xlYW4gc2luZ2xlKSB7Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci0JaWYgKHRyZWUgIT0gbnVsbCkgdHJlZS5kaXNwb3NlKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBzaW5nbGU/U1dULlNJTkdMRTpTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0cmVlKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWUoVmVjdG9yIGV2ZW50cykgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIlRyZWVJdGVtIiArIGkpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJdGkuc2V0VGV4dCgiVHJlZUl0ZW0iICsgaSArIGopOwotCQkJaG9va0V4cGVjdGVkRXZlbnRzKHRpLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCQl9Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAzMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTEsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGludCBjb2RlPVNXVC5BUlJPV19SSUdIVDsKLSAgICBpZihTd3RKdW5pdC5pc0dUSykKLSAgICAgICAgY29kZSA9IFNXVC5LRVlQQURfQUREOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgY29kZSwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0cmVlLmdldEl0ZW1IZWlnaHQoKSoyLCAxLCAwLCAKLSAgICAgICAgICAgIAkgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmMGU1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuU0lOR0xFKTsJCQotCXRyZWVDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCk7CQotCXNldFdpZGdldCh0cmVlQ29sdW1uKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbihudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4obnVsbCwgU1dULk5VTEwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA9PSAtMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl0cmVlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QWxpZ25tZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYXJlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZXNpemFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJlc2l6YWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpZHRoKCkgewotCWludCB0ZXN0V2lkdGggPSA0MjsKLQkKLS8vCXRyeSB7Ci0vLwkJdHJlZUNvbHVtbi5zZXRXaWR0aCgtMSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIGZhbHNlKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotLy8JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgdGhyb3duOiAiICsgZSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJBcmd1bWVudCBub3QgdmFsaWQiKSk7Ci0vLwl9Ci0KLQl0cmVlQ29sdW1uLnNldFdpZHRoKDApOwotCWFzc2VydFRydWUoIjphOiB3aWR0aD0iICsgdHJlZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIDAsIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSA9PSAwKTsKLQotCXRyZWVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yjogd2lkdGg9IiArIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyB0ZXN0V2lkdGgsIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotCi0JdHJlZUNvbHVtbi5zZXRXaWR0aCh0ZXN0V2lkdGgpOwotCWFzc2VydFRydWUoIjpjOiB3aWR0aD0iICsgdHJlZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdHJlZUNvbHVtbi5nZXRXaWR0aCgpID09IHRlc3RXaWR0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFjayBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fX07Ci0KLQl0cmVlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJlZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQkKLQl0cmVlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJ5IHsKLQkJdHJlZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbGlnbm1lbnRJKCkgewotCVRyZWVDb2x1bW4gY29sdW1uMjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0cmVlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRyZWVDb2x1bW4uc2V0QWxpZ25tZW50KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0cmVlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRyZWVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIjpjOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2V0IGFsaWdubWVudCBvZiB0aGUgZmlyc3QgY29sdW1uIiwgCi0JCXRyZWVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OVUxMKTsKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULlJJR0hUKTsKLQkKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5DRU5URVIpOwkKLQotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZXNpemFibGVaKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci0KLQl0cmVlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0cmVlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0cmVlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0cmVlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHRyZWVDb2x1bW4uZ2V0VGV4dCgpLCAiIik7Ci0KLQl0cmVlQ29sdW1uLnNldFRleHQoInRleHQiKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHRyZWVDb2x1bW4uZ2V0VGV4dCgpLCAidGV4dCIpOwotCi0JdHJ5IHsKLQkJdHJlZUNvbHVtbi5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2x1bW4gaGVhZGVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZXNpemFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVzaXphYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbGlnbm1lbnQiKSkgdGVzdF9nZXRBbGlnbm1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVzaXphYmxlIikpIHRlc3RfZ2V0UmVzaXphYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXaWR0aCIpKSB0ZXN0X2dldFdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrIikpIHRlc3RfcGFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVzaXphYmxlWiIpKSB0ZXN0X3NldFJlc2l6YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRyZWVDb2x1bW4gdHJlZUNvbHVtbjsKLXByb3RlY3RlZCBUcmVlIHRyZWU7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQwNmIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVJdGVtKChUcmVlSXRlbSludWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7CQotCX0KLQlhc3NlcnRFcXVhbHMoMTEsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgNSk7CQotCWFzc2VydEVxdWFscygxMiwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSSgpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JfQotCWFzc2VydEVxdWFscygxMCwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUsIDUpOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUsIDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCVN0cmluZyBzdHJpbmcgPSAiaGVsbG8iOwotCQotCS8vIG5vIGNvbHVtbnMKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBleHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBleHRlbnQueCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxYzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSByZWN0LmhlaWdodCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBib3VuZHMueCA+PSBib3VuZHMyLnggKyBib3VuZHMyLndpZHRoKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxZjoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFnOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCQotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxaDoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gZXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gZXh0ZW50LngpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWk6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gcmVjdC5oZWlnaHQpOwotCWJvdW5kczIgPSBzdWJJdGVtLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxajoiLCBib3VuZHMueCA+PSBib3VuZHMyLnggKyBib3VuZHMyLndpZHRoKTsKLQkKLQkvLyBUT0RPIG5vIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JLy8gVE9ETyB3aXRoIGNvbHVtbnMKLQkvLyBUT0RPIHdpdGggY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLX0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJQSgpIHsJCi0JLy8gbm8gY29sdW1ucyAtIHBsYWluIHN0eWxlCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZyA9ICJoZWxsbyI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgc3RyaW5nRXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZzoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gc3RyaW5nRXh0ZW50LngpOwkKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxaDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JLy9hc3NlcnRUcnVlKCI6MW5ldzoiLCBib3VuZHMuZXF1YWxzKGJvdW5kczIpKTsgLy8gVE9ETyBzaG91bGQgYm91bmRzIGJlIGVxdWFsPwotCXRyZWVJdGVtLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFrOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPj0gaW1hZ2VCb3VuZHMud2lkdGgpOwotCXRyZWVJdGVtLnNldEltYWdlKChJbWFnZSludWxsKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxbDoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0vLwlhc3NlcnRUcnVlKCI6MW06IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7IC8vIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLSAJCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRyZWVJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFuOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6MW86IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFwIiwgYm91bmRzMi53aWR0aCA+PSBzdHJpbmdFeHRlbnQueCArIGltYWdlQm91bmRzLndpZHRoICYmIGJvdW5kczIuaGVpZ2h0ID49IE1hdGgubWF4KHN0cmluZ0V4dGVudC55LCBpbWFnZUJvdW5kcy5oZWlnaHQpKTsKLX0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJQigpIHsKLQkvLyBubyBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcgPSAiaGVsbG8iOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCVRyZWUgdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoyYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtMiwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmY6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0yLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJnOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7CQotCi0JdHJlZUl0ZW0yLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyaDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygpOwotCS8vYXNzZXJ0VHJ1ZSgiOjJuZXc6IiwgYm91bmRzLmVxdWFscyhib3VuZHMyKSk7IC8vIFRPRE8gc2hvdWxkIGJvdW5kcyBiZSBlcXVhbD8KLQl0cmVlSXRlbTIuc2V0VGV4dCgiIik7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJpOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6Mmo6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7Ci0JCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JdHJlZUl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyazoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID49IGltYWdlQm91bmRzLndpZHRoKTsKLQl0cmVlSXRlbTIuc2V0SW1hZ2UoKEltYWdlKW51bGwpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoybDoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JLy9hc3NlcnRUcnVlKCI6Mm06IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7ICAvLyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0JCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCXRyZWVJdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJuOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6Mm86IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFwIiwgYm91bmRzMi53aWR0aCA+PSBzdHJpbmdFeHRlbnQueCArIGltYWdlQm91bmRzLndpZHRoICYmIGJvdW5kczIuaGVpZ2h0ID49IE1hdGgubWF4KHN0cmluZ0V4dGVudC55LCBpbWFnZUJvdW5kcy5oZWlnaHQpKTsKLX0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJQygpIHsKLQkvLyB3aXRoIGNvbHVtbnMKLQkKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlTdHJpbmcgc3RyaW5nMSA9ICJoZWxsbyI7Ci0JU3RyaW5nIHN0cmluZzIgPSAid29ybGQiOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudDEgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nMSk7Ci0JLy9Qb2ludCBzdHJpbmdFeHRlbnQyID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzIpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozYjoiLCAvKmJvdW5kcy54ID4gMCAmJiovIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsgLy8gVE9ETyBib3VuZHMueCA9PSAwIElzIHRoaXMgcmlnaHQ/Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMik7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNmOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2g6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPT0gMCk7CQotCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7CQotCi0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2w6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNtOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M246IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M286IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCXRyZWVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNwOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNxOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozcjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3M6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLSAJdHJlZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjN0OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozdToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3Y6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3c6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZzEpOwotCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjN4OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMCk7Ci19Ci0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJRCgpIHsKLQkvLyB3aXRoIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZzEgPSAiaGVsbG8iOwotCVN0cmluZyBzdHJpbmcyID0gIndvcmxkIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQxID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzEpOwotCS8vUG9pbnQgc3RyaW5nRXh0ZW50MiA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcyKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0YjoiLCAvKmJvdW5kcy54ID4gMCAmJiovIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsgLy8gVE9ETyBib3VuZHMueCA9PSAwIElzIHRoaXMgcmlnaHQ/Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JLy8gdW5leHBhbmRlZCBpdGVtCi0JVHJlZUl0ZW0gc3ViSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0yLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZToiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID09IDApOwkKLQkKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0ajoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGs6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7CQotCi0JCi0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRsOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NG06IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAyMDApOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRuOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0bzoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdHJlZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0cDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHE6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0czoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0cmVlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0dDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjR1OiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JdHJlZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtpbWFnZSwgaW1hZ2V9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0djoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHc6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQoc3RyaW5nMSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0eDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCXRlc3RfZ2V0Qm91bmRzSUEoKTsKLQl0ZXN0X2dldEJvdW5kc0lCKCk7Ci0JdGVzdF9nZXRCb3VuZHNJQygpOwotCXRlc3RfZ2V0Qm91bmRzSUQoKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRDaGVja2VkWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV4cGFuZGVkKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3ViaXRlbSBiZWZvcmUgeW91IGNhbiBzZXQgdGhlIHRyZWVpdGVtIGV4cGFuZGVkCi0JbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyYXllZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRHcmF5ZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCkgewotLyoqCi0gKiBUZXN0IHdpdGhvdXQgaXRlbSBpbWFnZQotICovCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTlVMTCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JLy8gVE9ETyAtIHNob3VsZCB0aGlzIHdpZHRoIGJlIDAgb3IgYSB2YWx1ZT8KLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDEpKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JLy8gVE9ETyAtIHNob3VsZCB0aGlzIHdpZHRoIGJlIDAgb3IgYSB2YWx1ZT8KLQkvL2JvdW5kcyA9IHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsKLQkvL2Fzc2VydFRydWUoIjplOiIsIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsKLSAJLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwkKLQlpbnQgaW1hZ2VXaWR0aCA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOwotCWludCBpbWFnZUhlaWdodDsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0JaW1hZ2VIZWlnaHQgPSB0cmVlLmdldEl0ZW1IZWlnaHQoKSAtIHRyZWUuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDApOwotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA9PSBpbWFnZVdpZHRoICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwkKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMSkpOwkKLQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwkKLQkKLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIuZGlzcG9zZSgpOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5VTEwpOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsgCXRyZWVJdGVtMi5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0JaW1hZ2VIZWlnaHQgPSB0cmVlMi5nZXRJdGVtSGVpZ2h0KCkgLSB0cmVlMi5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsJLy8gYm91bmRzLndpZHRoIHNob3VsZCBiZSBjaGVjayBib3ggd2lkdGggaWYgdGhleSBhcmUgd2lkZXIgdGhhbiBpbWFnZQotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7Ci0vLyAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIuZGlzcG9zZSgpOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5VTEwpOwotCWltYWdlID0gaW1hZ2VzWzFdOwotCWltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2VXaWR0aCA9IGltYWdlQm91bmRzLndpZHRoOwotIAl0cmVlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotCWltYWdlSGVpZ2h0ID0gdHJlZTIuZ2V0SXRlbUhlaWdodCgpIC0gdHJlZTIuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLSAJYm91bmRzID0gdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiBjaGVjayBib3ggaXMgd2lkZXIgdGhhbiBpbWFnZQotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7Ci0gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaSwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIDApOwotCX0KLQlhc3NlcnRUcnVlKCJiOiAiLCB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JVHJlZUl0ZW0gW11bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbSBbY2FzZXMubGVuZ3RoXVtdOwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJaXRlbXMgW2pdID0gbmV3IFRyZWVJdGVtIFtjYXNlcyBbal1dOwotCX0KLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIDApOwotCQkJaXRlbXMgW2pdW2ldID0gdGk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zW2pdLCB0cmVlSXRlbS5nZXRJdGVtcygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlpdGVtcyBbal1baV0uZGlzcG9zZSgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHModHJlZSwgdHJlZUl0ZW0uZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0JVHJlZUl0ZW0gdEl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OVUxMKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0sIHRJdGVtLmdldFBhcmVudEl0ZW0oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dElMSmF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0cmVlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSx0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgYmx1ZSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0QmFja2dyb3VuZCgpLHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRyZWVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodHJlZUl0ZW0uZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSx0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENoZWNrZWRaKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQotCVRyZWUgdCA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHQsIFNXVC5OVUxMKTsKLQl0aS5zZXRDaGVja2VkKHRydWUpOwotCWFzc2VydFRydWUodGkuZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0aS5zZXRDaGVja2VkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRpLmdldENoZWNrZWQoKSk7Ci0JdC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kZWRaKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JCi0JLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3ViaXRlbSBiZWZvcmUgeW91IGNhbiBzZXQgdGhlIHRyZWVpdGVtIGV4cGFuZGVkCi0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQotCi0JbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTlVMTCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQkJCi0JVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OVUxMKTsKLQl0aS5zZXRFeHBhbmRlZCh0cnVlKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aS5nZXRFeHBhbmRlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnQgZm9udCA9IHRyZWVJdGVtLmdldEZvbnQoKTsKLQl0cmVlSXRlbS5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRyZWVJdGVtLmdldERpc3BsYXkoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdHJlZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoKSkpOwotCi0JdHJlZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyggdHJlZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0Rm9udChmb250KTsKLQkJdHJlZUl0ZW0uc2V0Rm9udChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRyZWVJdGVtLmdldERpc3BsYXkoKTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQkKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEZvbnQoKS5lcXVhbHMoIHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRGb250KDEwLCBmb250KTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgxMCkpKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQl0cmVlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAyMCwgU1dULk5PUk1BTCk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQl0cmVlSXRlbS5zZXRGb250KGZvbnQyKTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUoZm9udDIuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRGb250KG51bGwpOwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250Mi5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQkJdHJlZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0cmVlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgxMCkpOwotCQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSx0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgYmx1ZSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0Rm9yZWdyb3VuZCgpLHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRyZWVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodHJlZUl0ZW0uZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSx0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0R3JheWVkWigpIHsKLQlUcmVlIG5ld1RyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0SXRlbSA9IG5ldyBUcmVlSXRlbShuZXdUcmVlLDApOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdEl0ZW0uZ2V0R3JheWVkKCkpOwotCXRJdGVtLnNldEdyYXllZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdEl0ZW0uZ2V0R3JheWVkKCkpOwotCW5ld1RyZWUuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbCh0cmVlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0cmVlSXRlbS5zZXRJbWFnZSgtMSwgbnVsbCk7CQkKLQlhc3NlcnROdWxsKHRyZWVJdGVtLmdldEltYWdlKC0xKSk7CQotCQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsJCi0gCVN0cmluZyB0ZXh0c1tdID0gbmV3IFN0cmluZ1tpbWFnZXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCXRleHRzW2ldID0gU3RyaW5nLnZhbHVlT2YoaSk7Ci0JfQotCQotCS8vdHJlZS5zZXRUZXh0KHRleHRzKTsJCQkJLy8gY3JlYXRlIGVub3VnaCBjb2x1bW5zIGZvciBUcmVlSXRlbS5zZXRJbWFnZShJbWFnZVtdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IHRleHRzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKyl7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KHRleHRzW2ldKTsKLQl9Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMSwgaW1hZ2VzWzFdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzFdLCB0cmVlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpbWFnZXNbaV0sIHRyZWVJdGVtLmdldEltYWdlKGkpKTsKLQl9Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0SW1hZ2UoKEltYWdlIFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW1hZ2VzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRJbWFnZSgxMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDEwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlc1sxXSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JaW1hZ2VzWzBdLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldFRleHQoKFN0cmluZyBbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZ3MgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBoYXMgb25seSAKLSAJKiB0aGUgZGVmYXVsdCBjb2x1bW4uCi0gCSovCi0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCQotCXRyZWVJdGVtLnNldFRleHQoVGVzdFN0cmluZ3MpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nc1swXSwgdHJlZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dChpKS5sZW5ndGgoKSk7Ci0JfQotCQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUcmVlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0gCQkKLQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgaW1hZ2VzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspewotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKXsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZyA9ICJ0ZXN0IjsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZ3NbXSA9IG5ldyBTdHJpbmdbXSB7VGVzdFN0cmluZywgVGVzdFN0cmluZyArICIxIiwgVGVzdFN0cmluZyArICIyIn07Ci0KLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotIAl0cmVlSXRlbS5zZXRUZXh0KDEsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRyZWVJdGVtLnNldFRleHQoMCwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRyZWVJdGVtLmdldFRleHQoMCkpOwotIAl0cmVlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoLTEpLmxlbmd0aCgpKTsJCi0KLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQkvL3RyZWUuc2V0VGV4dChUZXN0U3RyaW5ncyk7CQkJCS8vIGNyZWF0ZSBhbm91Z2ggY29sdW1ucyBmb3IgVHJlZUl0ZW0uc2V0VGV4dChTdHJpbmdbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KFRlc3RTdHJpbmdzW2ldKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQotCi0JdHJlZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdHJlZUl0ZW0uZ2V0VGV4dCgxKSk7CQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0cmVlSXRlbS5nZXRUZXh0KDApKTsKLQotCi0JdHJlZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0KLQl0cnkgewotCQl0cmVlSXRlbS5zZXRUZXh0KC0xLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0VGV4dCgwLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCi0KLX0KLQotLy9wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLS8vCXRyeSB7Ci0vLwkJdHJlZUl0ZW0uc2V0VGV4dCgoU3RyaW5nKW51bGwpOwkJCi0vLwkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JfQotLy99Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGVja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHBhbmRlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmF5ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDaGVja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0R3JheWVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZEkiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzSSIpKSB0ZXN0X2dldEJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hlY2tlZCIpKSB0ZXN0X2dldENoZWNrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4cGFuZGVkIikpIHRlc3RfZ2V0RXhwYW5kZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250SSIpKSB0ZXN0X2dldEZvbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JheWVkIikpIHRlc3RfZ2V0R3JheWVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUJvdW5kc0kiKSkgdGVzdF9nZXRJbWFnZUJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSSIpKSB0ZXN0X2dldEltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SSIpKSB0ZXN0X2dldFRleHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENoZWNrZWRaIikpIHRlc3Rfc2V0Q2hlY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZGVkWiIpKSB0ZXN0X3NldEV4cGFuZGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0R3JheWVkWiIpKSB0ZXN0X3NldEdyYXllZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRyZWVJdGVtIHRyZWVJdGVtOwotVHJlZSB0cmVlOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoKSB7Ci0JaWYgKCB0cmVlSXRlbSAhPSBudWxsICkgdHJlZUl0ZW0uZGlzcG9zZSgpOwotCWlmICggdHJlZSAhPSBudWxsICkgdHJlZS5kaXNwb3NlKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCAwKTsKLQl0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQlzZXRXaWRnZXQodHJlZUl0ZW0pOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGMyOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1NXVEV2ZW50TGlzdGVuZXIoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXZlbnRMaXN0ZW5lcigpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBwdWJsaWMgbWV0aG9kcyAobm9uLUFQSSkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBwdWJsaWMgbWV0aG9kcyAobm9uLUFQSSkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFdmVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lciIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFdmVudExpc3RlbmVyIikpIHRlc3RfZ2V0RXZlbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTc4MjBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JLy8gVXNlIHRoaXMgdmFyaWFibGUgdG8gaGVscCB2YWxpZGF0ZSBjYWxsYmFja3MKLQlib29sZWFuIGxpc3RlbmVyQ2FsbGVkOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJYXNzZXJ0VHJ1ZSh3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLQl9Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJfQotCX07Ci0Jd2lkZ2V0LmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jd2lkZ2V0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCXdpZGdldC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJfQotCX07Ci0Jd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0Jd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVhckRvd24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BsYXkoKSB7Ci0JYXNzZXJ0RXF1YWxzKHdpZGdldC5nZXREaXNwbGF5KCksIHdpZGdldC5nZXREaXNwbGF5KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIHRoaXMgdGVzdCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBsZWFmIHN1YmNsYXNzZXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgd2lkZ2V0LmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3aWRnZXQubm90aWZ5TGlzdGVuZXJzKDAsIG51bGwpOwotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JR0MgZ2MgPSBudWxsOwotCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCWdjID0gZXZlbnQuZ2MgPSBuZXcgR0MoKENvbnRyb2wpd2lkZ2V0KTsKLQl9Ci0Jd2lkZ2V0Lm5vdGlmeUxpc3RlbmVycyhTV1QuUGFpbnQsIGV2ZW50KTsKLQlpZiAoZ2MgIT0gbnVsbCkgZ2MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JLy8gdGhpcyBtZXRob2QgaXMgZnVydGhlciB0ZXN0ZWQgYnkgYWxsIG9mIHRoZSByZW1vdmVUeXBlZExpc3RlbmVyIHRlc3RzCi0JdHJ5IHsKLQkJd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5QYWludCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0Jd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCX0KLQl9KTsKLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQl9Ci0JfTsKLQl3aWRnZXQuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0Jd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCgpIHsKLQl3aWRnZXQuc2V0RGF0YSh3aWRnZXQpOwotCWFzc2VydEVxdWFscyh3aWRnZXQsIHdpZGdldC5nZXREYXRhKCkpOwotCi0Jd2lkZ2V0LnNldERhdGEobnVsbCk7Ci0JYXNzZXJ0TnVsbCh3aWRnZXQuZ2V0RGF0YSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCgpIHsKLQl3aWRnZXQuc2V0RGF0YSgidGhlIHdpZGdldCIsIHdpZGdldCk7Ci0JYXNzZXJ0RXF1YWxzKHdpZGdldCwgd2lkZ2V0LmdldERhdGEoInRoZSB3aWRnZXQiKSk7Ci0KLQl3aWRnZXQuc2V0RGF0YSgidGhlIHdpZGdldCIsIG51bGwpOwotCWFzc2VydE51bGwod2lkZ2V0LmdldERhdGEoInRoZSB3aWRnZXQiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JYXNzZXJ0Tm90TnVsbCh3aWRnZXQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZSh3aWRnZXQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERpc3BsYXkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVEaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpKSB0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YSIpKSB0ZXN0X2dldERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzcGxheSIpKSB0ZXN0X2dldERpc3BsYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLXByaXZhdGUgV2lkZ2V0IHdpZGdldDsKLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0Jd2lkZ2V0ID0gdzsKLX0KLQotcHJvdGVjdGVkIHZvaWQgaG9va0xpc3RlbmVycyhXaWRnZXQgdywgaW50W10gdHlwZXMsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICB3LmFkZExpc3RlbmVyKHR5cGVzW2ldLCBsaXN0ZW5lcik7Ci0gICAgfQotfQotCi1wcm90ZWN0ZWQgU3RyaW5nW10gaG9va0V4cGVjdGVkRXZlbnRzKFN0cmluZyB0eXBlLCBmaW5hbCBqYXZhLnV0aWwuVmVjdG9yIGV2ZW50cykgewotICAgIHJldHVybiBob29rRXhwZWN0ZWRFdmVudHMod2lkZ2V0LCB0eXBlLCBldmVudHMpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nW10gaG9va0V4cGVjdGVkRXZlbnRzKFdpZGdldCB3LCBTdHJpbmcgdHlwZSwgZmluYWwgamF2YS51dGlsLlZlY3RvciBldmVudHMpIHsKLSAgICBTdHJpbmdbXSBleHBlY3RlZEV2ZW50cyA9IChTdHJpbmdbXSlDb25zaXN0ZW5jeVV0aWxpdHkuZXZlbnRPcmRlcmluZy5nZXQodHlwZSk7Ci0gICAgaG9va0V4cGVjdGVkRXZlbnRzKHcsIGV4cGVjdGVkRXZlbnRzLCBldmVudHMpOwotICAgIHJldHVybiBleHBlY3RlZEV2ZW50czsKLX0KLQotcHJvdGVjdGVkIHZvaWQgaG9va0V4cGVjdGVkRXZlbnRzKFdpZGdldCB3LCBTdHJpbmdbXSB0eXBlcywgZmluYWwgamF2YS51dGlsLlZlY3RvciBldmVudHMpIHsKLSAgICBob29rTGlzdGVuZXJzKHcsIENvbnNpc3RlbmN5VXRpbGl0eS5jb252ZXJ0RXZlbnROYW1lcyh0eXBlcyksIAotCSAgICAgICAgbmV3IExpc3RlbmVyKCkgewotCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBDb25zaXN0ZW5jeVV0aWxpdHkuZXZlbnROYW1lc1tlLnR5cGVdOwotCSAgICAgICAgICAgICAgICBpZihlLnR5cGUgPT0gU1dULlRyYXZlcnNlKQotCSAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiOiIrQ29uc2lzdGVuY3lVdGlsaXR5LmdldFRyYXZlcnNhbFR5cGUoZS5kZXRhaWwpOwotCSAgICAgICAgICAgICAgICBlbHNlIGlmKGUudHlwZSA9PSBTV1QuU2VsZWN0aW9uKQotCSAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiOiIrQ29uc2lzdGVuY3lVdGlsaXR5LmdldFNlbGVjdGlvblR5cGUoZS5kZXRhaWwpOwotICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKHRlbXApOwotCSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVtcCArIGUud2lkZ2V0KTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9KTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKLSAgICBTdHJpbmcgdGVzdCA9IGdldE5hbWUoKTsKLSAgICBpbnQgaW5kZXggPSB0ZXN0Lmxhc3RJbmRleE9mKCdfJyk7Ci0gICAgaWYoaW5kZXggIT0gLTEpCi0gICAgICAgIHRlc3QgPSB0ZXN0LnN1YnN0cmluZyhpbmRleCsxLCB0ZXN0Lmxlbmd0aCgpKTsKLSAgICBTdHJpbmcgY2xzcyA9IGdldENsYXNzTmFtZSgpOwotICAgIGlmKCghdGVzdC5lcXVhbHMoIk1lbnVEZXRlY3QiKSB8fCBjbHNzLmVxdWFscygiVGFibGUiKSB8fCBjbHNzLmVxdWFscygiVGFibGVUcmVlIikgfHwgdGVzdC5zdGFydHNXaXRoKCJDaGV2cm9uIikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiRHJhZ0RldGVjdCIpIHx8IGNsc3MuZXF1YWxzKCJUcmVlIikgfHwgY2xzcy5lcXVhbHMoIlRhYmxlVHJlZSIpIHx8IHRlc3Quc3RhcnRzV2l0aCgiQ2hldnJvbiIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIkRvdWJsZUNsaWNrIikgfHwgY2xzcy5lcXVhbHMoIkxpc3QiKSkgJiYKLSAgICAgICAoIXRlc3QuZXF1YWxzKCJLZXlTZWxlY3Rpb24iKSB8fCBjbHNzLmVxdWFscygiU2xpZGVyIikgfHwgY2xzcy5lcXVhbHMoIkNvbWJvIikgfHwgY2xzcy5lcXVhbHMoIkNDb21ibyIpIHx8IGNsc3MuZXF1YWxzKCJDVGFiRm9sZGVyIikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiRW50ZXJTZWxlY3Rpb24iKSB8fCBjbHNzLmVxdWFscygiQnV0dG9uIikgfHwgY2xzcy5lcXVhbHMoIlRvb2xCYXIiKSB8fCBjbHNzLmVxdWFscygiQ0NvbWJvIikpKQotICAgICAgICB0ZXN0ID0gY2xzcyArIHRlc3Q7Ci0gICAgcmV0dXJuIHRlc3Q7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgIFN0cmluZyBjbGF6eiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIGludCBpbmRleCA9IGNsYXp6Lmxhc3RJbmRleE9mKCdfJyk7Ci0gICAgaWYoaW5kZXggIT0gLTEpCi0gICAgICAgIGNsYXp6ID0gY2xhenouc3Vic3RyaW5nKGluZGV4KzEsIGNsYXp6Lmxlbmd0aCgpKTsKLSAgICByZXR1cm4gY2xheno7Ci19Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGYwYzQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyMSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5naW5nID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGxvY2F0aW9uQ2hhbmdlZCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlVSTCBMb2FkaW5nIC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogTG9jYXRpb24uY2hhbmdpbmcgPiBMb2NhdGlvbi5jaGFuZ2VkICh0b3AgdHJ1ZSk+IFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2luZyAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQkvKiBjZXJ0YWluIGJyb3dzZXJzIGRvIHNlbmQgbXVsdGlwbGUgY2hhbmdpbmcgZXZlbnRzLiBTYWZhcmkgZG9lcyB0aGlzLiAqLwotCQkJCS8qIHZlcmlmeSB0aGUgcGFnZSBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgYXMgYmVpbmcgbG9hZGVkICovCi0JCQkJcGFzc2VkID0gIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQkvKiBpZ25vcmUgbm9uIHRvcCBmcmFtZSBsb2FkaW5nICovCi0JCQkJaWYgKCFldmVudC50b3ApIHJldHVybjsKLQkJCQkvKiB2ZXJpZnkgYSBjaGFuZ2VkIGZvbGxvd3MgYXQgbGVhc3Qgb25lIGNoYW5naW5nICovCi0JCQkJLyogdmVyaWZ5IHRoZSBwYWdlIGhhcyBub3QgYmVlbiByZXBvcnRlZCBhcyBiZWluZyBsb2FkZWQgKi8KLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlZCIpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uQ2hhbmdpbmcgJiYgbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQkJLy8gVEVNUE9SQVJJTFkgQ09NTUVOVEVEIE9VVAotCQkJCS8qaWYgKCFwYXNzZWQpKi8gc2hlbGwuY2xvc2UoKTsKLS8qCQkJCWlmIChwYXNzZWQpIHsKLQkJCQkJIHdhaXQgYSBsaXR0bGUgYml0IG1vcmUgYmVmb3JlIGRlY2xhcmluZyBpdCBhIHN1Y2Nlc3MsCi0JCQkJCSAqIGluIGNhc2UgYm9ndXMgZXZlbnRzIGZvbGxvdyB0aGlzIG9uZS4KLQkJCQkJIAotCQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fTsKLQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJCX07Ci0JCQkJCX0uc3RhcnQoKTsKLQkJCQl9Ci0qLwkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MihTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlVSTCBMb2FkaW5nIEZpbHRlcmluZyAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlID4gbm8gTG9jYXRpb24uY2hhbmdlZCwgbm8gUHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJZmluYWwgU3RyaW5nW10gbG9jYXRpb25DYW5jZWxsZWQgPSBuZXcgU3RyaW5nWzFdOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJcGFzc2VkID0gIWxvY2F0aW9uQ2hhbmdpbmcgJiYgIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9OwotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJcGFzc2VkID0gZXZlbnQubG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24rIiAiK3Bhc3NlZCk7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQgIitwYXNzZWQpOwotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJU3RyaW5nW10gdXJscyA9IHsiaHR0cDovL3d3dy5nb29nbGUuY29tIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QyKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzNGM1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjIgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigic2V0VGV4dCAtIGFyZ3M6ICIraHRtbCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyA+IExvY2F0aW9uLmNoYW5nZWQgPiBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogY2VydGFpbiBicm93c2VycyBkbyBzZW5kIG11bHRpcGxlIGNoYW5naW5nIGV2ZW50cy4gU2FmYXJpIGRvZXMgdGhpcy4gKi8KLQkJCQlwYXNzZWQgPSAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlZCIpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uQ2hhbmdpbmcgJiYgbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQkJaWYgKHBhc3NlZCkgewotCQkJCQkvKiB3YWl0IGEgbGl0dGxlIGJpdCBtb3JlIGJlZm9yZSBkZWNsYXJpbmcgaXQgYSBzdWNjZXNzLAotCQkJCQkgKiBpbiBjYXNlIGJvZ3VzIGV2ZW50cyBmb2xsb3cgdGhpcyBvbmUuCi0JCQkJCSAqLwotCQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fTsKLQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJCX07Ci0JCQkJCX0uc3RhcnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MihTdHJpbmcgaHRtbCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJzZXRUZXh0IFVSTCBMb2FkaW5nIEZpbHRlcmluZyAtIGFyZ3M6ICIraHRtbCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSA+IG5vIExvY2F0aW9uLmNoYW5nZWQsIG5vIFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWZpbmFsIFN0cmluZ1tdIGxvY2F0aW9uQ2FuY2VsbGVkID0gbmV3IFN0cmluZ1sxXTsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5naW5nICIrZXZlbnQubG9jYXRpb24pOwotCQkJCS8qCi0JCQkJKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiAgV2hlbiBwZW5kaW5nIHJlcXVlc3RzIGFyZSBzdG9wcGVkLCBJRQotCQkJCSogZW1pdHMgYSBMb2NhdGlvbi5jaGFuZ2luZyB3aXRoIHJlczovL0M6XFdJTkRPV1NcU3lzdGVtMzJcc2hkb2NsYy5kbGwvbmF2Y2FuY2wuaHRtLgotCQkJCSogUGVuZGluZyByZXF1ZXN0cyBhcmUgc3RvcHBlZCBiZWZvcmUgZ29pbmcgdG8gdGhlIGJsYW5rIHBhZ2UgdG8gc2V0IEhUTUwgaW4gbWVtb3J5Ci0JCQkJKiB3aXRoIHNldFRleHQuCi0JCQkJKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gZ2V0IG11bHRpcGxlIExvY2F0aW9uLmNoYW5naW5nIGV2ZW50cyBhdCB0aGUgY29uZGl0aW9uCi0JCQkJKiB0aGF0IG5vIGxvY2F0aW9uQ2hhbmdlZCBhbmQgcHJvZ3Jlc3NDb21wbGV0ZWQgYXJlIHJlcG9ydGVkLgotCQkJCSovCi0JCQkJcGFzc2VkID0gIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9OwotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJcGFzc2VkID0gZXZlbnQubG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24rIiAiK3Bhc3NlZCk7Ci0JCQkJLyogaWdub3JlIExvY2F0aW9uQ2hhbmdlZCB0aGF0IGFyZSBlbXB0eSAqLwotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9ICFwYXNzZWQ7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyoKLQkJCQkgKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGxvY2F0aW9uLCBJRSBzdGlsbCBmaXJlcyBhIERvY3VtZW50Q29tcGxldGUKLQkJCQkgKiBmb2xsb3dpbmcgdGhlIEJlZm9yZU5hdmlnYXRlMiBjYW5jZWwgZXZlbnQuIFRoaXMgRG9jdW1lbnRDb21wbGV0ZSBldmVudCBjb250YWlucyBhbiBlbXB0eSBVUkwKLQkJCQkgKiBzaW5jZSB0aGUgVVJMIGluIEJlZm9yZU5hdmlnYXRlMiB3YXMgY29ycmVjdGx5IGNhbmNlbGxlZC4KLQkJCQkgKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gc2VuZCBhIExvY2F0aW9uLmNoYW5nZWQgYW5kIGEgUHJvZ3Jlc3MuY29tcGxldGVkIGV2ZW50cyBhZnRlcgotCQkJCSAqIGEgTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgLSBhdCB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgZW1wdHksCi0JCQkJICogb3RoZXJ3aXNlIGl0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUgbG9jYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLiAKLQkJCQkgKi8KLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBicm93c2VyLmdldFVybCgpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkICIrcGFzc2VkKTsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJU3RyaW5nW10gaHRtbCA9IHtmaWxlMX07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MShodG1sW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QyKGh0bWxbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZTEgPSAiPEhUTUw+PEhFQUQ+IisKLQkJIjxNRVRBIEhUVFAtRVFVSVY9XCJDb250ZW50LVR5cGVcIiBDT05URU5UPVwidGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTFcIj4iKwotCQkiPFRJVExFPlRlc3Qgd2l0aCAyIGZyYW1lczwvVElUTEU+IisKLQkJIjwvSEVBRD48Qk9EWT5zb21lIHNpbXBsZSB0ZXN0IGNhc2UgaGVyZTwvQk9EWT48L0hUTUw+IjsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzOTliNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjMgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbldpbmRvdywgbG9jYXRpb25DaGFuZ2luZywgbG9jYXRpb25DaGFuZ2VkLCB2aXNpYmlsaXR5U2hvdywgcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiamF2YXNjcmlwdCB3aW5kb3cub3BlbiAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IEJyb3dzZXIxOk9wZW5XaW5kb3cub3BlbiA+IHsgQnJvd3NlcjI6TG9jYXRpb24uY2hhbmdpbmcsIEJyb3dzZXIyOlZpc2liaWxpdHkuc2hvdywgQnJvd3NlcjI6TG9jYXRpb24uY2hhbmdlZCB9ID4gQnJvd3NlcjI6UHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMSA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMiA9IG5ldyBCcm93c2VyKHNoZWxsMiwgU1dULk5PTkUpOwotCQlicm93c2VyMS5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlvcGVuV2luZG93ID0gdHJ1ZTsKLQkJCQlCcm93c2VyIHNyYyA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlpZiAoc3JjICE9IGJyb3dzZXIxKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCAiK2Jyb3dzZXIxKyIsIGdvdCAiK3NyYyk7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChldmVudC5icm93c2VyICE9IG51bGwpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkIG51bGwsIGdvdCAiK2V2ZW50LmJyb3dzZXIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjI7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93IHx8ICFsb2NhdGlvbkNoYW5naW5nKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbkV2ZW50LmNoYW5naW5nIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIExvY2F0aW9uRXZlbnQuY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBkaWQgbm90IGV4cGVjdCBWaXNpYmlsaXR5RXZlbnQuaGlkZSIpOwotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBWaXNpYmlsaXR5RXZlbnQuc2hvdyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47CQkJCQkKLQkJCQl9Ci0JCQkJc2hlbGwyLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fTsKLQkJCQkJCXBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9OwotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIxLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyMy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyMy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXIzLmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0ODBjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjQgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbldpbmRvdywgbG9jYXRpb25DaGFuZ2luZywgbG9jYXRpb25DaGFuZ2VkLCB2aXNpYmlsaXR5U2hvdywgcHJvZ3Jlc3NDb21wbGV0ZWQsIGNsb3NlV2luZG93OwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImphdmFzY3JpcHQgd2luZG93Lm9wZW4gLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBCcm93c2VyMTpPcGVuV2luZG93Lm9wZW4gPiB7IEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5naW5nLCBCcm93c2VyMjpWaXNpYmlsaXR5LnNob3csIEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5nZWQgfSA+IEJyb3dzZXIyOlByb2dyZXNzLmNvbXBsZXRlZCA+IEJyb3dzZXIyLkNsb3NlV2luZG93LmNsb3NlIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMSA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMiA9IG5ldyBCcm93c2VyKHNoZWxsMiwgU1dULk5PTkUpOwotCQlicm93c2VyMS5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlvcGVuV2luZG93ID0gdHJ1ZTsKLQkJCQlCcm93c2VyIHNyYyA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlpZiAoc3JjICE9IGJyb3dzZXIxKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCAiK2Jyb3dzZXIxKyIsIGdvdCAiK3NyYyk7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChldmVudC5icm93c2VyICE9IG51bGwpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkIG51bGwsIGdvdCAiK2V2ZW50LmJyb3dzZXIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjI7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93IHx8ICFsb2NhdGlvbkNoYW5naW5nKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbi5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbi5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGRpZCBub3QgZXhwZWN0IFZpc2liaWxpdHlFdmVudC5oaWRlIik7Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIFZpc2liaWxpdHkuc2hvdyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47CQkJCQkKLQkJCQl9Ci0JCQkJc2hlbGwyLm9wZW4oKTsKLQkJCQl2aXNpYmlsaXR5U2hvdyA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFsb2NhdGlvbkNoYW5naW5nIHx8ICFsb2NhdGlvbkNoYW5nZWQgfHwgIXZpc2liaWxpdHlTaG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBQcm9ncmVzcy5jb21wbGV0ZWQgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIXByb2dyZXNzQ29tcGxldGVkKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBDbG9zZVdpbmRvdy5jbG9zZSByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNsb3NlV2luZG93ID0gdHJ1ZTsKLQkJCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgcGFyZW50ID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCXBhcmVudC5jbG9zZSgpOwotCQkJCQotCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotCQkJCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCX07Ci0JCQkJfS5zdGFydCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3NlcjEuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwkJCi0JCVN0cmluZyB1cmw7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI0LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXI0Lmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjQuaHRtbCI7Ci0JCVN0cmluZ1tdIHVybHMgPSB7dXJsfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4NWI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0Jc3RhdGljIFBvaW50W11bXSByZWdyZXNzaW9uQm91bmRzID0gewotCQkJCXtuZXcgUG9pbnQoMTAsMjAwKSwgbmV3IFBvaW50KDMwMCwxMDApfSwKLQkJCQl7bmV3IFBvaW50KDEwLDIwMCksIG51bGx9LAotCQkJCXtudWxsLCBuZXcgUG9pbnQoMzAwLDEwMCl9LAotCQkJCXtudWxsLCBudWxsfX07Ci0Jc3RhdGljIGludCBpbmRleCA9IDA7Ci0Jc3RhdGljIGludCBjbnRQYXNzZWQgPSAwOwotCXN0YXRpYyBpbnQgY250Q2xvc2VkID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhc2NyaXB0IHdpbmRvdy5vcGVuIHdpdGggbG9jYXRpb24gYW5kIHNpemUgcGFyYW1ldGVycyAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFZpc2liaWxpdHkub3BlbiIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJPcGVuV2luZG93ICIraW5kZXgpOwotCQkJCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCW5ld1NoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihuZXdTaGVsbCwgU1dULk5PTkUpOwotCQkJCWJyb3dzZXIuc2V0RGF0YSgiaW5kZXgiLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQkJCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCQlTaGVsbCBwYXJlbnQgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJCQlpZiAoZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgcGFyZW50LnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLQkJCQkJCWlmIChldmVudC5zaXplICE9IG51bGwpIHBhcmVudC5zZXRTaXplKGV2ZW50LnNpemUpOwotCQkJCQkJaW50IGluZGV4ID0gKChJbnRlZ2VyKWJyb3dzZXIuZ2V0RGF0YSgiaW5kZXgiKSkuaW50VmFsdWUoKTsKLQkJCQkJCXBhcmVudC5zZXRUZXh0KCJTV1QgQnJvd3NlciBzaGVsbCAiK2luZGV4KTsKLQkJCQkJCXBhcmVudC5vcGVuKCk7Ci0JCQkJCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQkJCQkJLyogQ2VydGFpbiBicm93c2VycyBmaXJlIG11bHRpcGxlIHNob3cgZXZlbnRzIGZvciBubyBnb29kIHJlYXNvbi4gRnVydGhlciBzaG93IGV2ZW50cwotCQkJCQkJCSAqIGFyZSBjb25zaWRlcmVkICdsZWdhbCcgYXMgbG9uZyBhcyB0aGV5IGRvbid0IGNvbnRhaW4gc2l6ZSBhbmQgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0JCQkJCQkJICovCi0JCQkJCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwgfHwgZXZlbnQuc2l6ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBCcm93c2VyICIraW5kZXgrIiBpcyByZWNlaXZpbmcgbXVsdGlwbGUgc2hvdyBldmVudHMiKTsKLQkJCQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVW5uZWNlc3NhcnkgKGJ1dCBoYXJtbGVzcykgdmlzaWJpbGl0eS5zaG93IGV2ZW50IEJyb3dzZXIgIitpbmRleCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlicm93c2VyLnNldERhdGEoImluZGV4IiwgbmV3IEludGVnZXIoLTEwMC1pbmRleCkpOwotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHkuc2hvdyBicm93c2VyICIraW5kZXgrIiBsb2NhdGlvbiAiK2V2ZW50LmxvY2F0aW9uKyIgc2l6ZSAiK2V2ZW50LnNpemUpOwotCQkJCQkJCS8qIENlcnRhaW4gYnJvd3NlcnMgaW5jbHVkZSBkZWNvcmF0aW9ucyB0byB0aGUgZXhwZWN0ZWQgc2l6ZS4gQWNjZXB0IHNpemUgdGhhdCBhcmUgbGFyZ2VyIG9yIGVxdWFsIHRoYW4KLQkJCQkJCQkgKiBleHBlY3RlZC4gQ2VydGFpbiBicm93c2VycyBpbnZlbnQgc2l6ZSBvciBsb2NhdGlvbiB3aGVuIHNvbWUgcGFyYW1ldGVycyBhcmUgbWlzc2luZy4gSWYgd2UgZXhwZWN0Ci0JCQkJCQkJICogbnVsbCBmb3Igb25lIG9mIHNpemUgb3IgbG9jYXRpb24sIGFsc28gYWNjZXB0IG5vbiBudWxsIGFuc3dlcnMuCi0JCQkJCQkJICovCi0JCQkJCQkJYm9vbGVhbiBjaGVja0xvY2F0aW9uID0gKGV2ZW50LmxvY2F0aW9uID09IG51bGwgJiYgcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMF0gPT0gbnVsbCkgfHwKLQkJCQkJCQkJKGV2ZW50LmxvY2F0aW9uICE9IG51bGwgJiYgZXZlbnQubG9jYXRpb24uZXF1YWxzKHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzBdKSB8fAotCQkJCQkJCQkoZXZlbnQubG9jYXRpb24gIT0gbnVsbCAmJiByZWdyZXNzaW9uQm91bmRzW2luZGV4XVswXSA9PSBudWxsKSk7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja1NpemUgID0gKChldmVudC5zaXplID09IG51bGwgJiYgcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMV0gPT0gbnVsbCkgfHwgCi0JCQkJCQkJKGV2ZW50LnNpemUgIT0gbnVsbCAmJiBldmVudC5zaXplLmVxdWFscyhyZWdyZXNzaW9uQm91bmRzW2luZGV4XVsxXSkpIHx8Ci0JCQkJCQkJKGV2ZW50LnNpemUgIT0gbnVsbCAmJiByZWdyZXNzaW9uQm91bmRzW2luZGV4XVsxXSA9PSBudWxsKSB8fAotCQkJCQkJCShldmVudC5zaXplICE9IG51bGwgJiYgZXZlbnQuc2l6ZS54ID49IHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzFdLnggJiYgZXZlbnQuc2l6ZS55ID49IHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzFdLnkpKTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBsb2NhdGlvbiAiK3JlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzBdKyIgc2l6ZSAiK3JlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzFdKTsKLQkJCQkJCQlpZiAoIWNoZWNrU2l6ZSB8fCAhY2hlY2tMb2NhdGlvbiB8fCAoKGV2ZW50LnNpemUgIT0gbnVsbCB8fCBldmVudC5sb2NhdGlvbiAhPSBudWxsKSAmJiByZWdyZXNzaW9uQm91bmRzW2luZGV4XVswXSA9PSBudWxsICYmIHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzFdID09IG51bGwpKSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIglGYWlsdXJlICIpOwotCQkJCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0gZWxzZSBjbnRQYXNzZWQrKzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJCWNudENsb3NlZCsrOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvc2UiKTsKLQkJCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQkJCWJyb3dzZXIuZ2V0U2hlbGwoKS5jbG9zZSgpOwotCQkJCQkJaWYgKGNudFBhc3NlZCA9PSByZWdyZXNzaW9uQm91bmRzLmxlbmd0aCkgcGFzc2VkID0gdHJ1ZTsKLQkJCQkJCWlmIChjbnRDbG9zZWQgPT0gcmVncmVzc2lvbkJvdW5kcy5sZW5ndGgpIHsKLQkJCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwkJCi0JCVN0cmluZyB1cmw7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI1LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXI1Lmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjUuaHRtbCI7Ci0JCVN0cmluZ1tdIHVybHMgPSB7dXJsfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBkM2YyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNiB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlVSTCBMb2FkaW5nLCB2ZXJpZnkgZ2V0IHRpdGxlIGV2ZW50IC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogVGl0bGUuY2hhbmdlZCIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVN0cmluZyB1cmwgPSBicm93c2VyLmdldFVybCgpOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlIGNoYW5nZWQgPCIrZXZlbnQudGl0bGUrIj4gZm9yIGxvY2F0aW9uIDwiK3VybCsiPiIpOwotCQkJCXBhc3NlZCA9IHRydWU7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MihTdHJpbmcgdXJsLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUaXRsZSkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZywgdmVyaWZ5IGdldCB0aXRsZSBldmVudCAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFRpdGxlLmNoYW5nZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU3RyaW5nIHVybCA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGUgY2hhbmdlZCA8IitldmVudC50aXRsZSsiPiBmb3IgbG9jYXRpb24gPCIrdXJsKyI+Iik7Ci0JCQkJaWYgKGV2ZW50LnRpdGxlLmVxdWFscyhleHBlY3RlZFRpdGxlKSkgewotCQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJCi0JCVN0cmluZ1tdIHVybHMgPSB7Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbSJ9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNi5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI2Lmh0bWwiOwotCQl1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlTdHJpbmdbXSB0aXRsZXMgPSB7IlRoaXMgaXMgYSB0ZXN0IHRpdGxlIHRoYXQgbXVzdCBiZSBjYXJlZnVsbHkgY2hlY2tlZCB3aGVuIHRoYXQgcGFnZSBpcyBsb2FkZWQifTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QyKHVybHNbaV0sIHRpdGxlc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCQotCQkKLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGMxYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI3IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JCi0Jc3RhdGljIGludCBjbnRPcGVuID0gMDsKLQlzdGF0aWMgaW50IGNudFNob3cgPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigid2luZG93Lm9wZW4sIHZlcmlmeSBnZXQgV2luZG93Lm9wZW4gYW5kIFdpbmRvdy5zaG93IGV2ZW50cyAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFdpbmRvdy5vcGVuLCBXaW5kb3cuc2hvdyBtdWx0aXBsZSB0aW1lcyIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCi0JCWNudE9wZW4gPSAwOwotCQljbnRTaG93ID0gMDsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDEwKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiV2luZG93IG9wZW5lZDogIitjbnRPcGVuKyIgV2luZG93IHNob3duOiAiK2NudFNob3cpOwotCQkvKgotCQkgKiBCdWcgaW4gTW96aWxsYS4gTXVsdGlwbGUgc2hvdyBldmVudHMgYXJlIGZpcmVkIGJ5IE1vemlsbGEuCi0JCSAqLwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gY250T3BlbiA9PSA0ICYmIGNudFNob3cgPj0gNDsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCi0Jc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBEaXNwbGF5IGRpc3BsYXksIEJyb3dzZXIgYnJvd3NlcikgewotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5vcGVuIik7Ci0JCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJc2hlbGwuc2V0VGV4dCgiTmV3IFdpbmRvdyIpOwotCQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0JCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXI7Ci0JCQkJY250T3BlbisrOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLnNob3cgbG9jYXRpb249IitldmVudC5sb2NhdGlvbisiIHNpemU9IitldmVudC5zaXplKyIgYWRkcmVzc0Jhcj0iK2V2ZW50LmFkZHJlc3NCYXIrIiBtZW51QmFyPSIrZXZlbnQubWVudUJhcisiIHN0YXR1c0Jhcj0iK2V2ZW50LnN0YXR1c0JhcisiIHRvb2xCYXI9IitldmVudC50b29sQmFyKTsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpIHNoZWxsLnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLQkJCQlpZiAoZXZlbnQuc2l6ZSAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5zaXplOwotCQkJCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCQkJfQotCQkJCWNudFNob3crKzsKLQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLX0KLQkgCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCQkJCi0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCVN0cmluZyB1cmw7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI3LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXI3Lmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjcuaHRtbCI7Ci0JCVN0cmluZ1tdIHVybHMgPSBuZXcgU3RyaW5nW10ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0KHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmOWY3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjggewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQkKLQlzdGF0aWMgU3RyaW5nIGh0bWxbXSA9IHsiPGh0bWw+PHRpdGxlPlNuaXBwZXQ8L3RpdGxlPjxib2R5PjxwIGlkPSdteWlkJz5CZXN0IEZyaWVuZHM8L3A+PHAgaWQ9J215aWQyJz5DYXQgYW5kIERvZzwvcD48L2JvZHk+PC9odG1sPiJ9OwotCXN0YXRpYyBTdHJpbmcgc2NyaXB0W10gPSB7Ci0JCSJ2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTsgXHJcbiIrCi0JCSJ2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdBdCBsZWFzdCB3aGVuIEkgYW0gYXJvdW5kJyk7XHJcbiIrCi0JCSJuZXdOb2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuIisKLQkJIlxyXG4iKwotCQkiZG9jdW1lbnQuYmdDb2xvcj0neWVsbG93JzsifTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdChmaW5hbCBpbnQgaW5kZXgpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YXNjcmlwdCAtIHZlcmlmeSBleGVjdXRlKCkgd29ya3Mgb24gSFRNTCByZW5kZXJlZCBmcm9tIG1lbW9yeSB3aXRoIGdldFRleHQgLSBzY3JpcHQgaW5kZXggIitpbmRleCk7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCXBhc3NlZCA9IGJyb3dzZXIuZXhlY3V0ZShzY3JpcHRbaW5kZXhdKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWxbaW5kZXhdKTsKLQkJCi0JCXJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgMTApOwotCi0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkgCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCQkJCi0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCVN0cmluZyB1cmw7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI4LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXI3Lmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjcuaHRtbCI7Ci0JCVN0cmluZ1tdIHVybHMgPSBuZXcgU3RyaW5nW10ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0KGkpOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlNGIwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjkgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQkKLQlzdGF0aWMgU3RyaW5nIGh0bWxbXSA9IHsiYnJvd3NlcjkuaHRtbCJ9OwotCXN0YXRpYyBTdHJpbmcgc2NyaXB0W10gPSB7Ci0JCSJjaGFuZ2VTdGF0dXMoJ25ldyB0aXRsZScpOyJ9OwotCXN0YXRpYyBTdHJpbmcgc3RhdHVzW10gPSB7Im5ldyB0aXRsZSJ9OwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KFN0cmluZyB1cmwsIGZpbmFsIFN0cmluZyBzY3JpcHQsIGZpbmFsIFN0cmluZyBzdGF0dXMpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YXNjcmlwdCAtIHZlcmlmeSBleGVjdXRlKCIrc2NyaXB0KyIpIHdvcmtzIG9uIGEgc3RhdGljIEhUTUwgZmlsZSAiK3VybCk7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlicm93c2VyLnNldERhdGEoInF1ZXJ5IiwgZXZlbnQudGV4dCk7Ci0JCX19KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKHNjcmlwdCk7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiZXhlY3V0ZSBmYWlsZWQgZm9yICIrc2NyaXB0KTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLyogU2NyaXB0IG1heSBhZGRpdGlvbmFsbHkgc2V0IHRoZSBTdGF0dXMgdmFsdWUgKi8KLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWJyb3dzZXIuZ2V0RGF0YSgicXVlcnkiKTsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ3aW5kb3cuc3RhdHVzIGFmdGVyIHNjcmlwdDogIit2YWx1ZSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCXBhc3NlZCA9IHN0YXR1cy5lcXVhbHModmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCAiK3NjcmlwdCsiLCBub3QgIit2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCAxMCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkgCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCQkJCi0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCVN0cmluZyB1cmw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShodG1sW2ldKS50b1N0cmluZygpOwotCQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhLyIraHRtbFtpXTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdCh1cmwsIHNjcmlwdFtpXSwgc3RhdHVzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9UZXN0X0Jyb3dzZXJTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL1Rlc3RfQnJvd3NlclN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjYzYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL1Rlc3RfQnJvd3NlclN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3RfQnJvd3NlclN1aXRlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0KLXB1YmxpYyBUZXN0X0Jyb3dzZXJTdWl0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjEoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjEgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXIxLnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXIyKCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXIyICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyMi50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyMygpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyMyAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjMudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjQoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjQgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI0LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI1KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI1ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNS50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyNigpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyNiAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjYudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjcoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjcgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI3LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI4KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI4ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyOC50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyOSgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyOSAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjkudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9Ccm93c2VyU3VpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyMiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXIzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI2Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyOCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI5Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JLyoKLQkgKiBUaGUgdGVzdHMgaW4gdGhpcyBzdWl0ZSBtYW5hZ2UgdGhlaXIgb3duIERpc3BsYXkgYW5kIGV2ZW50IGxvb3AKLQkgKiB0byB2YWxpZGF0ZSBhc3luY2hyb25vdXMgdXNlIGNhc2VzLgotCSAqIERpc3Bvc2UgYW55IHByZXZpb3VzbHkgZXhpc3RpbmcgZGlzcGxheSBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCi0JICogYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0cy4KLQkgKi8KLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlpZiAoZGlzcGxheSAhPSBudWxsKSBkaXNwbGF5LmRpc3Bvc2UoKTsKLQkKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjEiKSkgQnJvd3NlcjEoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjIiKSkgQnJvd3NlcjIoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjMiKSkgQnJvd3NlcjMoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjQiKSkgQnJvd3NlcjQoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjUiKSkgQnJvd3NlcjUoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjYiKSkgQnJvd3NlcjYoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjciKSkgQnJvd3NlcjcoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjgiKSkgQnJvd3NlcjgoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjkiKSkgQnJvd3NlcjkoKTsKLQotCS8qCi0JICogRW5zdXJlIHdlIGRvbid0IGxlYXZlIGEgRGlzcGxheSBmcm9tIHRoZSB0ZXN0cyB3ZSBydW4uCi0JICovCQotCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlpZiAoZGlzcGxheSAhPSBudWxsKSBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFkM2FiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYzhlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuZ2lmCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0lGODdhEgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAxOWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi3/2P8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NjBhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0QmFkQml0RGVwdGgucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0QmFkQml0RGVwdGgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNjYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdEJhZEJpdERlcHRoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZW1wdHkudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9lbXB0eS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9lbXB0eS50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQzNTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxN2M3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzAxNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWYyZGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmExMjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4ODZiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjg4ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM2ZDYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ludGVybGFjZWRfdGFyZ2V0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvaW50ZXJsYWNlZF90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQ3NDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvaW50ZXJsYWNlZF90YXJnZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9qdW5pdEdlbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9qdW5pdEdlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmUwOTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvanVuaXRHZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogQ3JlYXRlIFNXVCBKdW5pdCBzdHVicyBiYXNlZCBvbiBhIHN3dCBqYXIgdXNlZCBhcyBhIHJlZmVyZW5jZQotICogQ29tbWFuZCBsaW5lIHRvb2wgLSBydW4gd2l0aG91dCBwYXJhbWV0ZXJzIHRvIGdldCBoZWxwIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBqdW5pdEdlbiB7Ci0JU3RyaW5nIGRlc3RGb2xkZXIgPSBudWxsOwotCWludCBjb3VudGVyID0gMDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gamFyZmlsZSB0aGUgdXJsIG9mIGEgamFyIGZpbGUKLQkgKiBAcmV0dXJuIGFsbCBwdWJsaWMgY2xhc3NlcyBpbiB0aGUgamFyCi0JICovCi0JcHVibGljIFZlY3RvciBnZXRDbGFzc2VzKFN0cmluZyBqYXJmaWxlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCXRyeSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShqYXJmaWxlKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGphcmZpbGUpOwotCQkJVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyB1cmwgfSk7Ci0KLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpKTsKLQkJCQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgbG9hZGVyKTsKLQkJCQkJaWYgKGZpbHRlckNsYXNzKGNsYXp6KSkgdmVjdG9yLmFkZChjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gIiArIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHZlY3RvcjsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlIGEgSnVuaXQgamF2YSB0ZXN0IGZpbGUKLQkgKiBAcGFyYW0gY2xhenogY2xhc3MgdG8gY3JlYXRlIHRoZSB0ZXN0IGZvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbGVUZXN0KENsYXNzIGNsYXp6KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JCQluYW1lID0gZGVzdEZvbGRlciArICIvIiArIG5hbWUgKyAiLmphdmEiOwotCQkJRmlsZVdyaXRlciB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihuYW1lKTsKLQkJCWNyZWF0ZVN3dFRlc3Qod3JpdGVyLCBjbGF6eik7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uICIgKyBlKTsKLQkJfQotCQkKLQl9Ci0KLQl2b2lkIGNyZWF0ZVN3dFRlc3QoRmlsZVdyaXRlciB3cml0ZXIsIENsYXNzIGNsYXp6KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTd3RUZXN0IHRlc3QgPSBuZXcgU3d0VGVzdCh3cml0ZXIsIGNsYXp6KTsKLQkJdGVzdC53cml0ZUNvcHlSaWdodHMoKTsKLQkJdGVzdC53cml0ZVBhY2thZ2UoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVJbXBvcnRzKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlQ2xhc3NDb21tZW50cygpOwotCQl0ZXN0LndyaXRlQ2xhc3NEZWNsYXJhdGlvbigpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZUNvbnN0cnVjdG9yKCk7CQkKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVNYWluKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlU2V0VXAoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVUZWFyRG93bigpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZU1ldGhvZHMoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVTdWl0ZSgpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZU1ldGhvZE5hbWVzKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlUnVuVGVzdCgpOwotCQl0ZXN0LndyaXRlQ2xhc3NDbG9zdXJlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uRm9sZGVyKFN0cmluZyBkZXN0KSB7Ci0JCWRlc3RGb2xkZXIgPSBkZXN0OwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRDb3VudGVyKCkgewotCQljb3VudGVyKys7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q291bnRlcigpIHsKLQkJcmV0dXJuIGNvdW50ZXI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUZXN0cyhTdHJpbmcgamFyZmlsZSwgU3RyaW5nIGRlc3RGb2xkZXIpIHsKLQkJanVuaXRHZW4gZ2VuID0gbmV3IGp1bml0R2VuKCk7Ci0JCVZlY3RvciBjbGFzc2VzID0gZ2VuLmdldENsYXNzZXMoamFyZmlsZSk7Ci0JCWdlbi5zZXREZXN0aW5hdGlvbkZvbGRlcihkZXN0Rm9sZGVyKTsKLQkJaWYgKGNsYXNzZXMgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBjbGFzc2VzIGZvdW5kLiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBjbGFzc2VzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlnZW4uY3JlYXRlRmlsZVRlc3QoKENsYXNzKWVudHJpZXMubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHN0dWJzIHdyaXR0ZW46ICIgKyBnZW4uZ2V0Q291bnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaWZmKFZlY3RvciBvbGRDbGFzc2VzLCBWZWN0b3IgbmV3Q2xhc3NlcykgewotCQlTd3REaWZmIGRpZmYgPSBuZXcgU3d0RGlmZihvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsKLQkJZGlmZi5jb21wdXRlKCk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpZmZUZXN0cyhTdHJpbmcgamFyZmlsZU9sZCwgU3RyaW5nIGphcmZpbGVOZXcpIHsKLQkJanVuaXRHZW4gZ2VuID0gbmV3IGp1bml0R2VuKCk7Ci0JCVZlY3RvciBvbGRDbGFzc2VzID0gZ2VuLmdldENsYXNzZXMoamFyZmlsZU9sZCk7Ci0JCWlmIChvbGRDbGFzc2VzID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBmb3VuZCBpbiBvbGQgamFyIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVmVjdG9yIG5ld0NsYXNzZXMgPSBnZW4uZ2V0Q2xhc3NlcyhqYXJmaWxlTmV3KTsKLQkJaWYgKG5ld0NsYXNzZXMgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBjbGFzc2VzIGZvdW5kIGluIG5ldyBqYXIiKTsKLQkJCXJldHVybjsKLQkJfQotCQlnZW4uZGlmZihvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoIDwgMykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBqdW5pdEdlbiBmbGFnIGFyZzEgYXJnMiAuLi4iKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIHdoZXJlIGZsYWcgaXMgb25lIG9mOiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGU6IGNyZWF0ZSB0aGUganVuaXQgdGVzdCBzdHVicyIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgYXJnMTogc291cmNlIGphciBlLmcuIGQ6L3N3dC5qYXIiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzI6IGRlc3RpbmF0aW9uIGUuZy4gZDovdGVzdHMiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGlmZjogICBkaWZmIDIgamFycyBzaG93aW5nIHdoaWNoIHRlc3RzIG11c3QgYmUgcmVtb3ZlZCwiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBhbmQgYWRkZWQiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzE6IG9sZCBqYXIgZS5nLiBkOi9vbGQvc3d0LmphciIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgYXJnMjogbmV3IGphciBlLmcuIGQ6L25ldy9zd3QuamFyIik7CQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhcmdzWzBdLmVxdWFscygiY3JlYXRlIikpIGNyZWF0ZVRlc3RzKGFyZ3NbMV0sIGFyZ3NbMl0pOwotCQllbHNlIGlmIChhcmdzWzBdLmVxdWFscygiZGlmZiIpKSBkaWZmVGVzdHMoYXJnc1sxXSwgYXJnc1syXSk7Ci0JfQotCQotCWJvb2xlYW4gZmlsdGVyQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJLyogSlVuaXQgdGVzdHMgZm9yIHB1YmxpYyBjbGFzc2VzIG9ubHkgKi8KLQkJaW50IG1vZGlmaWVycyA9IGNsYXp6LmdldE1vZGlmaWVycygpOwotCQlpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHJldHVybiBmYWxzZTsKLQotCQkvKiBKVW5pdCB0ZXN0cyBmb3IgY2xhc3NlcyB3aGljaCBhcmUgbm90IHBhcnQgb2YgYW4gaW50ZXJuYWwgcGFja2FnZSAqLwotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjbGF6ei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQlpZiAocGFja2FnZU5hbWUuaW5kZXhPZigiaW50ZXJuYWwiKSAhPSAtMSkgcmV0dXJuIGZhbHNlOwotCi0JCS8qIEpVbml0IHRlc3RzIGZvciBjbGFzc2VzIHdpdGggcHVibGljIGNvbnN0cnVjdG9ycyBvciBwdWJsaWMgbWV0aG9kcyAqLwotCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCWlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoID09IDAgJiYgbWV0aG9kcy5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIGNsYXp6KSB7Ci0JCVN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotCQluYW1lID0gIlRlc3RfIiArIG5hbWUucmVwbGFjZSgnLicsICdfJyk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCVN0cmluZyBnZXRNZXRob2ROYW1lKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7Ci0JCVN0cmluZyBuYW1lID0gInRlc3RfQ29uc3RydWN0b3IiOwotCQlDbGFzc1tdIHBhcmFtZXRlcnMgPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWUgKz0gZ2V0VHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZShNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZyBuYW1lID0gInRlc3RfIiArIG1ldGhvZC5nZXROYW1lKCk7Ci0JCUNsYXNzW10gcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWUgKz0gZ2V0VHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCQotCVN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKENsYXNzIGNsYXp6KSB7Ci0JCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiSSI7Ci0JCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiWiI7Ci0JCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiAiSiI7Ci0JCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gIlMiOwotCQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiQyI7Ci0JCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiQiI7Ci0JCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gIkYiOwotCQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiAiRCI7Ci0JCWlmIChjbGF6ei5pc0FycmF5KCkpIHsKLQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQlyZXR1cm4gIiQiICsgZ2V0VHlwZVNpZ25hdHVyZShjb21wb25lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gIkwiICsgY2xhenouZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnXycpOwotCX0KLQotCUNvbnN0cnVjdG9yW10gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoQ2xhc3MgY2xhenopIHsKLQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJQXJyYXlzLnNvcnQoY29uc3RydWN0b3JzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gKGdldE1ldGhvZE5hbWUoKENvbnN0cnVjdG9yKWEpLmNvbXBhcmVUbyhnZXRNZXRob2ROYW1lKChDb25zdHJ1Y3RvciliKSkpOwkJCQkJCi0JCQl9Ci0JCX0pOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnNbaV07Ci0JCQlpbnQgbW9kaWZpZXJzID0gY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgewotCQkJCWNvbnN0cnVjdG9yc1tjb3VudCsrXSA9IGNvbnN0cnVjdG9yc1tpXTsKLQkJCX0KLQkJfQotCQlDb25zdHJ1Y3RvcltdIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3Rvcltjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29uc3RydWN0b3JzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCQotCU1ldGhvZFtdIGdldEZpbHRlcmVkTWV0aG9kcyhDbGFzcyBjbGF6eikgewotCQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCUFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiAoZ2V0TWV0aG9kTmFtZSgoTWV0aG9kKWEpLmNvbXBhcmVUbyhnZXRNZXRob2ROYW1lKChNZXRob2QpYikpKTsJCQkJCQotCQkJfQotCQl9KTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWludCBtb2RpZmllcnMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgewotCQkJCW1ldGhvZHNbY291bnQrK10gPSBtZXRob2RzW2ldOwotCQkJfQotCQl9Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCi0KLQlwdWJsaWMgY2xhc3MgU3d0VGVzdCB7Ci0JCUZpbGVXcml0ZXIgd3JpdGVyOwotCQlDbGFzcyBjbGF6ejsKLQkJU3RyaW5nIGxpbmVTZXAgPSAiXHJcbiI7Ci0JCQotCQlTd3RUZXN0KEZpbGVXcml0ZXIgd3JpdGVyLCBDbGFzcyBjbGF6eikgewotCQkJdGhpcy53cml0ZXIgPSB3cml0ZXI7Ci0JCQl0aGlzLmNsYXp6ID0gY2xheno7Ci0JCX0KLQkJCi0JCXZvaWQgbmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVQYWNrYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgicGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDb3B5UmlnaHRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiICsgbGluZVNlcCArCi0gCQkJCSIgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIiArIGxpbmVTZXAgKwotIAkJCQkiICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IiArIGxpbmVTZXAgKwotIAkJCQkiICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiICsgbGluZVNlcCArCi0gCQkJCSIgKiAiICsgbGluZVNlcCArCi0gCQkJCSIgKiBDb250cmlidXRvcnM6IiArIGxpbmVTZXAgKwotIAkJCQkiICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgKyBsaW5lU2VwICsKLQkJCQkiICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVJbXBvcnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOyIgKyBsaW5lU2VwICsKLQkJCQkiaW1wb3J0IGp1bml0LnRleHR1aS4qOyIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ2xhc3NDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJIi8qKiIgKyBsaW5lU2VwICsKLQkJCQkiICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzICIgKyBjbGF6ei5nZXROYW1lKCkgKyBsaW5lU2VwICsKLQkJCQkiICoiICsgbGluZVNlcCArCi0JCQkJIiAqIEBzZWUgIiArIGNsYXp6LmdldE5hbWUoKSArIGxpbmVTZXAgKwotCQkJCSIgKi8iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJCUNsYXNzIHN1cGVyQ2xhc3MgPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBzdXBlckNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoIXBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLnN3dCIpKSByZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIWZpbHRlckNsYXNzKHN1cGVyQ2xhc3MpKSByZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkJCQkKLQkJfQotCQkKLQkJU3RyaW5nIGdldFN3dEp1bml0U3VwZXJDbGFzc05hbWUoQ2xhc3MgY2xhenopIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2xhc3MgPSAiU3d0VGVzdENhc2UiOwotCQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlckNsYXNzID09IG51bGwpIHJldHVybiBkZWZhdWx0Q2xhc3M7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBzdXBlckNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoIXBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLnN3dCIpKSByZXR1cm4gZGVmYXVsdENsYXNzOwotCQkJaWYgKCFmaWx0ZXJDbGFzcyhzdXBlckNsYXNzKSkgcmV0dXJuIGRlZmF1bHRDbGFzczsKLQkJCXJldHVybiBnZXRDbGFzc05hbWUoc3VwZXJDbGFzcyk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDbGFzc0RlY2xhcmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCVN0cmluZyBzdXBlckNsYXNzTmFtZSA9IGdldFN3dEp1bml0U3VwZXJDbGFzc05hbWUoY2xhenopOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgY2xhc3MgIiArIG5hbWUgKyAiIGV4dGVuZHMgIiArIHN1cGVyQ2xhc3NOYW1lICsiIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgIiArIG5hbWUgKyAiKFN0cmluZyBuYW1lKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJc3VwZXIobmFtZSk7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQkJCi0JCQotCQl2b2lkIHdyaXRlTWFpbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsiICsgbGluZVNlcCArCi0JCQkJIglUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJdm9pZCB3cml0ZVNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCIJc3VwZXIuc2V0VXAoKTsiKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQl3cml0ZXIud3JpdGUoIn0iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCXZvaWQgd3JpdGVUZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCXdyaXRlci53cml0ZSgiCXN1cGVyLnRlYXJEb3duKCk7Iik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVNZXRob2RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl3cml0ZU1ldGhvZChjb25zdHJ1Y3RvcnNbaV0pOwotCQkJCWlmIChpIDwgY29uc3RydWN0b3JzLmxlbmd0aCAtIDEpIHdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCQotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCQlpZiAoY29uc3RydWN0b3JzLmxlbmd0aCA+IDAgJiYgbWV0aG9kcy5sZW5ndGggPiAwKSB3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl3cml0ZU1ldGhvZChtZXRob2RzW2ldKTsKLQkJCQlpZiAoaSA8IG1ldGhvZHMubGVuZ3RoIC0gMSkgd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQl9Ci0JCQotCQl2b2lkIHdyaXRlTWV0aG9kKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKGNvbnN0cnVjdG9yKTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHZvaWQgIiArIG5hbWUgKyAiKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCXdhcm5VbmltcGwoXCJUZXN0ICIgKyBuYW1lICsgIiBub3Qgd3JpdHRlblwiKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaW5jcmVtZW50Q291bnRlcigpOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlTWV0aG9kKE1ldGhvZCBtZXRob2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldE1ldGhvZE5hbWUobWV0aG9kKTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHZvaWQgIiArIG5hbWUgKyAiKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCXdhcm5VbmltcGwoXCJUZXN0ICIgKyBuYW1lICsgIiBub3Qgd3JpdHRlblwiKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaW5jcmVtZW50Q291bnRlcigpOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlU3VpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOyIgKyBsaW5lU2VwICsJCi0JCQkJIglqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsiICsgbGluZVNlcCArCi0JCQkJIglqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7IiArIGxpbmVTZXAgKwotCQkJCSIJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsiICsgbGluZVNlcCArCi0JCQkJIgkJc3VpdGUuYWRkVGVzdChuZXcgIiArIG5hbWUgKyAiKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7IiArIGxpbmVTZXAgKwotCQkJCSIJfSIgKyBsaW5lU2VwICsKLQkJCQkiCXJldHVybiBzdWl0ZTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJdm9pZCB3cml0ZU1ldGhvZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKGNvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJd3JpdGVyLndyaXRlKAotCQkJCQkiCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoXCIiICsgbmFtZSArICJcIik7IgotCQkJCSk7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE1ldGhvZE5hbWUobWV0aG9kc1tpXSk7Ci0JCQkJd3JpdGVyLndyaXRlKAotCQkJCQkiCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoXCIiICsgbmFtZSArICJcIik7IgotCQkJCSk7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJaWYgKGhhc1N3dEp1bml0U3VwZXJDbGFzcyhjbGF6eikpIHsKLQkJCQlTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSBnZXRTd3RKdW5pdFN1cGVyQ2xhc3NOYW1lKGNsYXp6KTsKLQkJCQl3cml0ZXIud3JpdGUoIgltZXRob2ROYW1lcy5hZGRBbGwoIiArIHN1cGVyQ2xhc3NOYW1lICsgIi5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzIik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJd3JpdGVyLndyaXRlKAotCQkJCSIJcmV0dXJuIG1ldGhvZE5hbWVzOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVSdW5UZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoICsgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID09IDApIHdyaXRlci53cml0ZSgiCWlmIik7IGVsc2Ugd3JpdGVyLndyaXRlKCIJZWxzZSBpZiIpOwotCQkJCVN0cmluZyBuYW1lID0gaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGggPyBnZXRNZXRob2ROYW1lKGNvbnN0cnVjdG9yc1tpXSkgOiBnZXRNZXRob2ROYW1lKG1ldGhvZHNbaSAtIGNvbnN0cnVjdG9ycy5sZW5ndGhdKTsKLQkJCQl3cml0ZXIud3JpdGUoCi0JCQkJCSIgKGdldE5hbWUoKS5lcXVhbHMoXCIiICsgbmFtZSArICJcIikpICIgKyBuYW1lICsgIigpOyIKLQkJCQkpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggKyBtZXRob2RzLmxlbmd0aCA+IDApIHsKLQkJCQkJd3JpdGVyLndyaXRlKCIJZWxzZSAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZXIud3JpdGUoIgkiKTsKLQkJCQl9Ci0JCQkJd3JpdGVyLndyaXRlKCJzdXBlci5ydW5UZXN0KCk7Iik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQkJCQotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7CQkKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNsYXNzQ2xvc3VyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoIn0iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgRGlmZkNsYXNzIHsKLQkJLyogdGhlIG5ld0NsYXNzIGhhcyBiZWVuIGFkZGVkICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVyA9IDE7Ci0JCS8qIHRoZSBvbGRDbGFzcyBoYXMgYmVlbiByZW1vdmVkICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRUQgPSAyOwotCQkvKiB0aGUgcmVtb3ZlZE1ldGhvZHMgZnJvbSBvbGRDbGFzcyBoYXZlIGJlZW4gcmVtb3ZlZCAoaWYgYW55KQotCQkgKiB0aGUgbmV3TWV0aG9kcyBmcm9tIG5ld0NsYXNzIGhhdmUgYmVlbiBhZGRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ESUZJRUQgPSAzOwotCQkKLQkJaW50IHR5cGU7Ci0JCUNsYXNzIG9sZENsYXNzOwotCQlDbGFzcyBuZXdDbGFzczsKLQkJTWV0aG9kW10gcmVtb3ZlZE1ldGhvZHM7Ci0JCU1ldGhvZFtdIG5ld01ldGhvZHM7Ci0JCUNvbnN0cnVjdG9yW10gcmVtb3ZlZENvbnN0cnVjdG9yczsKLQkJQ29uc3RydWN0b3JbXSBuZXdDb25zdHJ1Y3RvcnM7Ci0KLQkJcHVibGljIERpZmZDbGFzcyhpbnQgdHlwZSwgCi0JCQlDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MsIAotCQkJTWV0aG9kW10gcmVtb3ZlZE1ldGhvZHMsIE1ldGhvZFtdIG5ld01ldGhvZHMsCi0JCQlDb25zdHJ1Y3RvcltdIHJlbW92ZWRDb25zdHJ1Y3RvcnMsIENvbnN0cnVjdG9yW10gbmV3Q29uc3RydWN0b3JzKSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5vbGRDbGFzcyA9IG9sZENsYXNzOwotCQkJdGhpcy5uZXdDbGFzcyA9IG5ld0NsYXNzOwotCQkJdGhpcy5yZW1vdmVkTWV0aG9kcyA9IHJlbW92ZWRNZXRob2RzOwotCQkJdGhpcy5uZXdNZXRob2RzID0gbmV3TWV0aG9kczsKLQkJCXRoaXMucmVtb3ZlZENvbnN0cnVjdG9ycyA9IHJlbW92ZWRDb25zdHJ1Y3RvcnM7Ci0JCQl0aGlzLm5ld0NvbnN0cnVjdG9ycyA9IG5ld0NvbnN0cnVjdG9yczsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgTkVXOiB7Ci0JCQkJCXJldHVybiAiTkVXOiAiICsgZ2V0Q2xhc3NOYW1lKG5ld0NsYXNzKTsKLQkJCQl9Ci0JCQkJY2FzZSBSRU1PVkVEOiB7Ci0JCQkJCXJldHVybiAiUkVNT1ZFRDogIiArIGdldENsYXNzTmFtZShvbGRDbGFzcyk7Ci0JCQkJfQotCQkJCWNhc2UgTU9ESUZJRUQ6IHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICJNT0RJRklFRDogIiArIGdldENsYXNzTmFtZShvbGRDbGFzcyk7Ci0JCQkJCWlmIChyZW1vdmVkQ29uc3RydWN0b3JzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIHJlbW92ZWRDb25zdHJ1Y3RvcnMubGVuZ3RoICsgIiBjb25zdHJ1Y3RvcihzKSByZW1vdmVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZENvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUocmVtb3ZlZENvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3Q29uc3RydWN0b3JzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIG5ld0NvbnN0cnVjdG9ycy5sZW5ndGggKyAiIGNvbnN0cnVjdG9yKHMpIGFkZGVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShuZXdDb25zdHJ1Y3RvcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZW1vdmVkTWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyByZW1vdmVkTWV0aG9kcy5sZW5ndGggKyAiIG1ldGhvZChzKSByZW1vdmVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBnZXRNZXRob2ROYW1lKHJlbW92ZWRNZXRob2RzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChuZXdNZXRob2RzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIG5ld01ldGhvZHMubGVuZ3RoICsgIiBtZXRob2QocykgYWRkZWQiOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShuZXdNZXRob2RzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gc3RyaW5nOwotCQkJCX0KLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCXJldHVybiAiaW52YWxpZCBEaWZmQ2xhc3MgIit0eXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgU3d0RGlmZiB7Ci0JCUNsYXNzW10gb2xkQ2xhc3NlcywgbmV3Q2xhc3NlczsKLQkJLyogcmVtb3ZlZFtpXSB0cnVlIG1lYW5zIG9sZENsYXNzZXNbaV0gaGFzIGJlZW4gcmVtb3ZlZCAqLwotCQlib29sZWFuW10gcmVtb3ZlZDsKLQkJLyogYWRkZWRbaV0gdHJ1ZSBtZWFucyBuZXdDbGFzc2VzW2ldIGhhcyBiZWVuIGFkZGVkICovCi0JCWJvb2xlYW5bXSBhZGRlZDsKLQkJLyogb2xkMk5ld1tpXSA9PSBqID49IDAgbWVhbnMgb2xkQ2xhc3Nlc1tpXSBjb3JyZXNwb25kcyB0byBuZXdDbGFzc2VzW2pdICovCi0JCWludFtdIG9sZDJOZXc7Ci0JCWludFtdIG5ldzJPbGQ7Ci0JCVZlY3RvciBkaWZmcyA9IG5ldyBWZWN0b3IoKTsKLQkJCi0JCXB1YmxpYyBTd3REaWZmKFZlY3RvciBvbGRDbGFzc2VzLCBWZWN0b3IgbmV3Q2xhc3NlcykgewotCQkJRW51bWVyYXRpb24gb2xkQ2xhc3Nlc0VudW0gPSBvbGRDbGFzc2VzLmVsZW1lbnRzKCk7Ci0JCQl0aGlzLm9sZENsYXNzZXMgPSBuZXcgQ2xhc3Nbb2xkQ2xhc3Nlcy5zaXplKCldOwotCQkJaW50IGNudCA9IDA7Ci0JCQl3aGlsZSAob2xkQ2xhc3Nlc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLm9sZENsYXNzZXNbY250KytdID0gKENsYXNzKW9sZENsYXNzZXNFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0KLQkJCUVudW1lcmF0aW9uIG5ld0NsYXNzZXNFbnVtID0gbmV3Q2xhc3Nlcy5lbGVtZW50cygpOwotCQkJdGhpcy5uZXdDbGFzc2VzID0gbmV3IENsYXNzW25ld0NsYXNzZXMuc2l6ZSgpXTsKLQkJCWNudCA9IDA7Ci0JCQl3aGlsZSAobmV3Q2xhc3Nlc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLm5ld0NsYXNzZXNbY250KytdID0gKENsYXNzKW5ld0NsYXNzZXNFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlvbGQyTmV3ID0gbmV3IGludFt0aGlzLm9sZENsYXNzZXMubGVuZ3RoXTsKLQkJCW5ldzJPbGQgPSBuZXcgaW50W3RoaXMubmV3Q2xhc3Nlcy5sZW5ndGhdOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb21wdXRlKCkgewotCQkJY29tcGFyZUNsYXNzZXMoKTsKLQkJCWNyZWF0ZUNsYXNzRGlmZigpOwotCQkJb3V0cHV0Q2xhc3NEaWZmKCk7CQkKLQkJfQotCi0JCXZvaWQgY29tcGFyZUNsYXNzZXMoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZENsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvbGQyTmV3W2ldID0gLTE7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdDbGFzc2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChvbGRDbGFzc2VzW2ldLmdldE5hbWUoKS5lcXVhbHMobmV3Q2xhc3Nlc1tqXS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlvbGQyTmV3W2ldID0gajsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3Mk9sZFtpXSA9IC0xOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkQ2xhc3Nlcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAobmV3Q2xhc3Nlc1tpXS5nZXROYW1lKCkuZXF1YWxzKG9sZENsYXNzZXNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQkJbmV3Mk9sZFtpXSA9IGo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXZvaWQgY3JlYXRlQ2xhc3NEaWZmKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGQyTmV3Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9sZDJOZXdbaV0gPCAwKSB7Ci0JCQkJCS8qIEZvdW5kIGEgY2xhc3Mgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCAqLwotCQkJCQlEaWZmQ2xhc3MgZGlmZiA9IG5ldyBEaWZmQ2xhc3MoCi0JCQkJCQlEaWZmQ2xhc3MuUkVNT1ZFRCwKLQkJCQkJCW9sZENsYXNzZXNbaV0sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCk7Ci0JCQkJCWRpZmZzLmFkZChkaWZmKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBGb3VuZCBhIGNsYXNzIHdoaWNoIGlzIGVpdGhlciBpZGVudGljYWwgb3Igd2hpY2ggY29udGFpbnMKLQkJCQkJICogbW9kaWZpZWQgbWV0aG9kcwotCQkJCQkgKi8KLQkJCQkJQ2xhc3Mgb2xkQ2xhc3MgPSBvbGRDbGFzc2VzW2ldOwotCQkJCQlDbGFzcyBuZXdDbGFzcyA9IG5ld0NsYXNzZXNbb2xkMk5ld1tpXV07Ci0JCQkJCU1ldGhvZFtdIHJlbW92ZWRNZXRob2RzID0gZ2V0UmVtb3ZlZE1ldGhvZHMob2xkQ2xhc3MsIG5ld0NsYXNzKTsKLQkJCQkJTWV0aG9kW10gYWRkZWRNZXRob2RzID0gZ2V0QWRkZWRNZXRob2RzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCUNvbnN0cnVjdG9yW10gcmVtb3ZlZENvbnN0cnVjdG9ycyA9IGdldFJlbW92ZWRDb25zdHJ1Y3RvcnMob2xkQ2xhc3MsIG5ld0NsYXNzKTsKLQkJCQkJQ29uc3RydWN0b3JbXSBhZGRlZENvbnN0cnVjdG9ycyA9IGdldEFkZGVkQ29uc3RydWN0b3JzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCWlmIChyZW1vdmVkTWV0aG9kcyAhPSBudWxsIHx8IGFkZGVkTWV0aG9kcyAhPSBudWxsIHx8IAotCQkJCQkJcmVtb3ZlZENvbnN0cnVjdG9ycyAhPSBudWxsIHx8IGFkZGVkQ29uc3RydWN0b3JzICE9IG51bGwpIHsKLQkJCQkJCURpZmZDbGFzcyBkaWZmID0gbmV3IERpZmZDbGFzcygKLQkJCQkJIAkJRGlmZkNsYXNzLk1PRElGSUVELAotCQkJCQkgCQlvbGRDbGFzcywKLQkJCQkJIAkJbmV3Q2xhc3MsCi0JCQkJCSAJCXJlbW92ZWRNZXRob2RzLAotCQkJCQkgCQlhZGRlZE1ldGhvZHMsCi0JCQkJCSAJCXJlbW92ZWRDb25zdHJ1Y3RvcnMsCi0JCQkJCSAJCWFkZGVkQ29uc3RydWN0b3JzCi0JCQkJCSAJKTsKLQkJCQkJIAlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJCSB9Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXcyT2xkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5ldzJPbGRbaV0gPCAwKSB7Ci0JCQkJCS8qIEZvdW5kIGEgY2xhc3Mgd2hpY2ggaGFzIGJlZW4gYWRkZWQgKi8KLQkJCQkJRGlmZkNsYXNzIGRpZmYgPSBuZXcgRGlmZkNsYXNzKAotCQkJCQkJRGlmZkNsYXNzLk5FVywKLQkJCQkJCW51bGwsCi0JCQkJCQluZXdDbGFzc2VzW2ldLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbAotCQkJCQkpOwotCQkJCQlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTWV0aG9kW10gZ2V0UmVtb3ZlZE1ldGhvZHMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlNZXRob2RbXSBvbGRNZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKG9sZENsYXNzKTsKLQkJCU1ldGhvZFtdIG5ld01ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMobmV3Q2xhc3MpOwotCQkJCi0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG9sZE5hbWUgPSBnZXRNZXRob2ROYW1lKG9sZE1ldGhvZHNbaV0pOwotCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdNZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gZ2V0TWV0aG9kTmFtZShuZXdNZXRob2RzW2pdKTsKLQkJCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCQlyZW1vdmVkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVtb3ZlZCkgb2xkTWV0aG9kc1tjb3VudCsrXSA9IG9sZE1ldGhvZHNbaV07Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkTWV0aG9kcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlNZXRob2RbXSBnZXRBZGRlZE1ldGhvZHMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlyZXR1cm4gZ2V0UmVtb3ZlZE1ldGhvZHMobmV3Q2xhc3MsIG9sZENsYXNzKTsKLQkJfQotCQkKLQkJQ29uc3RydWN0b3JbXSBnZXRSZW1vdmVkQ29uc3RydWN0b3JzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJQ29uc3RydWN0b3JbXSBvbGRDb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhvbGRDbGFzcyk7Ci0JCQlDb25zdHJ1Y3RvcltdIG5ld0NvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKG5ld0NsYXNzKTsKLQkJCQotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG9sZE5hbWUgPSBnZXRNZXRob2ROYW1lKG9sZENvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJYm9vbGVhbiByZW1vdmVkID0gdHJ1ZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5ld0NvbnN0cnVjdG9ycy5sZW5ndGg7IGorKykgewotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGdldE1ldGhvZE5hbWUobmV3Q29uc3RydWN0b3JzW2pdKTsKLQkJCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCQlyZW1vdmVkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVtb3ZlZCkgb2xkQ29uc3RydWN0b3JzW2NvdW50KytdID0gb2xkQ29uc3RydWN0b3JzW2ldOwotCQkJfQotCQkJaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsOwotCQkJQ29uc3RydWN0b3JbXSByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRDb25zdHJ1Y3RvcnMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJQ29uc3RydWN0b3JbXSBnZXRBZGRlZENvbnN0cnVjdG9ycyhDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MpIHsKLQkJCXJldHVybiBnZXRSZW1vdmVkQ29uc3RydWN0b3JzKG5ld0NsYXNzLCBvbGRDbGFzcyk7Ci0JCX0KLQkJCi0JCXZvaWQgb3V0cHV0Q2xhc3NEaWZmKCkgewotCQkJRW51bWVyYXRpb24gZWxlbWVudHMgPSBkaWZmcy5lbGVtZW50cygpOwotCQkJaW50IGNoYW5nZXMgPSAwOwotCQkJd2hpbGUgKGVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJRGlmZkNsYXNzIGRpZmYgPSAoRGlmZkNsYXNzKWVsZW1lbnRzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJbIitjaGFuZ2VzKyJdICIrIGRpZmYpOwotCQkJCWNoYW5nZXMrKzsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDEzYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBTV1QgcGVyZm9ybWFuY2UgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBQZXJmb3JtYW5jZVRlc3RzKCk7Ci19Ci0KLXB1YmxpYyBQZXJmb3JtYW5jZVRlc3RzKCkgewotCXN1cGVyKCk7Ci0JYWRkVGVzdChUZXN0X3NpdHVhdGlvbmFsLnN1aXRlKCkpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9Td3RQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1N3dFBlcmZvcm1hbmNlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViMGU1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1N3dFBlcmZvcm1hbmNlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLio7Ci0KLQotcHVibGljIGNsYXNzIFN3dFBlcmZvcm1hbmNlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLy8gdXNlZCB0byBzcGVjaWZ5IHZlcmJvc2UgbW9kZSwgaWYgdHJ1ZSB1bmltcGxlbWVudGVkIHdhcm5pbmcgbWVzc2FnZXMgd2lsbCAKLQkvLyBiZSB3cml0dGVuIHRvIFN5c3RlbS5vdXQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzR1RLID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU1dULmdldFBsYXRmb3JtKCkuc3RhcnRzV2l0aCgid2luMzIiKTsKLQkKLQkvLyBhbGxvdyBzcGVjaWZpYyBpbWFnZSBmb3JtYXRzIHRvIGJlIHRlc3RlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGb3JtYXRzID0gbmV3IFN0cmluZ1tdIHsiYm1wIiwgImpwZyIsICJnaWYiLCAicG5nIn07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImZvbGRlciIsICJmb2xkZXJPcGVuIiwgInRhcmdldCJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7InRyYW5zcGFyZW50LnBuZyJ9OwotCi0JCi1wdWJsaWMgU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wcm90ZWN0ZWQgUGVyZm9ybWFuY2VNZXRlciBjcmVhdGVNZXRlcihTdHJpbmcgaWQpIHsKLQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQlTdHJpbmcgc2NlbmFyaW9JZCA9ICJvcmcuZWNsaXBzZS5zd3QudGVzdC4iICsgaWQ7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIoc2NlbmFyaW9JZCk7Ci0JcGVyZm9ybWFuY2UudGFnQXNTdW1tYXJ5KG1ldGVyLCBpZCwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0JcmV0dXJuIG1ldGVyOwotfQotCi1wcm90ZWN0ZWQgUGVyZm9ybWFuY2VNZXRlciBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KFN0cmluZyBpZCkgewotCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCVN0cmluZyBzY2VuYXJpb0lkID0gIm9yZy5lY2xpcHNlLnN3dC50ZXN0LiIgKyBpZDsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gcGVyZm9ybWFuY2UuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihzY2VuYXJpb0lkKTsKLQlyZXR1cm4gbWV0ZXI7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VNZXRlcihQZXJmb3JtYW5jZU1ldGVyIG1ldGVyKSB7Ci0JdHJ5IHsKLQkJbWV0ZXIuY29tbWl0KCk7Ci0JCVBlcmZvcm1hbmNlLmdldERlZmF1bHQoKS5hc3NlcnRQZXJmb3JtYW5jZShtZXRlcik7Ci0JfSBmaW5hbGx5IHsKLQkJbWV0ZXIuZGlzcG9zZSgpOwotCX0KLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoKFN0cmluZyBmaWxlTmFtZSkgewotCVN0cmluZyB1cmxQYXRoOwotCQotCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCX0KLQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB7Ci0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoZmlsZU5hbWUpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCWZhaWwoIlVSTCA9PSBudWxsIGZvciBmaWxlICIgKyBmaWxlTmFtZSk7Ci0JCX0KLQkJdXJsUGF0aCA9IHVybC5nZXRGaWxlKCk7Ci0JfSBlbHNlIHsKLQkJdXJsUGF0aCA9IHBsdWdpblBhdGggKyAiL2RhdGEvIiArIGZpbGVOYW1lOwotCX0KLQkKLQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgdXJsUGF0aCA9IHVybFBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CQotCWlmIChpc1dpbmRvd3MgJiYgdXJsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgPT0gMCkgdXJsUGF0aCA9IHVybFBhdGguc3Vic3RyaW5nKDEpOwotCXVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2VBbGwoIiUyMCIsICIgIik7CQotCQotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2ZWQgZmlsZSBuYW1lIGZvciAiICsgZmlsZU5hbWUgKyAiID0gIiArIHVybFBhdGgpOwotCX0KLQlyZXR1cm4gdXJsUGF0aDsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNKMk1FKCkgewotCXRyeSB7Ci0JCUNvbXBhdGliaWxpdHkubmV3RmlsZUlucHV0U3RyZWFtKCIiKTsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9UZXN0X3NpdHVhdGlvbmFsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1Rlc3Rfc2l0dWF0aW9uYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyNjU2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1Rlc3Rfc2l0dWF0aW9uYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgUGVyZm9ybWFuY2UgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfc2l0dWF0aW9uYWwgZXh0ZW5kcyBTd3RQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfc2l0dWF0aW9uYWwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwKCk7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi0KLS8qKgotICogU2l0dWF0aW9uczoKLSAqIAotICogLSBXaWRnZXQgY3JlYXRpb24KLSAqIC0gc3luY0V4ZWMvYXN5bmNFeGVjIHBlcmZvcm1hbmNlCi0gKiAtIEltYWdlIGNyZWF0aW9uCi0gKiAtIERyYXdpbmcgb3BlcmF0aW9ucwotICogLSBTdHJpbmcgbWVhc3VyaW5nCi0gKiAtIFN0cmluZyBkcmF3aW5nCi0gKiAtIFJlZ2lvbiBvcGVyYXRpb25zCi0gKiAtIEZvbnRzCi0gKiAtIEltYWdlIGxvYWRpbmcKLSAqIC0gTGF5b3V0cwotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJDcmVhdGUgY29tcG9zaXRlcyIpOwotCWludCBzYW1wbGVzOwotCi0gICAgUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0gICAgcGVyZm9ybWFuY2Uuc2V0Q29tbWVudChtZXRlciwgUGVyZm9ybWFuY2UuRVhQTEFJTlNfREVHUkFEQVRJT05fQ09NTUVOVCwgIkZvciB1bmtub3duIHJlYXNvbnMgdGhpcyB0ZXN0IGhhcyBhIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gb24gdGhlIDIgR0h6IExpbnV4IG1hY2hpbmUuICBUaGUgcmVncmVzc2lvbiBpcyBub3QgcmVwcm9kdWNhYmxlIG9uIHNpbWlsYXIgbWFjaGluZXMuICBTZWUgYnVnIDk2NjUyLiIpOwotCQotCS8vIFdhcm0gdXAuCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMjsgc2FtcGxlcysrKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUoYywgU1dULk5PTkUpOwotCQkJfQotCQl9Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JfQotCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTAwOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgaisrKSB7Ci0JCQkJQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCQl9Ci0JCX0KLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXaWRnZXRzKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiQ3JlYXRlIGNvbXBvc2l0ZXMgYW5kIHdpZGdldHMiKTsKLQlpbnQgc2FtcGxlczsKLQotICAgIFBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotICAgIHBlcmZvcm1hbmNlLnRhZ0FzR2xvYmFsU3VtbWFyeShtZXRlciwgIkNyZWF0ZSBjb21wb3NpdGVzIGFuZCB3aWRnZXRzIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgcGVyZm9ybWFuY2Uuc2V0Q29tbWVudChtZXRlciwgUGVyZm9ybWFuY2UuRVhQTEFJTlNfREVHUkFEQVRJT05fQ09NTUVOVCwgIkZvciB1bmtub3duIHJlYXNvbnMgdGhpcyB0ZXN0IGhhcyBhIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gb24gdGhlIDIgR0h6IExpbnV4IG1hY2hpbmUuICBUaGUgcmVncmVzc2lvbiBpcyBub3QgcmVwcm9kdWNhYmxlIG9uIHNpbWlsYXIgbWFjaGluZXMuICBTZWUgYnVnIDk2NjUyLiIpOwotCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQltZXRlci5zdGFydCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7Ci0JCQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuTk9ORSk7Ci0JCQkJU2NhbGUgc2NhbGUgPSBuZXcgU2NhbGUoYywgU1dULk5PTkUpOwotCQkJCVByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhcihjLCBTV1QuTk9ORSk7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IExpc3QoYywgU1dULk5PTkUpOwotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGMsIFNXVC5TSU5HTEUpOwotCQkJCVRleHQgbXVsdGl0ZXh0ID0gbmV3IFRleHQoYywgU1dULk1VTFRJKTsKLQkJCQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlcihjLCBTV1QuTk9ORSk7Ci0JCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoYywgU1dULk5PTkUpOwotCQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGMsIFNXVC5OT05FKTsKLQkJCQlUYWJGb2xkZXIgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihjLCBTV1QuTk9ORSk7Ci0JCQkJR3JvdXAgZyA9IG5ldyBHcm91cChjLCBTV1QuQk9SREVSKTsJCQkJCi0JCQkJQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCQl9Ci0JCX0KLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXlvdXQoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJsYXlvdXQgY29tcG9zaXRlcyIpOwotCWludCBzYW1wbGVzOwotCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlTdHJpbmcgY3VyVGV4dCA9ICIiOwotCQlMYWJlbCBjaGFuZ2VkTGFiZWw7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBzaGVsbDsKLQkJR3JpZERhdGEgZGF0YTsKLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLndpZHRoSGludCA9IGRhdGEuaGVpZ2h0SGludCA9IDI7Ci0JCQljMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSBkYXRhLmhlaWdodEhpbnQgPSAyOwotCQkJYzIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJQ29tcG9zaXRlIGMzID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gZGF0YS5oZWlnaHRIaW50ID0gMjsKLQkJCWMzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjNCA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQljNC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYzQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJcGFyZW50ID0gYzQ7Ci0JCX0KLQkJY2hhbmdlZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJY2hhbmdlZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCQl0cnkgeyBUaHJlYWQuc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJZm9yKGludCBudW1sYXlvdXRzID0gMDsgbnVtbGF5b3V0cyA8IDIwOyBudW1sYXlvdXRzKyspIHsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJCWN1clRleHQgPSAiISEhIiArIGN1clRleHQgKyAiISEhXG4hIjsKLQkJCWNoYW5nZWRMYWJlbC5zZXRUZXh0KGN1clRleHQpOwotCQkJLy93aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJfQotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ltYWdlRHJhd2luZygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkRyYXcgb24gYW4gaW1hZ2UiKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAweGZmLCAwLCAweGZmKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDB4ZmYpOwotCQlpbnQgeDEgPSAwLCB5MSA9IGhlaWdodC8yLCB4MiA9IHdpZHRoLzIsIHkyID0gMDsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQkJZ2MuZHJhd0xpbmUoeDEsIHkxLCB4MiwgeTIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2Muc2V0QmFja2dyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSh4MSwgeTEsIDIwMCwgMjAwKTsKLQkJCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSh4MiwgeTIsIDIwMCwgMjAwLCA1MCwgNTApOwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1QpOwotCQkJZ2MuZHJhd0xpbmUoeDIsIHkxLCB4MSwgeTIpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW5kb3dEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiRHJhdyBvbiBhIHdpbmRvdyIpOwotCWludCBzYW1wbGVzOwotCQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDYW52YXMgYyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCQl0cnkgeyBUaHJlYWQuc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCWludCB4MSA9IDAsIHkxID0gaGVpZ2h0LzIsIHgyID0gd2lkdGgvMiwgeTIgPSAwOwotCQltZXRlci5zdGFydCgpOwotCQlHQyBnYyA9IG5ldyBHQyhjKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDYwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQkJZ2MuZHJhd0xpbmUoeDEsIHkxLCB4MiwgeTIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2Muc2V0QmFja2dyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSh4MSwgeTEsIDIwMCwgMjAwKTsKLQkJCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSh4MiwgeTIsIDIwMCwgMjAwLCA1MCwgNTApOwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1QpOwotCQkJZ2MuZHJhd0xpbmUoeDIsIHkxLCB4MSwgeTIpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdHJpbmdEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KCJEcmF3IHN0cmluZ3MgdXNpbmcgR0MuZHJhd1RleHQiKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAweGZmLCAwLCAweGZmKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDB4ZmYpOwotCQlGb250IGZvbnQxID0gbmV3IEZvbnQoZGlzcGxheSwgIkhlbHZldGljYSIsIDIwLCBTV1QuTk9ORSk7Ci0JCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMTAsIFNXVC5CT0xEKTsKLQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiVGhlIHF1aWNrIFx0YnImb3duIFNXVCBqdW0mcGVkIGZveGlseSBvXG52ZXIgdGhlIGxhenkgZG9nLiI7Ci0JCWludCB4MSA9IDAsIHkxID0gaGVpZ2h0LzIsIHgyID0gd2lkdGgvMiwgeTIgPSAwOwotCQltZXRlci5zdGFydCgpOwotCQlHQyBnYyA9IG5ldyBHQyhjKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDQwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRGb250KChpICYgMSkgPT0gMCA/IGZvbnQxIDogZm9udDIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2MudGV4dEV4dGVudCh0ZXN0U3RyaW5nKTsKLQkJCWdjLmRyYXdUZXh0KHRlc3RTdHJpbmcsIHgyLCB5MSk7Ci0JCQlnYy5kcmF3VGV4dCh0ZXN0U3RyaW5nLCB4MiwgeTEvMiwgU1dULkRSQVdfTU5FTU9OSUMgfCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7Ci0JCQlnYy5kcmF3VGV4dCh0ZXN0U3RyaW5nLCB4MiwgeTIsIHRydWUpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCWZvbnQxLmRpc3Bvc2UoKTsKLQkJZm9udDIuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmFzdFN0cmluZ0RyYXdpbmcoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyV2l0aG91dFN1bW1hcnkoIkRyYXcgc3RyaW5ncyB1c2luZyBHQy5kcmF3U3RyaW5nKCkiKTsKLQlpbnQgc2FtcGxlczsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDYW52YXMgYyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCQl0cnkgeyBUaHJlYWQuc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMjAsIFNXVC5OT05FKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAxMCwgU1dULkJPTEQpOwotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGUgcXVpY2sgYnJvd24gU1dUIGp1bXBlZCBmb3hpbHkgb3ZlciB0aGUgbGF6eSBkb2cuIjsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGMpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldEZvbnQoKGkgJiAxKSA9PSAwID8gZm9udDEgOiBmb250Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5zdHJpbmdFeHRlbnQodGVzdFN0cmluZyk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIHgxLCB5Mik7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIHgxLCB5MSwgdHJ1ZSk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9zaXR1YXRpb25hbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jcmVhdGVDb21wb3NpdGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jcmVhdGVXaWRnZXRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbWFnZURyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbmRvd0RyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0cmluZ0RyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY3JlYXRlQ29tcG9zaXRlcyIpKSB0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NyZWF0ZVdpZGdldHMiKSkgdGVzdF9jcmVhdGVXaWRnZXRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ltYWdlRHJhd2luZyIpKSB0ZXN0X2ltYWdlRHJhd2luZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luZG93RHJhd2luZyIpKSB0ZXN0X3dpbmRvd0RyYXdpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0cmluZ0RyYXdpbmciKSkgdGVzdF9zdHJpbmdEcmF3aW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mYXN0U3RyaW5nRHJhd2luZyIpKSB0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzdkNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGI1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2VhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkN2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90cmFuc3BhcmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjVmMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90cmFuc3BhcmVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBlOTk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHRlc3RzLmphcj1KVW5pdCBUZXN0cy8KLQotYmluLmluY2x1ZGVzPSouamFyLHBsdWdpbi54bWwsdGVzdC54bWwsYWJvdXQuaHRtbCxwbHVnaW4ucHJvcGVydGllcyxkYXRhLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXIzLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWNhMGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXIzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxodG1sPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPndpbmRvdy5vcGVuKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iLCAiRGlhbG9nIik8L3NjcmlwdD4KLTxib2R5PgotVGhpcyB0ZXN0IHVzZXMgamF2YXNjcmlwdCB0byBvcGVuIGEgbmV3IHdpbmRvdy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U0YmY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQl3ID0gd2luZG93Lm9wZW4oImJyb3dzZXI0YS5odG1sIiwgIkRpYWxvZyIpOwotCXNldFRpbWVvdXQoIncuY2xvc2UoKSIsIDUwMDApOwotPC9zY3JpcHQ+Ci08Ym9keT4KLTxwPlRoaXMgdGVzdCB1c2VzIGphdmFzY3JpcHQuCi08cD5JdCBvcGVucyBhIG5ldyB3aW5kb3cuIFNldHMgYSB0aW1lci4gVGhlbiBjbG9zZSB0aGUgbmV3IHdpbmRvdyB3aGVuIHRoZSB0aW1lciBleHBpcmVzLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjRhLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzNTg1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIgotIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgPHRpdGxlPnNpbXBsZSBwYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyMDQsIDApOyBjb2xvcjogcmdiKDAsIDAsIDApOyIKLSBsaW5rPSIjMDAwMGVlIiBhbGluaz0iIzAwMDBlZSIgdmxpbms9IiM1NTFhOGIiPgotPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGJpZz48YmlnPjxiaWc+PGJpZz48YmlnPjxiaWc+PHNwYW4KLSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5UaGlzIGlzIGEgc2ltcGxlIHBhZ2U8L3NwYW4+PC9iaWc+PC9iaWc+PC9iaWc+PC9iaWc+PC9iaWc+PC9iaWc+PGJyPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNS5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1YmZjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPGh0bWw+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JdmFyIHdpbjsKLQlmdW5jdGlvbiB0ZXN0T3BlbigpIHsKLQkJd2luID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdzwvaDI+IicsICIiLCAibGVmdD0xMCx0b3A9MjAwLGhlaWdodD0xMDAsd2lkdGg9MzAwIik7Ci0JfQotCWZ1bmN0aW9uIHRlc3RSZXNpemVUbygpIHsKLQkJd2luLnJlc2l6ZVRvKDYwMCw4MDApOwotCX0KLQlmdW5jdGlvbiB0ZXN0TW92ZVRvKCkgewotCQl3aW4ubW92ZVRvKDIwMCwxMDApOwotCX0KLQlmdW5jdGlvbiB0ZXN0TW92ZUJ5KCkgewotCQl3aW4ubW92ZUJ5KDIsMik7Ci0JfQotCWZ1bmN0aW9uIHRlc3RTY3JvbGxCeSgpIHsKLQkJd2luLnNjcm9sbEJ5KDEsMjApOwotCX0KLQlmdW5jdGlvbiB0ZXN0UmVzaXplQnkoKSB7Ci0JCXdpbi5yZXNpemVCeSgyLDMpOwotCX0KLQlmdW5jdGlvbiB0ZXN0Q2xvc2UoKSB7Ci0JCXdpbi5jbG9zZSgpOwotCX0KLQotCXdpbjEgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlNpbXBsZSBOZXcgV2luZG93IDE8L2gyPjxwPmJvdW5kczogbGVmdD0xMCx0b3A9MjAwLGhlaWdodD0xMDAsd2lkdGg9MzAwPHA+IicsICIiLCAibGVmdD0xMCx0b3A9MjAwLGhlaWdodD0xMDAsd2lkdGg9MzAwIik7Ci0Jd2luMiA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+U2ltcGxlIE5ldyBXaW5kb3cgMjwvaDI+PHA+Ym91bmRzOiBsZWZ0PTEwLHRvcD0yMDA8cD4iJywgIiIsICJsZWZ0PTEwLHRvcD0yMDAiKTsKLQl3aW4zID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdyAzPC9oMj48cD5ib3VuZHM6IGhlaWdodD0xMDAsd2lkdGg9MzAwPHA+IicsICIiLCAiaGVpZ2h0PTEwMCx3aWR0aD0zMDAiKTsKLQl3aW40ID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdyA0PC9oMj48cD5ib3VuZHM6IG5vdCBzcGVjaWZpZWQ8cD4iJywgIiIsICIiKTsKLQkKLQlzZXRUaW1lb3V0KCJ3aW4xLmNsb3NlKCk7d2luMi5jbG9zZSgpO3dpbjMuY2xvc2UoKTt3aW40LmNsb3NlKCkiLCA1MDAwKTsKLQkKLTwvc2NyaXB0PgotCi08Zm9ybT4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0id2luZG93Lm9wZW4iIG9uQ2xpY2s9InRlc3RPcGVuKCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJyZXNpemVUbyIgb25DbGljaz0idGVzdFJlc2l6ZVRvKCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJtb3ZlVG8iIG9uQ2xpY2s9InRlc3RNb3ZlVG8oKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9Im1vdmVCeSIgb25DbGljaz0idGVzdE1vdmVCeSgpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0ic2Nyb2xsQnkiIG9uQ2xpY2s9InRlc3RTY3JvbGxCeSgpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0icmVzaXplQnkiIG9uQ2xpY2s9InRlc3RSZXNpemVCeSgpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0iY2xvc2UiIG9uQ2xpY2s9InRlc3RDbG9zZSgpIj4KLTwvRk9STT4KLTxib2R5PgotPHA+VGhpcyB0ZXN0IHVzZXMgamF2YXNjcmlwdC4KLTxwPkl0IG9wZW5zIGEgbmV3IHdpbmRvdy4gU2V0cyBhIHRpbWVyLiBUaGVuIGNsb3NlIHRoZSBuZXcgd2luZG93IHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNi5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyNzUwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHRtbD4KLTx0aXRsZT5UaGlzIGlzIGEgdGVzdCB0aXRsZSB0aGF0IG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQgd2hlbiB0aGF0IHBhZ2UgaXMgbG9hZGVkPC90aXRsZT4KLTxib2R5PgotVGhpcyB0ZXN0IGlzIHVzZWQgdG8gYXV0b21hdGljYWxseSBjaGVjayB0aGUgY29udGVudCBvZiB0aGUgdGl0bGUgdGFnLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI3Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU3ZDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08aHRtbD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLXdpbjEgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlRFU1Qgd2luZG93Lm9wZW48L2gyPjxwPmxlZnQ9MCx0b3A9MCxoZWlnaHQ9MTAwLHdpZHRoPTIwMDwvcD4iJywgIiIsICJsZWZ0PTAsdG9wPTAsaGVpZ2h0PTIwMCx3aWR0aD0zMDAiKTsJCi13aW4yID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5URVNUIHdpbmRvdy5vcGVuPC9oMj48cD5tZW51YmFyPW5vLHN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTMwMSx0b3A9MCxoZWlnaHQ9NjAwLHdpZHRoPTIwMDwvcD4iJywgIiIsICJtZW51YmFyPW5vLHN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTMwMSx0b3A9MCxoZWlnaHQ9NjAwLHdpZHRoPTIwMCIpOwkKLXdpbjMgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlRFU1Qgd2luZG93Lm9wZW48L2gyPjxwPnN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPXllcyxyZXNpemFibGU9eWVzLGxlZnQ9MCx0b3A9MjAxLGhlaWdodD00MDAsd2lkdGg9MzAwPC9wPiInLCAiIiwgInN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPXllcyxyZXNpemFibGU9eWVzLGxlZnQ9MCx0b3A9MjAxLGhlaWdodD00MDAsd2lkdGg9MzAwIik7CQotd2luNCA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+VEVTVCB3aW5kb3cub3BlbjwvaDI+PHA+bWVudWJhcj15ZXMsc3RhdHVzPXllcyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTAsdG9wPTYwMSxoZWlnaHQ9MjAwLHdpZHRoPTUwMDwvcD4iJywgIiIsICJtZW51YmFyPXllcyxzdGF0dXM9eWVzLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8scmVzaXphYmxlPW5vLGxlZnQ9MCx0b3A9NjAxLGhlaWdodD0yMDAsd2lkdGg9NTAwIik7CQotPC9zY3JpcHQ+Ci08Ym9keT4KLTxwPlRoaXMgdGVzdCB1c2VzIGphdmFzY3JpcHQuCi08cD5JdCBvcGVucyBhIHNlcmllcyBvZiB3aW5kb3dzIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMuCi08cD5UaGUgYnV0dG9ucyBiZWxvdyBjYW4gYmUgdXNlZCBmb3IgbWFudWFsbHkgdGVzdGluZyB2YXJpb3VzIHR5cGVzIG9mIGphdmFzY3JpcHQgd2luZG93cy4KLTxmb3JtPgotPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9ImJyaW5nIGFsZXJ0KG1lc3NhZ2UpIiBvbkNsaWNrPSJhbGVydCgnbWVzc2FnZScpIj4KLTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJ3aW5kb3cucHJpbnQiIG9uQ2xpY2s9IndpbmRvdy5wcmludCgpIj4KLTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJjb25maXJtIiBvbkNsaWNrPSJpZiAoY29uZmlybSgnUHJlc3MgT2sgb3IgQ2FuY2VsIHRvIGNvbmZpcm0nKSkge2FsZXJ0KCdZb3UgcHJlc3NlZCBPSycpO30gZWxzZSB7YWxlcnQoJ1lvdSBwcmVzc2VkIENhbmNlbCcpO30iPgotPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI5Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyOS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmEwNmVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+SGVsbG8gVGl0bGU8L3RpdGxlPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gY2hhbmdlU3RhdHVzKHR4dCkgewotCWRvY3VtZW50LmJnQ29sb3IgPSAieWVsbG93IjsKLQl3aW5kb3cuc3RhdHVzID0gdHh0OwotfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLUhlbGxvIGJvZHkKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWQzYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRjOGUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuZ2lmCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0lGODdhEgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDE5ZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi3/2P8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg2MGFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdEJhZEJpdERlcHRoLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2NiOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdEJhZEJpdERlcHRoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2VtcHR5LnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2VtcHR5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9lbXB0eS50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDM1MWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE3Yzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MDE3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjJkYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTEyMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg4NmJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmODg4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4ucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzZkNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3ZDUwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZThiNWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNlYTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ZDdlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdHJhbnNwYXJlbnQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdHJhbnNwYXJlbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI1ZjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RyYW5zcGFyZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYThkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxZTg4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIEZpbGUgd3JpdHRlbiBieSBQREUgMS4wIC0tPgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cyIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIj4KLQotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UiLz4KLTwvcmVxdWlyZXM+Ci0KLTxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9InN3dHRlc3RzLmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQyZWRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIG1vcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIC0tPgotICA8IS0tIG9yZy5lY2xpcHNlLnVpIHBsdWdpbiwgZm9yIHRlc3RpbmcuIC0tPgotCi0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7b3JnLmVjbGlwc2Uuc3d0LnRlc3RzfSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSIgdW5sZXNzPSJwZXJmb3JtYW5jZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRhdGEiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vc3d0X3NuaWZmX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2xvY2F0aW9uMX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPCEtLSBSdW4gYWxsIFNXVCB0ZXN0cyBvbiBXaW5kb3dzLCBhbmQgZWl0aGVyIENhcmJvbiB0ZXN0cyBvciBHdGsgdGVzdHMgb3RoZXJ3aXNlLiAtLT4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxHdGtUZXN0cyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7b3N9IiBhcmcyPSJsaW51eCIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNsYXNzLXRlc3RzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LkFsbENhcmJvblRlc3RzIj4KLSAgICAgIDxlcXVhbHMgYXJnMT0iJHtvc30iIGFyZzI9Im1hY29zeCIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNsYXNzLXRlc3RzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LkFsbFRlc3RzIj4KLSAgICAgIDxlcXVhbHMgYXJnMT0iJHtvc30iIGFyZzI9IndpbjMyIi8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2RhdGF9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9IiR7Y2xhc3MtdGVzdHN9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIHRoZSB0ZXN0cyAtLT4KLSAgPCEtLSBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPiAKLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InN3dC1wZXJmb3JtYW5jZS1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vc3d0X3BlcmZvcm1hbmNlX2ZvbGRlciIgLz4gCi0gICAgPGRlbGV0ZSBkaXI9IiR7c3d0LXBlcmZvcm1hbmNlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIiAvPiAKLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aW1lb3V0IiB2YWx1ZT0iMTQ0MDAwMDAiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c3d0LXBlcmZvcm1hbmNlLWZvbGRlcn0iIC8+IAotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iIC8+IAotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RzIiAvPiAKLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZS1zdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIgLz4gCi0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+IAotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gYWZ0ZXIgYWxsIC0tPgotICA8IS0tIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLSAgCi08L3Byb2plY3Q+Cg==